¿Qué es Ctrl + x en una terminal de Linux, exactamente?
(tl; dr: investigación larga. Clasifique las preguntas al final).
Me di cuenta de que cuando superpresiono + algunas letras (por ejemplo, comando + n, o windowsKey + a, etc.), obtengo una lista de mi archivo de hosts en un formato extraño y una nueva línea con dos letras.
Por ejemplo:
user@host $ <here i press Super+n>
::1 localhost test.com
test2.com test3.com
user@host $sn
si inicio mi editor de texto y presiono las mismas teclas, veo: @sny nada más.
$ hexdump x
0000000 7340 0a6e
0000004
lo que no parece correcto, ya que no pasaría nada si eso fuera lo que enviaba esa combinación de teclas. Entonces debe faltar información. Intentemos algo mas
$ cat `tty` | hexdump
^X@sn
0000000 4018 6e73 000a
0000005
Voy a suponer que 000aes la consecuencia de tener que ingresar una nueva línea y presionar ctrl + D para dejar el tty y permitir que suceda la redirección a hexdump. Así que ignoremos eso.
Me quedo con el resto de los valores hexadecimales, que estarían en el orden correcto:
18: CAN cancel
40: @
73: s
6E: n
No pude encontrar lo que hace CAN char. no está listado enstty -a
$ stty -a
speed 38400 baud; rows 33; columns 151; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; discard = ^O; min = 1; time = 0;
-parenb -parodd -cmspar cs8 -hupcl -cstopb cread -clocal -crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr icrnl ixon ixoff -iuclc -ixany -imaxbel iutf8
opost -olcuc -ocrnl onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt echoctl echoke -flusho -extproc
No hay ningún ^Xlugar. Pero fue agradable catmostrarlo mapeado como tal, de lo contrario estaría muy perdido.
Wikipedia sobre el carácter de control de cancelación no explica lo que está sucediendo. Pero confirma el ^Xmapeo.
Ahora que sabemos que CAN es ^X, puedo escribir: ^X(lo que deja la terminal en un estado extraño, sin eco, muy parecido a START, que stty muestra como correcto ^Q), y luego al presionar @muestra la misma lista de hosts que antes.
Bien, entonces ^Xpodría ser una característica de algo además del terminal. Eso deja a Bash. lo que me llevó a esta respuesta (que irónicamente apunta a información eliminada de wikipedia y no es la respuesta elegida). El manual de bash muestra ^X(con la notación C-x), se usa en todas partes:
C-x @se utiliza para posibles finalizaciones de nombre de host (Cx @)
No tiene nada que ver con Cancelar el carácter de control, pero si sttyno sabe que este carácter es ^ X, ¿cuál es el mapeo? es decir, si ^V ^Xescribo, obtengo char 0x18.
Entonces, toda esa investigación me deja con algunas preguntas:
¿Cuál es el responsable del carácter Control+ x= cancelar (ascii 0x18) mapeando el terminal? ¿Por qué no aparece en la lista
stty -a? Pero locatsabe, ¿cómo? ¿Por qué puedo escribir Cancel Char con^V ^X?¿Por qué presionar super + algunas letras resultan en
^X@s+ letra? (esta es la única parte que solo ocurre en la consola de KDE, todo el resto también funciona en xterm. No tengo ninguna tecla de acceso directo configurada en ninguna parte) (editar: pregunta propia más detallada aquí )
Respuestas
Como usted dice, C-x @se usa para posibles compleciones de nombres de host. Si busca esto en el enlace del manual de bash que proporcionó, se encuentra en la sección "Dejando que Readline escriba por usted".
Readline es una biblioteca que permite la edición de líneas y otras cosas como la finalización de tabulaciones. Se usa en bash, pero también en otros programas.
Entonces readline dentro de bash, con una configuración particular para bash, es responsable de mostrar la lista de hosts. Esto no tiene nada que ver con stty, que es parte de la configuración de tty, en una parte de Unix que vino mucho antes de la biblioteca readline.
La interpretación de los ajustes de tty ocurre mucho antes de que readline vea alguno de ellos.
cat no "sabe" nada de esto.
En cuanto a por qué, Superjunto con algunas otras claves, produce esta secuencia: en mi sistema no lo hace, y no tengo idea de por qué lo hace en su sistema. El primer lugar donde buscaría es su emulador de terminal (no dijo cuál usa, yo uso xterm). El segundo lugar es su administrador de escritorio / administrador de ventanas.