table des raccourcis clavier?

18

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 bindkeyje 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 ^[[Adans bindkey-at-CLI parler est la même chose que \e[Adans 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 scancodeprogramme - 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.

Ray Andrews
la source
3
Appuyez sur Ctrl + V (ou ce qui est stty -adit lnext), puis sur la touche.
Mikel

Réponses:

16

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 \eaka \033aka 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 vers echoou print(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.

^[OFet ^[[F(ie \eOFet \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) pour end-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 terminfotableau 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.

% print -lr ${(q)terminfo[kend]}
$'\033'OF

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.

Gilles 'SO- arrête d'être méchant'
la source
11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(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.

COMBINAISONS UTILISANT JUSTE LES TOUCHES «GRISES» :

touche [ F1 ] = '^ [[[ touche A ” [ F2 ] = ' ^ [[ touche [ B ' [ F3 ] = '^ [[[C' touche [ F4 ] = '^ [[[D' clé [ F5 ] = '^ [[[E' key [ F6 ] = '^ [[17 ~' key [ F7 ] = '^ [[18 ~' key [ F8 ] = '^ [[19 ~' key [ F9 ] = '^ [[20 ~' touche [ F10 ] = '^ [[21 ~' touche [ F11 ] = '^ [[23 ~' touche [ F12 ] = '^ [[24 ~'

touche [ Maj - F1 ] = '^ [[25 ~' touche [ Maj - F2 ] = '^ [[26 ~' touche [ Maj - F3 ] = '^ [[28 ~' touche [ Maj - F4 ] = ' ^ [[29 ~ ' touche [ Maj - F5 ] = ' ^ [[31 ~ ' touche [ Maj - F6 ] = ' ^ [[32 ~ ' touche [ Maj - F7 ] = '^ [[33 ~' touche [ Maj - F8 ] = '^ [[34 ~'

touche [ Insérer ] = '^ [[2 ~' touche [ Supprimer ] = '^ [[3 ~' touche [ Accueil ] = '^ [[1 ~' touche [ Fin ] = '^ [[4 ~' touche [ PageUp ] = '^ [[5 ~' key [ PageDown ] = '^ [[6 ~' key [ Up ] = '^ [[A' key [ Down ] = '^ [[B' key [ Right ] = '^[[C' key[Left] = '^[[D'

clé [ Bksp ] = '^?' key[Bksp-Alt] = '^[^?' key[Bksp-Ctrl] = '^H' console only.

key[Esc] = '^[' key[Esc-Alt] = '^[^['

key[Enter] = '^M' key[Enter-Alt] = '^[^M'

touche [ Tab ] = '^I' or '\t' unique form! can be bound, but does not 'showkey -a'. key[Tab-Alt] = '^[\t'

COMBINATIONS USING THE WHITE KEYS:

Anomalies : 'Ctrl +' ' == ' Ctrl + 2 ' , et ' Ctrl + 1 ' == ' 1 ' in xterm. Several 'Ctrl+number' combinations are void at console, but return codes in xterm. OTOH Ctrl+Bksp returns '^H' at console, but is identical to plain 'Bksp' in xterm. There are no doubt more of these little glitches however, in the main:

White key codes are easy to undertand, each of these 'normal' printing keys has six forms:

A = 'a' ( duhhh ) A - Shift = 'A' ( qui aurait deviné ?) A - Alt = '^ [a' A - Ctrl = '^ A' A - Alt - Ctrl = '^ [^ A « A - Alt -
Shift = '^[A' A-Ctrl-Shift = '^A' (Shift has no effect)

Don't forget that:

/-Shift-Ctrl = Bksp = '^?' [-Ctrl = Esc = '^[' M-Ctrl = Enter = '^M'

And, we can 'stack' keybindings:

bindkey -s '^Xm' "My mistress\' eyes are nothing like the sun."

... Bind 'Ctrl-X' followed by 'm' to a nice line of poetry.

And we can flirt with madness:

bindkey -s '^Pletmenot' 'Let me not, to the marriage of true minds'

... but you hafta start something like that with a 'modifier' character. Try it, if you like keyboard shortcuts, you can really go to town.

QUESTIONS:

Where is it written that 'Ctrl-Bksp' means one thing at console, another thing in xterm?

Are these assignments changable?

Who designed all this, and what were they thinking at the time?

Pourquoi est-il « Alt - Fonction » de changer de terminal sur un terminal, mais « Alt-Ctrl-Function' to change to a terminal from GUI?

Comment / où est défini ' Alt - Ctrl - Supprimer '?

enter code here
Ray Andrews
la source
j'ai presque envie d'envoyer un email ...
mikeserv
Par tous les moyens, mike: [email protected]
Ray Andrews
ce n'était qu'une blague, ray - tu ne vois pas souvent de chiennes, de reproches, de plaintes? Envoyez-moi un e-mail ici. Je l'ai apprécié, c'est tout. de toute façon, en aparté, sur le zshsujet des touches, vous voudrez peut-être essayer la zkbdfonction qui devrait vous faire enregistrer un mappage de clés complet dans un fichier. Je crois qu'il est autoloadcapable, mais sinon, cherchez-le /usr/share/zsh/functions/Misc. Soit dit en passant, il y a d'autres trucs bizarres aussi tetris.
mikeserv
C'est l'un des outils que j'ai utilisés pour fabriquer ma table, mais comment faire pour que tout se défasse à la fois?
Ray Andrews
intéressant - je suppose que non. Je ne l'ai jamais exécuté auparavant - je n'ai lu que son fichier source - et c'était il y a quelques mois. Je suppose qu'il fait une série de tests d'entrée pour générer son fichier de sauvegarde. mais il enregistre tout dans un fichier, non?
mikeserv
6

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:

$ showkey -a

Press any keys - Ctrl-D will terminate this program

a    97 0141 0x61
b    98 0142 0x62
c    99 0143 0x63
d   100 0144 0x64
e   101 0145 0x65
f   102 0146 0x66
g   103 0147 0x67

De la page de manuel concernant -a:

   When  in  `ascii' dump mode, showkey prints to the standard output the 
   decimal, octal, and hexadecimal value(s) of the key pressed,
   according to he present keymap.

Vous pouvez utiliser xmodmappour obtenir certains mappages:

$ xmodmap
xmodmap:  up to 4 keys per modifier, (keycodes in parentheses):

shift       Shift_L (0x32),  Shift_R (0x3e)
lock        Caps_Lock (0x42)
control     Control_L (0x25),  Control_R (0x69)
mod1        Alt_L (0x40),  Alt_R (0x6c),  Meta_L (0xcd)
mod2        Num_Lock (0x4d)
mod3      
mod4        Super_L (0x85),  Super_R (0x86),  Super_L (0xce),  Hyper_L (0xcf)
mod5        ISO_Level3_Shift (0x5c),  Mode_switch (0xcb)

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

slm
la source
1
Bien que cela soit vrai, cela n'a pas d'importance pour comprendre les raccourcis clavier dans un terminal.
Gilles 'SO- arrête d'être méchant'
@ Gilles - Ouais, je me suis dit que j'essayais seulement de fournir des pistes, maintenant que j'ai lu votre intelligence artificielle, comprenez comment cette interface fonctionne, merci!
slm
"showkey -a" n'est cependant pas hors de propos.
skagedal
2

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.

Il existe un infocmputilitaire pour décrire les terminfoentrées. Ceci est particulièrement utile avec l' -Loption aka noms de variables C longs :

$ infocmp -cL
...
key_home= '\EOH'.
key_up= '\EOA'.
key_down= '\EOB'.
key_right= '\EOC'.
key_left= '\EOD'.
key_backspace= '^H'.
key_end= '\EOF'.
...

En comparant cela au bindkey sortie

"^[OH" beginning-of-line
"^[OA" up-line-or-history
"^[OB" down-line-or-history
"^[OC" forward-char
"^[OD" backward-char
"^H" backward-delete-char
"^[OE" end-of-line

on 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 infocmppremière bindkey.

En cas de doute sur ce que signifie une chaîne particulière (telle qu'imprimée en infocmpsortie), on peut toujours regarder dans le terminfomanuel où la description complète est donnée, par exemple

key_send  ->  shifted end key
key_sic   ->  shifted insert-character key
key_dc    ->  delete-character key
jimmij
la source
0

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, mon Ctrl+ a du code ^[Oa.

poulix
la source