¿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 bindkey
veo 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 ^[[A
en bindkey-at-CLI speak es lo mismo que \e[A
en 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 scancode
programa: 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.
fuente
stty -a
que sea que digalnext
) y luego la tecla.Respuestas:
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
\e
aka\033
aka 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 paraecho
oprint
(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.^[OF
y^[[F
(es decir,\eOF
y\e[F
) son las dos secuencias de escape comunes enviadas por End.^E
(es decir,\005
es el enlace de tecla Emacs ( Ctrl+ E) paraend-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
terminfo
matriz 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.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.
fuente
(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.
fuente
zsh
tema de las teclas, es posible que desee probar lazkbd
función que debería obtener una asignación de teclas completa guardada en un archivo. Creo que esautoload
capaz, pero, si no, búscalo/usr/share/zsh/functions/Misc
. También hay otras cosas raras allí, por cierto, comotetris
.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
:De la página del manual sobre
-a
:Puede usar
xmodmap
para obtener algunas de las asignaciones: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
fuente
Hay
infocmp
utilidad para describirterminfo
entradas. Esto es especialmente útil con la-L
opción también conocida como nombres largos de variables C :Comparando esto con la
bindkey
salidase 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
infocmp
primerabindkey
.En caso de que haya alguna duda sobre lo que significa una cadena en particular (como se imprime en la
infocmp
salida), siempre se puede consultar elterminfo
manual donde se proporciona la descripción completa, por ejemplofuente
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, miCtrl
+↑
tiene código^[Oa
.fuente