salir guardar grabar editar editado cómo cambios archivo vim mapping terminal gnome alt

guardar - Los atajos de tecla Alt no funcionan en la terminal gnome con Vim



salir de vim ubuntu (6)

El problema

Hay dos maneras para que un emulador de terminal envíe una tecla Alt (generalmente llamada tecla Meta ya que las terminales reales no tienen Alt). Puede enviar caracteres de 8 bits y establecer el bit alto cuando se usa Alt, o puede usar secuencias de escape, enviando Alt-a como <Esc>a . Vim espera ver la codificación de 8 bits en lugar de la secuencia de escape.

Algunos emuladores de terminal como xterm se pueden configurar para usar cualquiera de los modos, pero el terminal Gnome no ofrece ninguna configuración de este tipo. Para ser honesto en estos días de edición Unicode, la codificación de 8 bits no es tan buena idea de todos modos. Pero las secuencias de escape tampoco están libres de problemas; no ofrecen ninguna forma de distinguir entre <Esc>j significa Alt-j versus presionar Esc seguido de j .

En el uso anterior de la terminal, escribir Esc j era otra forma de enviar un Meta en un teclado sin una tecla Meta , pero esto no encaja bien con el uso que hace vi de Esc para salir del modo de inserción .

La solución

Es posible evitar esto configurando vim para mapear las secuencias de escape a sus combinaciones Alt.

Agregue esto a su .vimrc:

let c=''a'' while c <= ''z'' exec "set <A-".c.">=/e".c exec "imap /e".c." <A-".c.">" let c = nr2char(1+char2nr(c)) endw set timeout ttimeoutlen=50

Alt-letter ahora será reconocido por vi en un terminal y también por gvim. La configuración de timeout se usa para evitar la ambigüedad con las secuencias de escape. Esc y j enviados en 50 ms se correlacionarán con <Aj> , más de 50ms contarán como claves separadas. Eso debería ser tiempo suficiente para distinguir entre la codificación Meta y presionar dos teclas.

Si no le gusta tener un timout establecido, que agota el tiempo para otras secuencias de teclas mapeadas (después de un segundo por defecto), entonces puede usar ttimeout en ttimeout lugar. ttimeout se aplica solo a códigos de clave y no a otras asignaciones.

set ttimeout ttimeoutlen=50

Estoy ejecutando Vim en una terminal gnome. Pero las asignaciones de teclas alt no funcionan.
Por ejemplo (esto es solo un ejemplo):

:imap <A-i> <Esc>

Funciona bien en GVim. Pero cuando ejecuto el mismo comando con Vim en el terminal gnome, simplemente no funciona.
Entonces creo que el problema es con la terminal, ¿verdad?
¿Cómo puedo arreglarlo?

Gracias

EDITAR: Tengo Windows 7 instalado en la misma máquina, y con el terminal de Windows también funciona bien.


Eche un vistazo a la sección 1.10 de http://vimdoc.sourceforge.net/htmldoc/map.html . Parece indicar que gnome-terminal escapa automáticamente del modificador Alt, por lo que no cambia el byte enviado de la forma en que Vim está esperando. El documento parece indicar que realmente no hay una forma de evitar esto, excepto el uso de un terminal diferente (como xterm).

Esto es ciertamente frustrante porque hasta ahora puedo decir que las máquinas Linux también son incapaces de usar las vinculaciones D (Mac''s Command o Linux''s Super), así que al menos en lo que respecta al terminal, estamos limitados a los modificadores Shift y Ctrl, que es frustrante si queremos asegurarnos de que podemos usar todos los comandos que usamos en Gvim en el terminal Vim (al menos sin terminales de conmutación, hacia los cuales quizás soy demasiado terco, gnome-terminal es mucho más bonito). He estado buscando una forma de evitar esto, pero no he podido encontrar nada.


Es posible que los accesos directos sean en realidad del Gnome Desktop. Intente mirar la herramienta Accesos directos de teclado de Gnome (menú Sistema, Preferencias, Accesos directos de teclado), que le permite ver y modificar los accesos directos definidos en Gnome Desktop. Si la combinación de teclas está asignada a una función en Gnome Desktop, elimínela y luego esa combinación de teclas debería filtrarse a Vim correctamente.

O puede que tengas razón de que es un problema de la terminal. No todas las terminales admiten todas las combinaciones de teclas. Su problema puede ser el descrito en los documentos de ayuda de Vim en :h map-alt-keys . Los documentos proporcionan una solución alternativa, pero no muy buena.



Para Gnome-terminal , use lo siguiente en su lugar:

imap ^[i <Esc>

^[i debería escribirse presionando Ctrl-v Alt-i

Atención : debes yank y put en Vim cuando quieras copiarlo en otro lugar. Si solo copia la asignación en un editor como gedit , la asignación probablemente se romperá.

EDITAR aquí es un ejemplo que hace que Alt-k agregue una línea vacía sobre el cursor, y Alt-j agrega una línea vacía después de la línea actual.

" Alt-j/k to add a blank line if has(''gui_running'') " the following two lines do not work in vim, but work in Gvim nnoremap <silent><A-j> :set paste<CR>m`o<Esc>``:set nopaste<CR> nnoremap <silent><A-k> :set paste<CR>m`O<Esc>``:set nopaste<CR> else " these two work in vim " shrtcut with alt key: press Ctrl-v then Alt-k " ATTENTION: the following two lines should not be " edited under other editors like gedit. ^[k and ^[j will be broken! nnoremap ^[k :set paste<CR>m`O<Esc>``:set nopaste<CR> nnoremap ^[j :set paste<CR>m`o<Esc>``:set nopaste<CR> endif


Tratar

<m-i>

O, si tecleo alt, inserto un caracter (como en mi caso, inserta una carretilla ˆ : simplemente asigna a ese personaje:

:inoremap ˆ <esc>

Tenga cuidado, porque este no funcionaría (al menos en mi sistema, MacOS 10.6). El símbolo de intercalación espera una letra, porque no es exactamente una referencia, es un circumflex .