Avons-nous un tableau de raccourcis clavier qui traduit toutes les différentes façons de faire référence à une pression de touche? j'utilisezsh
, mais je suppose que s'il y avait une telle table, cela fonctionnerait pour n'importe quel shell.
La raison pour laquelle je demande, c'est que je voudrais attribuer des raccourcis clavier et je n'ai aucun moyen de savoir comment y faire référence (sauf si je vais en voler un qui est déjà défini).
Par exemple, dans «zbindkey», nous avons ce genre de chose:
[[ "$terminfo[kend]" == " O"* ]] && \
bindkey -M emacs "${terminfo[kend]/O/[}" end-of-line
... et je peux deviner que "kend" signifie que cela fait référence à la Endclé.
Vérification croisée avec bindkey
je vois ces lignes:
"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line
... donc j'espère que l'une de ces lignes fait référence à la End clé. Laquelle?
Nous l'avons également dans le fichier "bindkey":
bindkey "\e[A" history-beginning-search-backward
Maintenant, je sais que c'est la Up Arrowclé, mais comment pourrais-je savoir si je ne savais pas?
$ bindkey (at CLI)
... nous donne une langue différente pour la même clé:
"^[[A" history-beginning-search-backward
... mais au moins maintenant je sais que ^[[A
dans bindkey-at-CLI parler est la même chose que \e[A
dans bindkey-in-zbindkey speak. C'est facile. Autrefois sous DOS, Up Arrow c'était0;72
- vous pouviez trouver le code de numérisation de chaque frappe légale et il n'y avait qu'une seule langue.
Y a-t-il une table? Ou une autre manière de pouvoir choisir une frappe et savoir comment s'y référer dans terminfo[]
... dans "bindkey-in-zbindkey" ... dans "bindkey-at-CLI" et / ou dans n'importe quelle autre langue arrive-t-il?
Encore une fois, sous DOS, il y avait le scancode
programme - tapez une frappe, et vous avez obtenu le scancode. C'était d'une simplicité pécheresse.
D'après les réponses, je suppose qu'il n'y a aucun moyen d'imprimer un tableau de toutes les reliures possibles? Quoi qu'il en soit, "bindkey" fait presque ce que je veux:
pts/2 HP-y5-10-Debian1 root /aWorking/Docs $ bindkey -L
bindkey "^@" set-mark-command
bindkey "^A" beginning-of-line
bindkey "^B" backward-char
bindkey "^D" delete-char-or-list
bindkey "^E" end-of-line
...
au moins, je peux voir toutes les liaisons existantes, même si ce n'est pas toutes les liaisons possibles . Maintenant, s'il y avait juste un moyen de traduire les glyphes clés en termes «normaux»:
bindkey "Home" beginning-of-line
... alors je serais heureux.
la source
stty -a
ditlnext
), puis sur la touche.Réponses:
L'interface entre une application de terminal et un émulateur de terminal (ou terminal matériel) transmet des octets, pas des clés. Les touches de fonction telles que les touches de déplacement du curseur sont traduites en séquences d'échappement (en commençant par le caractère d'échappement ESC
\e
aka\033
aka 0x1b aka ^ [). Il en va de même pour les combinaisons d'une touche de fonction ou d'une touche de caractère avec des modificateurs, bien que tous les terminaux n'envoient pas des séquences différentes pour toutes les différentes combinaisons de modificateurs. Quelques touches sont envoyées encodées en caractères de contrôle (par exemple Tab→ Ctrl-I =\t
=\011
).Comme vous pouvez le voir, il existe de nombreuses façons de décrire les caractères de contrôle. Certains ont un nom, correspondant à leur fonction traditionnelle (par exemple Tab, Saut de ligne); ceux-ci ont tendance à avoir une combinaison barre oblique inverse + lettre que vous pouvez utiliser à l'intérieur
$'…'
ou dans un argument versecho
ouprint
(ainsi que dans les expressions régulières sed et dans les littéraux de chaîne dans awk, C et d'autres langues (notez que différents outils peuvent avoir un ensemble légèrement différent) des séquences d'échappement)). Vous pouvez également utiliser la barre oblique inverse + octale (par exemple\033
) dans ces contextes.Il existe une certaine variation quant aux terminaux de séquence d'échappement envoyés pour chaque touche. Heureusement, il n'y a presque pas de chevauchement: il y a très peu de séquences de caractères qui signifient différentes touches sur différents terminaux. Le problème principal est le caractère 127 =
\177
= 0x7f qui est le plus souvent de Backspacenos jours mais parfois Delete.^[OF
et^[[F
(ie\eOF
et\e[F
) sont les deux séquences d'échappement communes envoyées par End.^E
(ie\005
) est la liaison de clé Emacs ( Ctrl+ E) pourend-of-line
.Pour voir ce que votre émulateur de terminal envoie pour une touche ou une combinaison de touches particulière, appuyez sur Ctrl+ V, puis sur la touche en question. Cela insère littéralement le premier caractère de la séquence d'échappement. Les séquences d'échappement se composent normalement d'un caractère d'échappement suivi de caractères imprimables, de sorte que le reste de la séquence d'échappement est également inséré littéralement.
La base de données Terminfo contient les séquences d'échappement de certaines clés. Vous trouverez la liste des fonctionnalités Terminfo dans la page de manuel terminfo (5) de votre système. Dans zsh, vous pouvez répertorier les valeurs dans la base de données via le
terminfo
tableau associatif. Attention lors de l'impression de valeurs contenant des séquences d'échappement qui sont également interprétées par le terminal lors de leur affichage, imprimez-les donc sous une forme entre guillemets.Voir Comment fonctionnent la saisie au clavier et la sortie du texte? pour un aperçu plus complet de ce qui se passe lorsque vous appuyez sur une touche. Il n'est pas nécessaire de comprendre les raccourcis clavier dans zsh.
la source
(commentaires, améliorations, dénonciations amères bienvenues: rayandrews à eastlink dot ca)
Combinaisons de touches «disponibles» sur un clavier PC «101» connecté à un PC exécutant «zsh» sous xfce4 sous Debian Linux (je ne sais pas qui est «en charge»). Toutes les combinaisons qui produisent des codes en double dans les touches «grises» ont été supprimées, à l'exception de l'avatar le plus simple qui est affiché. Remarque: certaines combinaisons / touches grises ont des doublons '^ lettre', comme 'Enter' == '^ M', ceux-ci n'ont pas été supprimés. D'autres combinaisons actives n'étaient pas «disponibles» car utilisées par le système, même à partir de la console, par exemple. Les touches 'Alt + Fonction' commutent les bornes. Peut-être que la touche 'Meta' ferait plus, mais c'est avec un 101 KB. Il est intéressant de noter qu'il existe beaucoup plus de combinaisons disponibles sous DOS, telles que Ctrl + Fonction - toutes disponibles sous DOS, aucune d'entre elles n'est disponible sous Linux, semble-t-il. Aucune des combinaisons de touches triples (par exemple, «Ctrl + Alt + Haut») n'a produit de codes uniques dans les touches grises, mais elles produisent des codes dans les touches blanches. Anomalies intéressantes: '^ [[22' '^ [[27' '^ [[30' manquent ”, vous vous demandez pourquoi ces chiffres ont été sautés. (C'est-à-dire que vous pourriez vous attendre à ce que 'F11' soit '^ [[22' pas '^ [[23'.)
Les codes de clé affichés sont tels qu'ils seraient sortis par «showkeys -a» ou «bindkey» sur CLI. Cependant, pour une raison quelconque, si vous utilisez «bindkey» dans un script (comme dans «.zshrc»), «^ [» doit être remplacé par «\ e», donc au CLI:
bindkey -s '^ [[[A' 'ma-commande \ Cm'
... liez 'F1' à 'ma-commande' et exécutez-le (le '\ Cm' simule la touche 'Entrée').
dans '.zshrc':
bindkey -s '\ e [25' 'my-command1; ma commande2 \ Cm '
... liez 'Shift-F1' à 'my-command1' suivi de 'my-command2' et exécutez les deux.
la source
zsh
sujet des touches, vous voudrez peut-être essayer lazkbd
fonction qui devrait vous faire enregistrer un mappage de clés complet dans un fichier. Je crois qu'il estautoload
capable, mais sinon, cherchez-le/usr/share/zsh/functions/Misc
. Soit dit en passant, il y a d'autres trucs bizarres aussitetris
.Il existe de nombreux outils à votre disposition dans Unix / Linux, donc cela peut être un peu déroutant et écrasant. Pour commencer, j'utiliserais
showkey
:De la page de manuel concernant
-a
:Vous pouvez utiliser
xmodmap
pour obtenir certains mappages:Ce qui précède n'est pas toutes les pièces du puzzle, mais est quelques informations supplémentaires qui pourraient vous aider à trouver la carte ultime entre les raccourcis clavier et les scancodes. Il y a plus d'informations dans ce Q&R U&L intitulé: Mappages de clés sous Linux .
Les références
la source
Il existe un
infocmp
utilitaire pour décrire lesterminfo
entrées. Ceci est particulièrement utile avec l'-L
option aka noms de variables C longs :En comparant cela au
bindkey
sortieon peut voir qu'ils utilisent une notation différente pour s'échapper , mais en gros, il est relativement facile d'écrire un script qui relie la deuxième colonne de la
infocmp
premièrebindkey
.En cas de doute sur ce que signifie une chaîne particulière (telle qu'imprimée en
infocmp
sortie), on peut toujours regarder dans leterminfo
manuel où la description complète est donnée, par exemplela source
J'utilise l'émulateur de terminal URxvt. Il y a une clé utile contraignant pour montrer ces codes:
Ctrl+V
. Après l'avoir appuyé, entrez la séquence de touches souhaitée et il imprimera son code. Par exemple, monCtrl
+↑
a du code^[Oa
.la source