tabla de combinaciones de teclas?

18

¿Tenemos una tabla de enlaces de teclas que traduce todas las diversas formas de referirse a una pulsación de tecla? Estoy usando zsh, pero supongo que si hubiera una tabla así, funcionaría para cualquier shell.

La razón por la que pregunto es que me gustaría asignar algunas combinaciones de teclas y no tengo forma de saber cómo referirme a ellas (a menos que vaya a robar una que ya esté definida).

Por ejemplo, en 'zbindkey' tenemos este tipo de cosas:

[[ "$terminfo[kend]"  == " O"* ]] && \
    bindkey -M emacs "${terminfo[kend]/O/[}"  end-of-line

... y puedo adivinar que "kend" significa que esto se refiere a la Endclave.

Verificación cruzada con bindkeyveo estas líneas:

"^E" end-of-line
"^[OF" end-of-line
"^[[F" end-of-line

... así que confío en que una de esas líneas se refiere a la Endclave. ¿Cúal?

También tenemos esto en el archivo "bindkey":

bindkey "\e[A" history-beginning-search-backward

Ahora, sé que esa es la Up Arrowclave, pero ¿cómo podría averiguarlo si no lo supiera?

$ bindkey (at CLI)

... nos da un idioma diferente para la misma clave:

"^[[A" history-beginning-search-backward

