¿Dónde encuentro una lista de códigos de clave de terminal para reasignar accesos directos en bash?

42

Por ejemplo:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Solo conozco partes y piezas, como \esoportes para escape y C-para Ctrl, pero ¿cuáles son estos números ( 1) y letras ( Z)? ¿Cuáles son los ;, [y -las indicaciones para?

¿Hay solo prueba y error, o hay una lista completa de códigos de teclas bash y una explicación de su sintaxis?

error
fuente
2
Un consejo adicional para enumerar los enlaces de línea de lectura reales del shell es bind -p.
1
La mayoría de estos códigos son interpretados por su terminal; lea sobre los códigos de escape ANSI en Wikipedia para obtener una lista grande.
chepner
stty -a muestra la configuración de línea del terminal
error

Respuestas:

52

Esas son secuencias de caracteres enviados por su terminal cuando presiona una tecla determinada. No tiene nada que ver con bash o readline per se, pero querrá saber qué secuencia de caracteres envía una tecla determinada o una combinación de teclas si desea configurar readlinepara hacer algo al presionar una tecla determinada.

Cuando presiona la Atecla, generalmente los terminales envían el carácter a(0x61). Si presiona <Ctrl-I>o <Tab>, generalmente envía el ^Icarácter también conocido como TABo \t(0x9). La mayoría de las teclas de función y navegación generalmente envían una secuencia de caracteres que comienza con ^[(control- [), también conocido como ESCo \e(0x1b, 033 octal), pero la secuencia exacta varía de terminal a terminal.

La mejor manera de averiguar qué envía una tecla o combinación de teclas para su terminal, es ejecutarla sed -n ly escribirla seguido por Enterel teclado. Entonces verás algo como:

$ sed -n l
^[[1;5A
\033[1;5A$

La primera línea es causada por el terminal local echorealizado por el dispositivo terminal (puede que no sea confiable ya que la configuración del dispositivo terminal lo afectaría).

La segunda línea sale por sed. El $no se debe incluir, es solo para mostrarle dónde está el final de la línea.

Por encima de eso significa que Ctrl-Up(que he pulsado) enviar a los 6 caracteres ESC, [, 1, ;, 5y A(0x1b 0x5b 0x31 0x35 0x41 0x3B)

La terminfobase de datos registra una serie de secuencias para varias claves comunes para una serie de terminales (en función del $TERMvalor).

Por ejemplo:

TERM=rxvt tput kdch1 | sed -n l

Te diría qué secuencia de escape se envía rxvtal presionar la Deletetecla.

Puede buscar qué tecla corresponde a una secuencia dada con su terminal actual con infocmp(aquí suponiendo ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Las combinaciones de teclas como Ctrl-Upno tienen entradas correspondientes en la terminfobase de datos, por lo que para saber qué envían, lea la fuente o la documentación del terminal correspondiente o pruébelo con el sed -n lmétodo descrito anteriormente.

Stéphane Chazelas
fuente
Esta es una gran explicación, gracias! Ahora todo cae en su lugar, \e-1\C-ies una pestaña hacia atrás, porque controle iinserta una ficha y escapeseguido por -1dice bash para hacerlo hacia atrás una vez (I Goggled esto y encontré algunas cosas acerca digit-arguments).
error
$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx
3
@vib. Eso es minúscula L no dígito 1
Stéphane Chazelas
1
@ user367890, eso depende del modo de teclado . Probablemente encontrará que después tput smkx, su terminal envía \e[OD( kcub1) y después tput rmkx, \e[D( cub1, el mismo código que la secuencia que mueve el cursor hacia la izquierda, para que el eco de esas teclas mueva el cursor. Intente stty -echoctl; tput rmkx; sleep infy verá las teclas de flecha mueven el cursor cuando no está en modo de teclado ).
Stéphane Chazelas
1
@ user367890, de lo que Thomas (el mantenedor ncurses y xterm) dice en la respuesta que enlace, sí, debería funcionar. el modo de teclado o el modo de aplicación se refieren a lo mismo, por lo que (nuevamente, según Thomas) las especificaciones clave en la base de datos terminfo son para cuando smkx está habilitado.
Stéphane Chazelas
4

Se proporciona a través de la biblioteca gnu readline. deberías buscar en man 3 readline para descubrir su descripción.

Parece que también necesita información sobre lo que significan los me gusta de los códigos de escspe \[A. Puede encontrar esta información en el artículo de código de escape ANSI de Wikipedia .

prisa
fuente
Esto no explica mis ejemplos.
error
Parece que fue un pequeño malentendido. Por favor, mire la actualización de respuestas.
prisa
No hay información sobre mis ejemplos específicos en el artículo. Una búsqueda de página para "[A" tampoco arrojó nada.
error
1
@bug por favor lea cuidadosamente el artículo. \[Aestá en la tabla "Códigos CSI" dentro de la fila: "CSI n A"
acometida
Gracias Rush, pero ¿Dónde puedo encontrar explicaciones sobre [Z, [1;5Co -1?
error
3

¿Estos códigos provienen de la misma fuente? El último parece un enlace de línea de lectura de GNU. Eso es lo que el usuario envía a un bash (ver la respuesta de rush). Sin embargo, las dos primeras se parecen más a las secuencias de control de terminal (aunque la primera sería una de formato incorrecto). Eso es lo que bash u otro programa envían de vuelta al emulador de terminal para controlar los movimientos del cursor, los colores del texto y similares.

Uwe
fuente
Encontré que "\ e [1; 5C" se usa para el movimiento de la palabra Ctrl-flecha hacia adelante, y "\ e [Z" y "\ e-1 \ Ci" para el menú completo-hacia atrás en otros tutoriales. Todos se han utilizado dentro del archivo .inputrc.
error
OK, si son interpretados por readline, entonces debe haber algún emulador de terminal donde estas secuencias de control estén vinculadas a alguna combinación de ctrl, alt y / o shift con las teclas de función o flecha. (No sé cuál.)
Uwe
0

La forma más fácil que he encontrado para verificar qué secuencia de escape es generada por una combinación de teclas o teclas es presionar Ctrl+ ven un terminal y luego presionar la tecla / combinación que desea conocer.

Obtendrá una secuencia como ^[Oay usted tiene que traducir el ^[a \eo \033o \x1bo cualquier otra representación de sus Espera sistema de combinación de teclas para el carácter de escape.

Comenzó como una función de Emacs llamada quoted-inserty, dado que las combinaciones de teclas predeterminadas para Bash y Zsh imitan a Emacs, también la copiaron.

Bash lo obtiene a través de la biblioteca de entrada GNU Readline que import rlcompletertambién usan otras cosas como la mejora de Python .

Aquí está la descripción del manual de Readline :

quoted-insert( C-qo C-v)

Agregue el siguiente carácter escrito a la línea textualmente. Así es como insertar secuencias de teclas como C-q, por ejemplo.

Eso debería funcionar en cualquier cosa basada en GNU Readline.

En cuanto a Zsh, que usa su propia alternativa llamada ZLE, solo respeta el C-qenlace original de Emacs cuando está en modo Vi, irónicamente, pero C-vaún funciona en el modo de entrada predeterminado similar a Emacs. (Busque quoted-inserten las zshzlepáginas de manual de o zshall` y el segundo par de resultados debe enumerar las combinaciones de teclas predeterminadas).

Para un mnemotécnico, aconsejo pensar en Ctrl+ vcomo pedirlo v erbatim.

ssokolow
fuente