¿Hay alguna terminal de Linux que pueda manejar todas las combinaciones de teclas?

11

Me gusta usar emacs en modo terminal ( -nw), pero parece que la mayoría de los terminales (¿todos?) No pueden manejar algunas combinaciones de teclas, por ejemplo, C-<RET>o C-M-%. Sé que esto se debe a que la mayoría de los terminales emulan un VT-100, que no tenía estas combinaciones. ¿Hay algún terminal de Linux (preferiblemente KDE) que pueda manejar estas combinaciones de teclas, o esta es una limitación fundamental de todos los terminales?

Yossarian
fuente

Respuestas:

15

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"control-emm"), también conocido como el número de caracteres 13, también conocido como \ro \015). Las combinaciones de teclas involucradas Altgeneralmente se transmiten como el carácter ESC(también ^[conocido como \eo \033) seguido de la secuencia para la combinación de teclas o teclas sin ellas 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+ a lettermenudo se transmite exactamente como Ctrl+ letterde forma predeterminada.

Puede ver lo que su terminal envía para una combinación de teclas presionando Ctrl+ Vseguido de esa combinación de teclas en un indicador de comandos de shell, C-qo C-h cseguido de la combinación de teclas en Emacs.

Con algunos emuladores de terminal, puede configurar las secuencias de escape para cada clave. En Xterm, esto se hace a través de recursos X . La mayoría de las configuraciones leen los recursos desde el ~/.Xresourcesinicio de 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. number1indica la tecla de función ( 15a 24para F5a F12- por razones históricas, F1 a través de F4diferentes secuencias de escape) e number2indica el modificador ( 2para Shift, 3para Meta, 5para Ctrl, 7para Ctrl+ Meta, y agrega 1 para Shiftcon al menos uno de Ctrlo Meta).

Emacs traduce las secuencias de escape en su representación clave interna a través de input-decode-mapolocal-function-key-map (o function-key-mapantes 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)])
Gilles 'SO- deja de ser malvado'
fuente
Entonces, si entiendo esto correctamente, primero necesito definir una secuencia de escape en mi terminal que corresponda a alguna combinación de teclas. Luego, en emacs, necesito asignar la secuencia de escape a la combinación de teclas. ¿Puede la secuencia de escape ser arbitraria, siempre que no entre en conflicto con las definidas en infocmp $TERM?
Yossarian
2
@Yossarian Sí. Además de no entrar en conflicto, las secuencias de escape deben ser inequívocas, es decir, ninguna secuencia de escape debe ser el prefijo de otra. Esto significa en la práctica que el primer carácter tiene que ser ESC(a menos que desee probar algún carácter ≥128, pero eso restringirá las posibles codificaciones de entrada) y el segundo carácter debe ser algo para lo que no desee ningún ESC fooenlace.
Gilles 'SO- deja de ser malvado'
Acabo de probar lo que sugeriste. En local-set-keyrealidad debería ser define-key? El primero da un error (número incorrecto de argumentos), mientras que el segundo funciona, al menos para <kbd> C-Enter </kbd>. Parece que Konsole todavía tiene problemas para enviar <kbd> CM-% </kbd>.
Yossarian
@Yossarian De hecho, debería serlo define-key. No sé si las teclas de escape de Konsole se pueden configurar, xterm es probablemente más personalizable que cualquier otra alternativa.
Gilles 'SO- deja de ser malvado'
1
Tenga en cuenta que el xterm de Thomas Dickey está en desarrollo activo. Con el XTerm*modifyOtherKeys: 2recurso generará secuencias únicas incluso para C-M-combinaciones, pero con esa configuración necesitará proporcionar muchas asignaciones personalizadas ( XTerm*modifyOtherKeys: 1es menos capaz pero mucho más funcional desde el primer momento). Para un ejemplo (aunque uno que no funcionaba para mí) ver la xterm-extras.elbiblioteca y el asociado .Xresourcesy .inputrcarchivos en el easymacs descarga.
phils
1

Para un conjunto de claves limitado pero significativo, suponiendo que la Konsole de KDE, uno puede hacer lo siguiente para tener combinaciones de teclas complejas y que funcionen en emacs -nw:

Usaré mi implementación de ponerme S-<RET>a trabajar como ejemplo:

  1. Abra una nueva konsole, vaya a configuración -> perfil actual -> teclado -> editar
  2. Presiona Agregar y crea una nueva entrada para Return+Shifty dale una secuencia de teclas útil (elegí \E[27;3cuál creo que es la secuencia de teclas enviada por X cuando estaba hurgando con xev, pero eso puede estar mal; lo importante es hacer Asegúrese de que tenga un escape adecuado y no entre en conflicto con nada más).
  3. Juegue con él en la pequeña área de prueba en la parte inferior para asegurarse de que esté funcionando.
  4. Reinicia konsole.
  5. Arranque emacs -nwy en el buffer scratch evalúe:

    (read-key-sequence-vector "Type your new key:")

    luego escriba su nueva combinación de teclas.

    • Si no está familiarizado con esto, escriba la línea, deje el cursor al final de la línea y presione Cx Ce para que emacs ejecute esa línea, debería decirle lo que haya escrito entre comillas y esperar a que lo haga. escribe algo.
  6. Debe escupir una secuencia de teclas que puede vincular.
    (Volvió [27 91 50 55 59 51]a mí en comparación con el viejo aburrido [13]antes de que me metiera con la combinación de teclas de Konsole).

  7. Agregue a su configuración de emacs:

    (define-key function-key-map [27 91 50 55 59 51] [(shift return)])
    
  8. Lo probé emacs -nwen una sesión de pantalla usando:

    (define-key ess-mode-map [(shift return)] #'ess-eval-line-and-step)
    (define-key sh-mode-map [(shift return)]  #'send-line-to-shell)
    
Ashton Trey Belew
fuente
0

La respuesta corta es que es una limitación fundamental de todos los terminales.

La respuesta un poco más larga es que incluso si alguien creó un terminal que hace lo que usted desea, Emacs requeriría cambios importantes para trabajar con este terminal hipotético.

hruvulum
fuente
Ese es un buen punto sobre emacs, que ni siquiera se me ocurrió. Supongo que comenzaré a usar la interfaz gráfica de usuario.
Yossarian
Eso es lo que hago.
hruvulum
0

Hay algunos esfuerzos para extender el protocolo VT de una manera que permita la entrada de teclado sin pérdidas (entre otras características, como gráficos).

Un ejemplo es notty: https://github.com/withoutboats/notty

Vladimir Panteleev
fuente