Tengo la siguiente línea en init.el
:
(global-set-key [(control \;)] 'comment-region)
Funciona muy bien en la ventana de la GUI, pero si emacs
se invoca con la -nw
opción C-;, no comenta región, solo inserta ;
caracteres. M-x comment-region RETfunciona bien sin embargo.
Intenté seguir esta respuesta en un problema similar, pero C-q C-;regresa solo ;
y obviamente no quiero vincularme ;
.
¿Cómo lograr el efecto deseado?
key-bindings
terminal
WeSenseASoulInSearchOfAnswers
fuente
fuente
C-;
combo y luego useM-x view-lossage
para ver si llega incluso a Emacs.gnome-terminal
, yM-x view-lossage
devuelve:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
C-;
más bien quec ;
(o, al menos, obtengoC-;
).Respuestas:
Primero, el problema más general: los emuladores de terminal a menudo están limitados en las secuencias de control y escape que pueden enviar. Entonces: puede ser que el terminal se trague tus caracteres especiales antes de que lleguen a Emacs. Como diagnóstico general, puede presionar
C-h l
(oM-x view-lossage
) para ver si sus combinaciones de teclas se convierten en Emacs.Para una mayor discusión sobre este problema, eche un vistazo a este hilo de desbordamiento de pila y los enlaces que contiene.
Para resumir el ir y venir en los comentarios, su problema específico sugiere que es el terminal en lugar de Emacs el problema. Cuando lo intentaste
C-;
y luegoM-x view-lossage
, lo conseguisteblah blah blah c ; ESC v i e w - l o s s a g e RET
. Parece un problema de terminal: si la combinación de teclas llegara a Emacs, lac ;
parte se vería asíC-;
.fuente
En Shift + Up no es reconocido por Emacs en un terminal , explico cómo los terminales traducen la mayoría de las teclas de función en secuencias de escape, porque la interfaz entre aplicaciones y terminales transmite caracteres (o más bien bytes), no teclas. Solo unas pocas combinaciones de modificador + personaje tienen su propio personaje:
@[\]^_
vueltas en bytes 0–31 (caracteres de control ASCII ).Entonces, ¿qué pasa con otras combinaciones como Ctrl+ ;o Ctrl+ Shift+ letter? Como no hay un carácter correspondiente, el terminal debe reutilizar un carácter o enviar una secuencia de escape. Muchos terminales ignoran los modificadores cuando no hay un carácter correspondiente, por lo que terminas con Ctrl+ ;envío
;
, Ctrl+ Shift+ letterequivalente a Ctrl+ letter, etc.Los vendedores de terminales siguieron haciendo lo simple durante mucho tiempo. No había un estándar para las secuencias de escape, que se perpetuaba a sí mismo: los vendedores de terminales no lo implementan, las aplicaciones no lo admiten, los usuarios no lo esperan. Algunos emuladores de terminal pueden configurarse para enviar secuencias de escape arbitrarias, por lo que si el suyo puede, puede configurarlo y declarar las secuencias de escape a Emacs (más sobre esto más adelante).
Últimamente, la situación está cambiando, porque ha habido dos propuestas para estandarizar las secuencias de escape. Una es la libtermkey de LeoNerd con la sintaxis . Otro es el xterm de Thomas Dickey con la sintaxis . Las versiones actuales de xterm (≥216) se pueden configurar para cualquier sintaxis configurando el recurso; la función debe activarse configurando un valor distinto de cero.
ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Si su emulador de terminal no admite estas sintaxis, pero puede configurarse, elija cualquiera.
Desde Emacs 24.4, Emacs activa automáticamente la
modifyOtherKeys
función cuando detecta que el terminal es xterm versión ≥216. La detección de secuencias de escape de Emacs para codificar claves funciona a través de la variablelocal-function-key-map
. A partir de Emacs 24.4, no todas las secuencias de escape son compatibles. Puede usar el siguiente código en su archivo init para completar el trabajo.Si la
TERM
variable de entorno no está establecida enxterm
una variante comoxterm-256color
, Emacs no activará esas secuencias. Si Emacs ya tiene soporte para su valor deTERM
, puede agregar soporte definiendo una función similar a la anterior, que se ejecutará después de cargar el archivo Lisp cuyo nombre es el valor deTERM
. Si Emacs no tiene dicho soporte, puede agregarlo creando un subdirectorio llamadoterm
en algún lugar de suload-path
, y creando un archivo Lisp llamadoterm/$TERM.el
donde$TERM
está el valor deTERM
, definiendo una función llamadaterminal-init-$TERM
.Mientras escribo, parece que pocos emuladores de terminal distintos de xterm han adoptado estas secuencias de escape. En OSX, puede configurar iTerm2 seleccionando una secuencia de escape para cada combinación de teclas, una por una.
fuente
M-C-%
ser reconocido aESC 5
modifyOtherKeys
función no está activa. Tenga en cuenta que solo se admite en versiones recientes de xterm, y solo se activa automáticamente desde Emacs 24.4. No sé si OSX se envía con versiones recientes. Si no funciona y no funciona para usted, le sugiero que haga una nueva pregunta. Mencione las versiones que está utilizando.La respuesta de Gilles dijo:
On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one.
Tuve un pequeño problema para llegar allí, así que aquí una explicación detallada en caso de que seas como yo, confundido.Si, al ejecutar Emacs en un terminal (p. Ej., El Terminal.app predeterminado de Mac)
C-x C-;
no se ejecutacomment-line
, y desea esa funcionalidad, debe cambiar a iTerm2 (Terminal.app no tiene la capacidad) y crear una asignación de teclas bajo Perfiles ... Claves de la siguiente manera:Esto se logra haciendo clic en el
+
botón, que abre una pequeña ventana llamada "Atajo de teclado"; esta ventana tiene inicialmente dos campos; la parte superior tiene un valor de "Haga clic para establecer" y la parte inferior tiene un valor de "Ignorar". Haga clic en el botón superior y escribaC-;
. Esto establece la combinación de teclas que ejecutará la acción y el código. Haga clic en el campo inferior, "Acción", y busque y haga clic en "Enviar secuencia de escape", que se encuentra un poco más de la mitad. Después de hacer clic en eso, aparecerá un tercer campo, llamado "Esc +". Dentro de este campo, escriba:El
59
es el código ASCII decimal de la coma, y el5
es el código paraCtrl
. Luego presione "OK" para terminar. El combo de teclas correcto para la secuencia de teclas ahora se incluirá en las preferencias de iTerm2. Cuando inicie Emacs en iTerm, ahora tendrá acceso a laC-x C-;
funcionalidad.fuente