¿Cuáles son los caracteres impresos cuando se presionan las teclas Alt + Flecha?

13

Cuando presiono AltUp, Aimpreso en la pantalla del terminal. Lo mismo sucedió cuando presioné AltDownpero Bse imprimió en su lugar.

Otros personajes que me di cuenta;

AltLeft= Dy AltRight=C

¿Cuál es el propósito de estos comandos?

yfklon
fuente

Respuestas:

14

Dependiendo de cómo esté configurado el terminal, escribir Alt+Keyes como escribir las teclas Escy Keyen secuencia, por lo que envía el carácter ESC (aka \eo ^[or \033) seguido del carácter o secuencia de caracteres enviados al presionar eso Key.

Al presionar Up, la mayoría de los emuladores de terminal envían los tres caracteres \033[Ao \033OAdependiendo de si están en modo de teclado de aplicación o no.

El primero corresponde a la secuencia de escape que, cuando sale al terminal, mueve el cursor hacia arriba. Si lo haces:

printf '\nfoo\033[Abar\n\n'

Verás barescrito después de foouna fila arriba. Si lo haces:

stty -echoctl; tput rmkx; read foo

Verá que las teclas de flecha mueven el cursor.

Cuando a una aplicación le gusta zsho vilee esa secuencia de caracteres del terminal, la interpreta como la acción "Arriba", porque sabe por la base de datos terminfo ( kcuu1capacidad) que es la secuencia de escape enviada al presionar Up.

Ahora, para Alt-Up, algunos terminales como rxvty sus derivados como etermsend \033seguido de la secuencia de escape para Up(que es \033\033[Ao \033\033OA), mientras que algunos otros como xtermo gnome-terminaltienen secuencias de escape separadas para esos tipos de claves cuando se utiliza con las teclas de combinación como Alt, Shift, Ctrl.

Esos típicamente enviarán \033[1;3Asobre Alt-Up.

Cuando se envía al terminal, esa secuencia también moverá el cursor hacia arriba (se ignora el segundo parámetro (3)). No hay una tecla del teclado correspondiente , por lo que es la misma secuencia enviada Alt-Updentro o fuera del modo de teclado de la aplicación .

Ahora, ya sea \033\033[Ao no \033[1;3A, muchas aplicaciones no saben para qué sirven esas secuencias. La base de datos terminfo no los ayudará, porque no existe tal capacidad que defina qué caracteres envían esas combinaciones de teclas.

Harán todo lo posible para interpretar esa secuencia. bashpor ejemplo interpretará \033[1;3como una secuencia de escape, no sabe nada al respecto, por lo que no hace nada, seguido de A. zsh, dejará de leer tan pronto como descubra que no hay una secuencia de caracteres coincidentes conocida. No hay una secuencia de escape que sepa que comience, por \033[1lo que se saltará eso y leerá el resto: ;3Ae insértelo en el editor de línea.

Muchas aplicaciones como vi, zsho las readlinebasadas como gdbo bash(aunque tenga cuidado con bashuna versión modificada de readline) le permiten agregar enlaces para cualquier secuencia de caracteres.

Por ejemplo, en zsh, es posible que desee vincular Alt-Up, Alt-Downcomo:

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

Esos son buscar en el historial hacia atrás y hacia adelante las líneas de comando que comienzan como la actual hasta la posición actual del cursor, lo cual es bastante útil para recuperar comandos anteriores.

Stéphane Chazelas
fuente
3

Puedes usar Crtl + vpara devolver los códigos de entrada de su teclado. Si lo haces de flechas, obtendrá [[D^, [[C^, [[A^, y [[Bvalores. No hay enlaces predeterminados para Altlas teclas de flecha +, por lo que parece que la acción realizada es imprimir solo el código de letra. Sin embargo, si crea su versión local del archivo de configuración de la biblioteca readline:

$ cp /etc/inputrc ~/.inputrc

Y agrega una línea:

"\e[1;3C": "sometexthere"

Dónde [1;3C es el código de entrada de Alt+ (lo puede conseguir mismo modo que antes de usar Crtl+ vacceso directo) y reiniciar su terminal y luego Crtl+ atajo le volverá texto "sometexthere" y otros Altaccesos directos + flecha dejará de devolver caracteres.

En su lugar, puede pasar un comando enlazable desde http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands como

"\e[1;3C": unix-line-discard

tener el mismo efecto como Crtl+ u(eliminar línea).

Más información aquí: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Nykakin
fuente
3

La Altclave se usa a menudo como meta modificador. Las teclas de cursor y de función se denominan teclas especiales, ya que pueden enviar varios caracteres, y los caracteres que se envían pueden modificarse.

Algunos usuarios, por ejemplo, bashesperan que al presionar Altse envíe una tecla con el prefijo de escape. La característica documentada "meta" (verterminfo(5) ) trata del octavo bit:

Si el terminal tiene una "meta clave" que actúa como una tecla shift, configurando el octavo bit de cualquier carácter transmitido, este hecho se puede indicar con km. De lo contrario, el software asumirá que el octavo bit es paritario y generalmente se borrará. Si existen cadenas para activar y desactivar este "modo meta" , se pueden asignar como smmy rmm.

bashtambién lo sabe (consulte las preguntas frecuentes de ncurses ), pero pocos de sus usuarios están interesados ​​en la función. Sin embargo, están acostumbrados a referirse a él Altcomo "meta", aunque el modo meta esté desactivado. Tanto rxvt como xterm han tenido esta característica desde (al menos) principios de la década de 1990.

Otros usuarios (desde que xtermintrodujeron la función en el parche # 94, 1999 ) pueden esperar que la información del modificador se codifique como un parámetro en la secuencia de caracteres que enviaría una clave especial. La documentación de XTerm se refería a estas teclas modificadas como teclas de función "estilo PC" para distinguirlas del "estilo VT220" (que no tenía modificadores). Es posible que se envíe una tecla de cursor no modificada ESC[A, pero también es legal tener un parámetro , por ejemplo ESC[5A, que una aplicación debe entender como repetir eso cinco veces. La primera versión y una versión posterior la cambiaron para evitar confusiones con el recuento repetido. Entonces...xterm las teclas de estilo PC utilizaba ese "5" para denotarcontrol

ESC[5A

sugiere que la aplicación mueva el cursor 5 filas hacia arriba, mientras

ESC[1;5A

sugiere que se mueva hacia arriba una fila, diciéndole a la aplicación que controlse presionó una tecla.

Las combinaciones útiles han estado en la base de datos ncurses terminfo desde 2004 :

# 2004-07-17
#       * add xterm-pc-fkeys -TD

La base de datos terminfo muestra la versión actual de xterm + pcfkeys con un comentario que muestra cómo se codifican los modificadores:

# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
#    Code     Modifiers
#  ---------------------------------
#     2       Shift
#     3       Alt
#     4       Shift + Alt
#     5       Control
#     6       Shift + Control
#     7       Alt + Control
#     8       Shift + Alt + Control
#  ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.

(Alt y meta no son necesariamente la misma clave). Ese es un bloque de construcción (a su vez compuesto de otros bloques de construcción) a partir del cual se forma la xtermdescripción del terminal. Utiliza una extensión proporcionada en ncurses desde 1999 que permite nombres definidos por el usuario. Dado que termcap solo admite nombres de 2 caracteres y descripciones de 1023 bytes, no había razón para hacer que estos nombres extendidos estén disponibles a través de la interfaz de termcap . Están disponibles para aplicaciones que usan la interfaz terminfo .

Ahora viene una dificultad: hay algunas formas para que una aplicación determine qué representa una secuencia de teclas como esa:

  1. analizar completamente la secuencia de personajes
  2. analízalo parcialmente y tira el controlmodificador si no es necesario
  3. solo compara la secuencia de caracteres con un diccionario, con la esperanza de determinar el significado de esa manera.

Pocos programas harían lo primero; algunos editores de texto harían el segundo (en realidad, hice esto para deden los finales de 1980 ). Los desarrolladores de aplicaciones tales como basheligieron la tercera ruta suponiendo que la mayor parte de la información se encuentra en termcap . Alternativamente, podrían haber elegido hacer una tabla con información de termcap / terminfo y utilizar la interfaz que brinda la mejor información. xtermhace esto para la función tcap-query , proporcionandovim las asignaciones de teclas de función reales.

Como ninguna de las cuerdas que bash compara con coincide con las cadenas que recibe, puede confundirse, conformarse con coincidencias parciales (como el carácter de escape por sí mismo).

Otras lecturas:

Thomas Dickey
fuente