Utilice Super en emacs -nw en linux

15

He estado luchando por encontrar una pregunta simple y directa a la respuesta y, por lo tanto, he decidido preguntar aquí.

P: ¿Hay alguna manera de usar Super en Emacs lanzado en una Terminal en Linux?

PD : Leí mucha información, xmodmappero creo que la clave es que el emulador de terminal no puede representar la Superclave. Sin embargo, (kbd "s-SPC")devuelve algo y estaba pensando en usar la función de traducción de .Xdefaults/X. ¿Estoy en el camino correcto? Dado el resultado de kbd, ¿qué necesito poner como XTerm.VT100.translations?

Andrea Richiardi
fuente

Respuestas:

21

Se sentirá más cómodo en un X11 Emacs, que puede recibir entrada de teclado y mostrar texto sin pasar por la codificación y decodificación del terminal . La razón principal para usar un editor de modo de texto es ejecutarlo dentro de la pantalla o tmux en una máquina remota, pero gracias a Tramp, generalmente es más fácil editar el archivo remoto en su Emacs local. Dicho esto, puede hacer lo que quiera siempre que su emulador de terminal coopere, como es el caso de Xterm.

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 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 de 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, los modificadores hiper y super generalmente se ignoran. 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 símbolo del sistema, C-qo C-h cseguido de la combinación de teclas en Emacs.

Xterm le permite configurar las secuencias de escape para cada clave a través de X recursos . La mayoría de las configuraciones leen los recursos desde el ~/.Xresourcesinicio de X, y puede cargar el archivo manualmente con xrdb -merge ~/.Xresources.

XTerm.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 (de 15a 24a F5a F12- por razones históricas, F1 a través de F4diferentes secuencias de escape) e number2indica el modificador ( 2para Shift, 5para Ctrl, 3para Meta, 8para Ctrl+ Metay agrega 1 para + Shift- no, no es muy consistente).

Tendrá que especificar los modificadores Hyper y Super a través de su número, como a Mod1través Mod5. Ejecute xmodmap -pmpara ver el mapeo de keyyms a modificadores. Por ejemplo, si Super_Lestá vinculado a Mod5, la siguiente línea (use este caso exacto) define un enlace para Super+ Space:

    ~Ctrl ~Meta Mod5 <Key> space: string("\033[32;16~") \n\

Emacs traduce 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[32;16~" [(super ?\ )])

Esta publicación está hecha de 80% de material reciclado. ¿Hay alguna terminal de Linux que pueda manejar todas las combinaciones de teclas?

Gilles 'SO- deja de ser malvado'
fuente
Esta es una gran respuesta, que abarca todo el conocimiento que encontré un poco disperso. Solo una pregunta: ¿dónde encontró / cómo eligió 32; 16 ~ y por qué no coincide con el enlace de emacs a continuación? Entendí el origen de los números, pero me gustaría preguntarle si se puede vincular a una tabla de asignación de algún lugar para nº1 y nº2 .
Andrea Richiardi
@AndreaRichiardi Elegí 32 porque es el valor ASCII / Unicode para el carácter de espacio y 16 porque los enlaces estándar usan valores de hasta 8 para Ctrl, Meta y Shift. El 33 a continuación fue un error tipográfico. Puede elegir cualquier cosa siempre que no entre en conflicto con otras teclas.
Gilles 'SO- deja de ser malvado'
Tuve que vincular la secuencia a una función, así que resolví momentáneamente (global-set-key "\033[32;16~" 'set-rectangular-region-anchor). Pero para completar, probé lo define-keyanterior, pero no pude disparar (global-set-key (kbd "s-SPC") 'set-rectangular-region-anchor). Solo estaba imprimiendo; 16 ~ en el búfer. Hubiera sido bueno vincular esa secuencia a (kbd "s-SPC") para que tenga la secuencia de teclas enlazada y pueda reasignarla a otros comandos.
Andrea Richiardi
C-h ldevuelve lo siguiente al presionar s-SPC ahora: ESC [ 3 2 ; 1 6 ~pero emacs aún se queja de queM-[ 32 is undefined
Andrea Richiardi
@AndreaRichiardi Después de corregir más errores tipográficos en la parte xterm (que parece haber solucionado desde que Emacs recibe la secuencia de caracteres deseada), funciona para mí. ¿Funciona si lo usas en function-key-maplugar de local-function-key-map? Puede ser una cuestión de cuándo se configura local-function-key-map, ya que depende de la terminal.
Gilles 'SO- deja de ser malvado'
0

Si está dispuesto a instalar un paquete de Emacs y configurar su terminal, escribí un paquete de Emacs que puede enseñarle a Emacs y terminales cómo reconocer correctamente todas las teclas del teclado de la PC y las combinaciones de teclas modificadoras:

https://github.com/CyberShadow/term-keys

La codificación del modificador Super no está habilitada de forma predeterminada, pero el paquete es personalizable y permite configurar qué combinaciones de teclas modificadoras están codificadas. Para habilitar las combinaciones de teclas de codificación que incluyen el modificador Super, establezca term-keys/want-key-p-funcuna función que regrese tcuando (elt mods 3)no sea nula (consulte la implementación predeterminada para obtener una explicación).

Vladimir Panteleev
fuente
0

Tengo lo siguiente en mis archivos init:

(global-set-key [f7] nil)
(global-set-key [f8] nil)
(define-key function-key-map [(f7)] 'event-apply-super-modifier)
(define-key function-key-map [(f8)] 'event-apply-hyper-modifier)

Esto me permite enviar teclas súper e hiper utilizando las teclas de función.

Realraptor
fuente
-1

Respuesta corta: uso Konsole.

Explicación:

  • Emacs ' local-function-key-maptiene una asignación de entrada C-x @ sa event-apply-super-modifier.
  • Konsoleasigna Super(la tecla del logotipo de Windows) a la secuencia de escape ^X@s(que no parece estar documentada en ninguna parte, lo descubrí por casualidad). Puede probar esto abriendo Konsoley presionando, por ejemplo Ctrl-v Win-o.
ubolonton
fuente
Gracias por la respuesta, pero cambiar el término no es la solución que estoy buscando.
Andrea Richiardi