... pero al menos ahora sé que ^[[Aen bindkey-at-CLI speak es lo mismo que \e[Aen bindkey-in-zbindkey speak. Eso es fácil. En los viejos tiempos en DOS, el Up Arrow era 0;72: podía encontrar el código de escaneo de cada pulsación de tecla legal y solo había un idioma.

¿Hay una mesa? O alguna otra forma de poder elegir una pulsación de tecla y saber cómo referirse a ella enterminfo[] ... en "bindkey-in-zbindkey" ... en "bindkey-at-CLI" y / o en cualquier otro idioma que pueda ¿resultando ser?

Nuevamente, en DOS estaba el scancodeprograma: escriba una pulsación de tecla y obtendrá el código de escaneo. Fue pecaminosamente fácil.


¿De las respuestas, supongo que no hay forma de imprimir una tabla de todos los enlaces posibles? De todos modos 'bindkey' hace casi lo que quiero:

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

al menos puedo ver todos los enlaces existentes, incluso si no todos los enlaces posibles . Ahora, si solo hubiera alguna forma de traducir los glifos clave en términos 'regulares':

bindkey "Home" beginning-of-line

... entonces sería feliz.

Ray Andrews
fuente
3
Presione Ctrl + V (o lo stty -aque sea ​​que diga lnext) y luego la tecla.
Mikel

Respuestas:

16

La interfaz entre una aplicación de terminal y un emulador de terminal (o terminal de hardware) transmite bytes, no claves. Las teclas de función, como las teclas de movimiento del cursor, se traducen en secuencias de escape (comenzando con el carácter de escape ESC aka \eaka \033aka 0x1b aka ^ [). Lo mismo ocurre con las combinaciones de una tecla de función o una tecla de caracteres con modificadores, aunque no todos los terminales envían secuencias diferentes para todas las combinaciones de modificadores diferentes. Algunas teclas se envían codificadas como caracteres de control (por ejemplo, Tab→ Ctrl-I = \t= \011).

Como puede ver, hay muchas formas de describir los caracteres de control. Algunos tienen un nombre, correspondiente a su función tradicional (por ejemplo, Tabulación, Salto de línea); estos tienden a tener una combinación de barra invertida + letra que puede usar dentro $'…'o en un argumento para echoo print(así como en expresiones regulares sed y en literales de cadena en awk, C y otros lenguajes (tenga en cuenta que las diferentes herramientas pueden tener un conjunto ligeramente diferente) de secuencias de escape)). También puede usar la barra diagonal inversa + octal (por ejemplo \033) en estos contextos.

Existe alguna variación en cuanto a qué terminales de secuencia de escape envían para cada tecla. Afortunadamente, casi no hay superposición: hay muy pocas secuencias de caracteres que significan diferentes teclas en diferentes terminales. El principal problema es el carácter 127 = \177= 0x7f, que es más frecuente Backspacehoy en día, pero a veces Delete.

^[OFy ^[[F(es decir, \eOFy \e[F) son las dos secuencias de escape comunes enviadas por End. ^E(es decir, \005es el enlace de tecla Emacs ( Ctrl+ E) para end-of-line.

Para ver qué envía su emulador de terminal para una tecla o combinación de teclas en particular, presione Ctrl+ Vy luego la tecla en cuestión. Esto inserta el primer carácter de la secuencia de escape literalmente. Las secuencias de escape normalmente consisten en un carácter de escape seguido de caracteres imprimibles, por lo que el resto de la secuencia de escape también se inserta literalmente.

La base de datos Terminfo contiene las secuencias de escape para algunas claves. Encontrará la lista de capacidades de Terminfo en la página de comando man terminfo (5) de su sistema. En zsh, puede enumerar los valores en la base de datos a través de la terminfomatriz asociativa. Tenga cuidado al imprimir valores que contienen secuencias de escape que también son interpretadas por el terminal cuando se muestran, así que imprímalas en forma citada.

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

Consulte ¿Cómo funcionan la entrada del teclado y la salida de texto? para obtener una descripción más completa de lo que sucede cuando presiona una tecla. No es necesario comprender las asociaciones de teclas en zsh.

Gilles 'SO- deja de ser malvado'
fuente
11
    BEGINNER'S GUIDE TO ZSH KEYBOARD ASSIGNMENTS, AKA 'KEYBOARD BINDINGS'.

(comentarios, mejoras, amargas denuncias bienvenidas: rayandrews en eastlink dot ca)

Combinaciones de teclas 'disponibles' en un teclado de PC '101' conectado a una PC que ejecuta 'zsh' en xfce4 en Debian Linux (no sé quién está 'a cargo'). Se han eliminado todas las combinaciones que producen códigos duplicados dentro de las teclas 'grises', excepto el avatar más simple que se muestra. Tenga en cuenta que algunas teclas / combinaciones grises tienen duplicados '^ letra', como 'Enter' == '^ M', estos no se han eliminado. Otras combinaciones activas no estaban 'disponibles' desde que fueron utilizadas por el sistema, incluso desde la consola, por ejemplo. Las teclas 'Alt + Función' cambian los terminales. Quizás la tecla 'Meta' haría más, pero esto es con 101 KB. Es interesante que haya muchas más combinaciones disponibles en DOS, como Ctrl + Función, todas disponibles en DOS, ninguna de ellas disponible en Linux, por lo que parece. Ninguna de las combinaciones de teclas triples (por ejemplo, 'Ctrl + Alt + Arriba') produjo códigos únicos dentro de las teclas grises, pero sí producen códigos en las teclas blancas. Anomalías interesantes: '^ [[22' '^ [[27' '^ [[30' faltan ', debe preguntarse por qué se omitieron esos números. (Lo que quiere decir que puede esperar que 'F11' sea '^ [[22' no '^ [[23'.)

Los códigos de tecla que se muestran son los que mostrarían 'showkeys -a' o 'bindkey' en la CLI. Sin embargo, por alguna razón si usa 'bindkey' dentro de un script (como en '.zshrc') '^ [' debe reemplazarse con '\ e', por lo tanto, en CLI:

bindkey -s '^ [[[[A' 'mi-comando \ Cm'

... enlace 'F1' a 'my-command' y ejecútelo ('\ Cm' simula la tecla 'Enter').

en '.zshrc':

bindkey -s '\ e [25' 'mi-comando1; mi comando2 \ Cm '

... enlace 'Shift-F1' a 'my-command1' seguido de 'my-command2' y ejecute ambos.

COMBINACIONES UTILIZANDO SOLO LAS TECLAS 'GRIS' :

tecla [ F1 ] = '^ [[[' ' tecla [ F2 ] = ' ^ [[[B ' tecla [ F3 ] = ' ^ [[[C ' tecla [ F4 ] = ' ^ [[[D ' tecla [ F5 ] = '^ [[[ Tecla E' [ F6 ] = '^ [[17 ~' tecla [ F7 ] = '^ [[18 ~' tecla [ F8 ] = '^ [[19 ~' tecla [ F9 ] = '^ [[20 ~' tecla [F10 ] = '^ [[21 ~' tecla [ F11 ] = '^ [[23 ~' tecla [ F12 ] = '^ [[24 ~'

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

tecla [ Insertar ] = '^ [[2 ~' tecla [ Eliminar ] = '^ [[3 ~' tecla [ Inicio ] = '^ [[1 ~' tecla [ Fin ] = '^ [[4 ~' tecla [ PageUp ] = '^ [[5 ~' key [ PageDown ] = '^ [[6 ~' key [ Up ] = '^ [[A' key [ Down ] = '^ [[B' key [ Right ] = '^[[C' key[Left] = '^[[D'

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

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

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

key[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', and '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' (who would have guessed?) 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?

Why is it 'Alt-Function' to change terminals at a terminal, but 'Alt-Ctrl-Function' to change to a terminal from GUI?

¿Cómo / dónde se define ' Alt - Ctrl - Delete '?

enter code here
Ray Andrews
fuente
casi quiero enviar un correo electrónico ...
mikeserv
Por supuesto
Ray Andrews
Era solo una broma, Ray. ¿No ves a menudo perras, quejas, quejas? envíeme un correo electrónico ... por línea por aquí. Lo aprecié, es todo. de todos modos, como un aparte, sobre el zshtema de las teclas, es posible que desee probar la zkbdfunción que debería obtener una asignación de teclas completa guardada en un archivo. Creo que es autoloadcapaz, pero, si no, búscalo /usr/share/zsh/functions/Misc. También hay otras cosas raras allí, por cierto, como tetris.
mikeserv
Esa es una de las herramientas que usé para hacer mi mesa, pero ¿cómo lograr que vomite 'todo' a la vez?
Ray Andrews
interesante, supongo que no. Nunca lo he ejecutado antes, solo leí su archivo fuente, y eso fue hace un par de meses. Supongo que hace una serie de pruebas de entrada para generar su archivo guardado. pero guarda todo en un archivo, ¿verdad?
mikeserv
6

Hay muchas herramientas a su disposición en Unix / Linux, por lo que puede ser un poco confuso y abrumador. Para empezar, usaría 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 página del manual sobre -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.

Puede usar xmodmappara obtener algunas de las asignaciones:

$ 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)

Lo anterior no es todas las piezas del rompecabezas, pero es información adicional que puede ser útil para encontrar el mapa definitivo entre las combinaciones de teclas y los códigos de escaneo. Hay más información en este Q&A de U&L titulado: Mapeos clave en Linux .

Referencias

slm
fuente
1
Si bien todo esto es cierto, es irrelevante comprender las asociaciones de teclas en un terminal.
Gilles 'SO- deja de ser malvado'
@Gilles: sí, pensé que solo estaba tratando de proporcionar leads, ahora que he leído tu IA entiendo cómo funciona esa interfaz, ¡gracias!
slm
"showkey -a" no es irrelevante, sin embargo.
skagedal
2

si hubiera alguna forma de traducir los glifos clave en términos 'regulares':

bindkey "Home" beginning-of-line

... entonces sería feliz.

Hay infocmputilidad para describir terminfoentradas. Esto es especialmente útil con la -Lopción también conocida como nombres largos de variables C :

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

Comparando esto con la bindkeysalida

"^[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

se puede ver que usan notación diferente para escapar , pero básicamente es relativamente fácil escribir un script que conecte la segunda columna de la infocmpprimera bindkey.

En caso de que haya alguna duda sobre lo que significa una cadena en particular (como se imprime en la infocmpsalida), siempre se puede consultar el terminfomanual donde se proporciona la descripción completa, por ejemplo

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

Yo uso el emulador de terminal URxvt. Hay una llave útil vinculante para mostrar estos códigos: Ctrl+V. Después de presionarlo, ingrese la secuencia de teclas que desee e imprimirá su código. Por ejemplo, mi Ctrl+ tiene código ^[Oa.

poulix
fuente