Respuestas:
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 \e
o ^[
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[A
o \033OA
dependiendo 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 bar
escrito después de foo
una 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 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, algunos terminales como rxvt
y sus derivados como eterm
send \033
seguido de la secuencia de escape para Up(que es \033\033[A
o \033\033OA
), mientras que algunos otros como xterm
o gnome-terminal
tienen 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;3A
sobre 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[A
o 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. bash
por ejemplo 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 hay una secuencia de caracteres coincidentes conocida. No hay una secuencia de escape que sepa que comience, por \033[1
lo que se saltará eso y leerá el resto: ;3A
e insértelo en el editor de línea.
Muchas aplicaciones como vi
, zsh
o las readline
basadas como gdb
o bash
(aunque tenga cuidado con bash
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
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.
Puedes usar Crtl + vpara devolver los códigos de entrada de su teclado. Si lo haces de flechas, obtendrá [[D^
, [[C^
, [[A^
, y [[B
valores. 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
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, bash
esperan 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 comosmm
yrmm
.
bash
tambié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 xterm
introdujeron 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 xterm
descripció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:
Pocos programas harían lo primero; algunos editores de texto harían el segundo (en realidad, hice esto para ded
en los finales de 1980 ). Los desarrolladores de aplicaciones tales como bash
eligieron 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. xterm
hace 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: