¿Por qué no se puede ejecutar Emacs en una terminal distinguir Ctrl +; desde ";"?


8

Esta pregunta surgió de mi pregunta anterior sobre emacs beta . En resumen, quiero vincularme C-;a las funciones de Emacs en un terminal, pero parece que algo captura esta tecla antes de que llegue a Emacs: Emacs cree que presioné ;.

El sospechoso obvio es el emulador de terminal, pero he comprobado muchos de ellos (xterm, gnome-terminal, terminator, terminology) y ninguno de ellos funciona. Lo más probable es que pueda excluir el administrador de ventanas, porque en la versión GUI de Emacs, la clave C-;funciona bien. También probé dos shells diferentes: bash y zsh, pero nuevamente sin éxito.

¿Qué más puedo probar?


De acuerdo con su pregunta sobre Emacs , presione Ctrl +; envía ;a Emacs, así que nada lo captura , lo que sucede es que Ctrl +; y desnudo; enviar la misma información ¿Cuál es: captura (es decir, Emacs no recibe nada) o pérdida de información (es decir, Emacs recibe ;)?
Gilles 'SO- deja de ser malvado'

No hay un código estándar para C-;en la terminal. ¿Qué sucede si escribes C-v C-;en bash simple?
artm

@Gilles veo ;en emacs -nwindependientemente de si golpeo ;o C-;.
WeSenseASoulInSearchOfAnswers

@artm bashal igual que emacs imprime solo ;.
WeSenseASoulInSearchOfAnswers

Respuestas:


11

Quizás su confusión surge de no haber usado un terminal real. Cuando las computadoras serias eran del tamaño de varios refrigeradores verticales, un terminal se comunicaba con una computadora central a través de un cable en serie usando caracteres y caracteres solamente. Los caracteres formaban parte de algún conjunto de caracteres estandarizado, por ejemplo, ASCII o EBCDIC, pero normalmente ASCII. ASCII tiene 33 caracteres de control y el operador del terminal los envió presionando una tecla especial (como DEL) o presionando la tecla CTRL y presionando otra tecla. La computadora central solo vio el carácter de control resultante; no sabía qué teclas se presionaron para producir el personaje.

Un programa de emulación de terminal como xterm imita ese comportamiento. El emulador de terminal proporciona una forma de enviar los 33 caracteres de control ASCII y Emacs recibirá esos caracteres si se envían. Pero Emacs es como la computadora central en la descripción anterior: no tiene forma de saber qué teclas se presionaron realmente cuando se ejecuta bajo un emulador de terminal. Entonces, si presiona CTRL y punto y coma, a menos que el programa de emulación de terminal haya asignado esas pulsaciones de teclas a algún carácter ASCII, Emacs no sabrá que se ha escrito nada.

Los emuladores de terminal suelen utilizar las siguientes asignaciones para generar caracteres de control :

pulsación de tecla ASCII
--------------------
ESCAPE 27
BORRAR 127
RETROCESO 8
CTRL + ESPACIO 0
CTRL + @ 0
CTRL + A 1
CTRL + B 2
CTRL + C 3
etc ...
CTRL + X 24
CTRL + Y 25
CTRL + Z 26
CTRL + [27
CTRL + \ 28
CTRL +] 29
CTRL + ^ 30
CTRL + _ 31

Tenga en cuenta que CTRL +; no aparece en esa lista. Los terminales por lo general sólo enviar el carácter imprimible asignado a la tecla , si CTRL + llave no está asignado a un carácter de control. Entonces, ¿qué te dice tu emulador de terminal al enviarlo? solo es que no sabe qué hacer cuando presiona CTRL + ;.

Todo esto se aplica solo si está utilizando un terminal o un programa de emulación de terminal. Si está ejecutando Emacs como una aplicación nativa en algún sistema de ventanas, Emacs tiene acceso completo a los eventos de pulsación de teclas y no solo a los caracteres. Entonces Emacs puede ver que presionó CTRL y punto y coma juntos y le permite asignar una acción a ese par de teclas.

† Los terminales a menudo tienen teclas de función y teclas de flecha que también generan secuencias de caracteres que incluyen caracteres de control. Estas secuencias suelen comenzar con el código ASCII 27 (ESCAPE).


3

Las terminales transmiten caracteres (más precisamente: bytes), no claves. Cuando presiona una tecla o un teclado como Ctrl+ ;, esta información debe codificarse en una secuencia de bytes. Keychords que representan un personaje, al igual que Ao Shift+ Ao À, se envían como ese personaje: a, A, à(el último de los cuales uno o dos bytes en función de codificación de caracteres del terminal).

Los keychords que involucran teclas de función no tienen el carácter correspondiente, por lo que se envían como secuencias de escape: una secuencia de bytes que comienza con el carácter de escape ( \een una cadena de Emacs, que aparece como cian ^[si se ingresa literalmente en un búfer). Algunas teclas de función tienen bytes correspondientes que son caracteres de control .

El keychord Ctrl+ ;no tiene una secuencia de escape estándar, por lo que la mayoría de los emuladores de terminal generan el carácter ;. Esto pierde la información de que Ctrlse presionó el modificador.

Para definir un enlace para Ctrl+ ;, deberá configurar su emulador de terminal para enviar una secuencia de escape diferente. No creo que pueda hacer esto con el terminal Gnome (Gnome rara vez es configurable). Puedes hacerlo con Xterm. Consulte ¿Hay algún terminal de Linux que pueda manejar todas las combinaciones de teclas? para instrucciones

El shell que puede ejecutar en el terminal no está involucrado. Una GUI Emacs no tiene ningún problema porque la GUI (X11) transmite eventos de entrada en una forma que codifica teclas y modificadores, no como una mera secuencia de caracteres.

Consulte ¿Cómo funcionan la entrada del teclado y la salida de texto? para obtener información más detallada sobre cómo llega la entrada de su teclado a su aplicación.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.