Pregunta:
Me gusta usar emacs en modo terminal ( -nw
), pero parece que la mayoría (¿todos?) Los terminales no pueden manejar algunas combinaciones de teclas, por ejemplo, C-<RET>
o CM-%
. Sé que esto se debe a que la mayoría de los terminales emulan un VT-100, que no tenía estas combinaciones. ¿Existe algún terminal Linux (preferiblemente KDE) que pueda manejar estas combinaciones de teclas, o es esta una limitación fundamental de todos los terminales?
Respuesta:
Cuando presiona una tecla o combinación de teclas en un terminal, se transmite a la aplicación que se ejecuta en el terminal como una secuencia de uno o más caracteres. Por ejemplo, cuando presiona a , la aplicación recibe a
. Cuando presiona Enter , la aplicación recibe el carácter CR
(también conocido como ^M
(se pronuncia "control-emm"), también conocido como el carácter número 13, también conocido como \r
o \015
). Las combinaciones de teclas que involucran Alt se transmiten típicamente como el carácter ESC
(a.ka. ^[
también conocido como \e
o \033
) seguido de la secuencia para la tecla o combinación de teclas sin Alt . Las teclas de función y otras combinaciones de teclas se transmiten como secuencias de escape que comienzan con \e[
o \eO
.
Las secuencias de escape no están completamente estandarizadas y los terminales generalmente ignoran ciertos atributos para ciertas claves. Por ejemplo, Ctrl + Shift + letra a menudo se transmite exactamente como Ctrl + letra de forma predeterminada.
Puede ver lo que envía su terminal para una combinación de teclas presionando Ctrl + V seguido de esa combinación de teclas en un indicador de shell, o Cq
o Ch c
seguido de la combinación de teclas en Emacs.
Con algunos emuladores de terminal, puede configurar las secuencias de escape para cada tecla. En Xterm, esto se hace a través de X recursos . La mayoría de las configuraciones leen recursos de ~/.Xresources
cuando se inicia X, y puede cargar el archivo manualmente con xrdb -merge ~/.Xresources
.
Term.VT100.translations: #override \n\
Ctrl ~Shift ~Meta <key>Return: string("\033[73;5~") \n\
Ctrl Shift ~Meta <key>percent: string("\033[37;6~")
Una convención común usa secuencias de escape de la forma ESC [ number1 ; number2 ~
para teclas de función con modificadores. number1
indica la tecla de función ( 15
a 24
para F5 a F12 ; por razones históricas, F1 a F4 tienen diferentes secuencias de escape) y number2
indica el modificador ( 2
para Shift , 3
para Meta , 5
para Ctrl , 7
para Ctrl + Meta , y agregue 1 para Shift con al menos uno de Ctrl o Meta ).
Emacs traduce las secuencias de escape en su representación de clave interna a través de input-decode-map
o local-function-key-map
(o function-key-map
antes de Emacs 23).
(define-key local-function-key-map "\033[73;5~" [(control return)])
(define-key local-function-key-map "\033[37;6~" [(control ?L)])