Quiero hacer Control-i
funcionar indent-region
(básicamente porque Xcode ya ha construido esa memoria muscular).
Me doy cuenta de eso Control-i
y no puedo tab
distinguirlos en el sentido de Ascii, pero están en el sentido del código clave.
He intentado lo obvio:
(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)
en vano: presionar Control-i
solo hace lo que hace la tab
tecla en el contexto actual. ¿Hay algo que pueda hacer para ayudar a Emacs a tratar el botón de pestaña de manera diferente Control-i
?
Actualización: Creo que un resultado equivalente se lograría por ser capaz de volver a asignar lo que un tab
/ Control-i
hace prensa cuando se selecciona una región.
Respuestas:
No creo que esto se pueda lograr desde un terminal, pero en modo GUI podría intentar esto:
Hago lo mismo
C-m
para que pueda distinguirse deRET
EDITAR:
Lo siguiente debería funcionar si está en modo GUI o TTY:
No es bonito, pero parece hacer el trabajo. Agradezco cualquier modificación o edición de este código según sea necesario.
fuente
<C-i>
y[C-i]
podría haber sido un identificador arbitrario, como<foobar>
y[foobar]
, y aún funcionaría; simplemente no lo llamestab
obackspace
.emacs
archivo pero ambosTAB
yC-i
se reasigna :-( @nispio(window-system)
devueltonil
en el momento en que.emacs
se cargó. Esto podría deberse a que está ejecutando una instancia no gráfica de Emacs, o porque está ejecutando un demonio Emacs.Marcos GUI
En los marcos de la GUI (ya sea X11, Windows, OSX, ...), Emacs lee la Tabtecla como la
tab
tecla de función. Sin embargo, debido a que la Tabtecla en los terminales envía tradicionalmente el carácter^I
( Control + I), Emacs traduce latab
tecla de función al carácter Control + I (carácter 9), que se muestra comoTAB
. Esta traducción se realiza a través defunction-key-map
.Una traducción similar ocurre con algunas otras teclas de función. ( Backspacey Deletees un caso espinoso que no discutiré en detalle aquí).
Si desea separar Tabde Ctrl+ por Icompleto, elimine el enlace de
function-key-map
:Sin embargo, esto no es muy útil, ya que las entradas
function-key-map
se anulan mediante enlaces en mapas de teclas específicos del modo o en el mapa global. Entonces, si desea definir un enlace diferente paratab
, simplemente hágalo (en Elisp, no de forma interactiva, porque el indicador de lectura clave aplica lafunction-key-map
traducción para que termine volviendo a vincularTAB
y notab
):Todos los modos estándar que modifican la acción de la Tabtecla lo hacen modificando la
TAB
tecla, que es un apodo para elC-i
carácter generado por la combinación de teclas Ctrl+ I. Si desea que se apliquen enlaces estándar entab
lugar deC-i
, dejefunction-key-map
y modele mapas de teclas solos y, en su lugar, redirija Ctrl+ Ia una tecla diferente.Ahora Emacs informará Ctrl+ Icomo "
<control-i>
(traducido deTAB
)". Esto no es bonito, pero es inevitable: la bonita impresión del carácter 9 tal comoTAB
está integrado en el código fuente de Emacs.Marcos terminales
En marcos de terminales, el problema es más difícil y a menudo imposible. Los terminales no transmiten claves, transmiten caracteres (más precisamente, de hecho, transmiten bytes). La Tabclave se transmite como el carácter de tabulación, que es Control + I, igual que lo que genera la combinación de teclas Ctrl+ I. Las teclas de función que no tienen un carácter correspondiente (como las teclas del cursor) se transmiten como secuencias de escape, es decir, secuencias de caracteres que comienzan con
ESC
= Control + [(por lo que Emacs define escapecomo una tecla de prefijo,ESC
tiene que ser un prefijo). Consulte ¿Cómo funcionan la entrada del teclado y la salida de texto? para más antecedentesHay algunos terminales que se pueden configurar para enviar diferentes secuencias de teclas para las teclas de función, pero no muchos. Tanto libtermkey / libtickit de LeoNerd como xterm de Thomas Dickey (desde la versión 216) lo respaldan. En Xterm, la función es opcional y se activa a través del
modifyOtherKeys
recurso. Sin embargo, no conozco ningún emulador de terminal popular que no sea xterm que admita esto, en particular los muchos emuladores creados en libvte . Algunos emuladores de terminal le permiten hacer esto manualmente a través de una correspondencia definida por el usuario desde los teclados para escapar de las secuencias.Este mecanismo permite distinguir muchas combinaciones de teclas, no solo tab / Ci, return / Cm y escape / C- [. Consulte Problemas con las combinaciones de teclas al usar la terminal para obtener una descripción más detallada.
La función xterm básica es compatible desde Emacs 24.4. Sin embargo, los fundamentos (en particular Tab, Return, Escape, Backspace) siguen enviando los caracteres de control tradicionales, porque eso es lo que esperan que las aplicaciones. Hay un modo donde Ctrl+ letterenvía una secuencia de escape en lugar del carácter de control. Entonces, para distinguir las teclas de función de las Ctrlcombinaciones en Emacs 24.4, modifique su soporte para
modifyOtherKeys
usar este modo estableciendo el recurso en 2 en lugar de 1.fuente