Cuando presiono AltUp, A
se imprime en la pantalla del terminal. Lo mismo sucedió cuando presioné AltDownpero B
en su lugar se imprime.
Otros personajes que realicé;
AltLeft= D
y 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 \e
o ^[
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[A
dependiendo \033OA
de 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 bar
escrito después foo
de 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 zsh
o vi
lee esa secuencia de caracteres del terminal, la interpreta como la acción "Arriba", porque sabe por la base de datos terminfo ( kcuu1
capacidad) que es la secuencia de escape enviada al presionar Up.
Ahora, para Alt-Up, a algunos terminales les gusta rxvt
y sus derivados les gusta eterm
enviar \033
seguido de la secuencia de escape para Up(es decir, \033\033[A
o \033\033OA
), mientras que a otros les gusta xterm
o gnome-terminal
tienen 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;3A
a 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[A
o \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. bash
por ejemplo, se interpretará \033[1;3
como 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[1
por lo que la omitirá y leerá el resto: ;3A
e insertará eso en el editor de líneas.
Muchas aplicaciones como vi
, zsh
o readline
basadas como gdb
o bash
(aunque tenga cuidado bash
con 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;3C
está 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, bash
esperan 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 con
km
. 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 comosmm
yrmm
.
bash
tambié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 xterm
introdujeron 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 cualesxterm
Se 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:
- analizar la secuencia de caracteres completamente
- analícelo parcialmente y deseche el controlmodificador si no es necesario
- 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 hiceesteparaded
en elfinales de los 80). Los desarrolladores de aplicaciones como bash
eligieron 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. xterm
hace esto por elconsulta tcapcaracterística, proporcionando vim
las asignaciones de teclas de función reales.
Dado que ninguna de las cadenas que bash
se 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: