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

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

Cuando presiono AltUp, Ase imprime en la pantalla del terminal. Lo mismo sucedió cuando presioné AltDownpero Ben su lugar se imprime.

Otros personajes que realicé;

AltLeft= Dy AltRight=C

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

Respuesta1

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 (también conocido como \eo ^[o \033) seguido del carácter o secuencia de caracteres enviados al presionar ese Key.

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

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

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

Verás barescrito después foode una fila hacia arriba. Si lo haces:

stty -echoctl; tput rmkx; read foo

Verás 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, a algunos terminales les gusta rxvty sus derivados les gusta etermenviar \033seguido de la secuencia de escape para Up(es decir, \033\033[Ao \033\033OA), mientras que a otros les gusta xtermo gnome-terminaltienen secuencias de escape separadas para esos tipos de claves cuando se usan con teclas de combinación como Alt, Shift, Ctrl.

Por lo general, se enviarán \033[1;3Aa Alt-Up.

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

Ahora bien, ya sea \033\033[Ao \033[1;3A, muchas aplicaciones no saben para qué sirven esas secuencias. La base de datos terminfo no les 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, se 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 se conoce ninguna secuencia de caracteres coincidente. No hay una secuencia de escape que sepa con la que comienza, \033[1por lo que la omitirá y leerá el resto: ;3Ae insertará eso en el editor de líneas.

Muchas aplicaciones como vi, zsho readlinebasadas como gdbo bash(aunque tenga cuidado bashcon el uso de una 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

Estos sirven para buscar en el historial hacia adelante y hacia atrás 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.

Respuesta2

Puede usar Crtl+ vpara devolver códigos de entrada de su teclado. Si hace eso con las teclas de flecha, obtendrá los valores [[D^, [[C^, [[A^y [[B. 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 letras. 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;3Cestá el código de entrada de Alt+ (puede obtenerlo de la misma manera que antes usando el atajo Crtl+ v) y reinicie su terminal, luego el atajo Crtl+ le devolverá el texto "algún texto allí" y otros Altatajos de flecha + dejarán de devolver caracteres?

En lugar de texto, puede pasar un comando vinculable desdehttp://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commandscomo

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

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

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

Respuesta3

La Altclave se utiliza a menudo comometamodificador. Las teclas de cursor y de función se denominanllaves especialesya 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 del carácter de escape. La característica "meta" documentada (verterminfo(5)) trata del octavo bit:

Si el terminal tiene una "meta clave" que actúa como tecla de mayúsculas, configurando el octavo bit de cualquier carácter transmitido, este hecho se puede indicar conkm. De lo contrario, el software asumirá que el octavo bit es paridad y normalmente se borrará. Si existen condiciones para convertir esto"modo meta" encendido y apagado, se pueden administrar comosmmyrmm.

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

Otros usuarios (desde que xtermintrodujeron la función enparche # 94, 1999) puede 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 refiere a estas claves modificadas como"estilo PC"teclas de función para distinguirlas de"Estilo VT220"(que no tenía modificadores). Se puede enviar una tecla de cursor sin modificar ESC[A, pero también es legal tener unaparámetro, por ejemplo, ESC[5A, que una aplicacióndeberíaentiendo como repetir eso cinco veces. La primera versión de xterm's.estilo PCLas teclas usaban ese "5" para indicar control, y una versión posterior lo cambió para evitar confusión con el recuento de repeticiones. Entonces...

ESC[5A

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

ESC[1;5A

sugiere que suba una fila, indicando a la aplicación que controlse presionó una tecla.

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

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

La base de datos terminfo muestra la versión actual dexterm+pcfkeyscon 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). Eso es unbloque de construcción(a su vez compuesto por otros bloques de construcción) a partir de los cualesxtermSe forma la descripción del terminal. Utiliza una extensión proporcionada en ncurses.desde 1999que permite nombres definidos por el usuario. Dado que termcap solo admite nombres de 2 caracteres y descripciones de 1023 bytes, no había ninguna razón para que estos nombres extendidos estuvieran disponibles a través deltermcapinterfaz. Están disponibles para aplicaciones que utilizan elinformación terminológicainterfaz.

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

  1. analizar la secuencia de caracteres completamente
  2. analícelo parcialmente y deseche el controlmodificador si no es necesario
  3. simplemente compare 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 lo segundo (en realidad, yo hiceesteparadeden elfinales de los 80). Los desarrolladores de aplicaciones como basheligieron la tercera ruta asumiendo que la mayor parte de la información está entermcap. Alternativamente, podrían haber optado por crear una tabla con información de termcap/terminfo y utilizar la interfaz que proporcionara la mejor información. xtermhace esto por elconsulta tcapcaracterística, proporcionando vimlas asignaciones de teclas de función reales.

Dado que ninguna de las cadenas que bashse comparan coincide con las cadenas que recibe, puede confundirse y conformarse con coincidencias parciales (como el carácter de escape por sí solo).

Otras lecturas:

información relacionada