¿Cómo mapear la tecla Alt?


38

Estoy tratando de asignar la Altclave de la siguiente manera:

:map <A-j> j
:map <A-k> k

pero no funciona (suena el timbre Alt + j/ Alt + k).

¿Qué me estoy perdiendo?

Estoy usando Terminal en OSX, lo mismo sucede en Linux remoto.


En Ctrl + v, Alt + jtengo: ?~H~F( cuando encoding=utf-8).

En Ctrl + v, Alt + ktengo: ?~Z( ˚cuando encoding=utf-8).

Ejecutar vim sin complementos ( -u NONE) no hace ninguna diferencia.


1
¿Funciona Alt(presionar, no mantener) y luego jfunciona? Con xtermal menos tengo que configurar metaSendsEscapepara true que estas secuencias funcionen ... No sé si tienes el mismo problema, y ​​no uso OSX, así que no puedo probar ...
Martin Tournoij

@Carpetsmoker Al presionar Alt, soltar, jo cualquier otra tecla funciona normalmente. Revisé y encontré la opción 'Usar opción como meta clave' , la habilité y funciona ahora. Así que el ajuste metaSendsEscapefuncionó, gracias.
kenorb

3
Esta pregunta fue respondida previamente (con una mejor respuesta) aquí: stackoverflow.com/questions/6778961/…
user3751385

Respuestas:


36

Así es como lo hago en Linux o Cygwin:

Primero verifique qué caracteres envía su terminal cuando presiona ALT+ J:

Para hacer esto, voy a la consola y ejecuto sed -n l(también puedes usarlo cat). Luego presiono ALT+ Jy veo que los caracteres en la pantalla son ^[j.

Reemplazo ^[con \e(porque eso es lo que envía mi terminal cuando presiono esc) y la cadena final para mí es \ej.

Luego lo escribo a mi .vimrc:

execute "set <M-j>=\ej"
nnoremap <M-j> j

Y el mapeo funciona.


44
No puedo encontrar la documentación de la :set <M-j>=\ejparte. ¿Qué debo buscar?
Evgeni Sergeev

1
Gracias por la respuesta, esta fue la única solución que me funcionó con Iterm + vim
newUserNameHere

No, esto no funciona. A veces ESC-J actuará como ALT-J
usuario3751385

1
@EvgeniSergeev See:help :set-termcap
Rich

10

Con la ayuda de Carpetsmoker , parece que Terminal no se configuró para 'Usar Alt / opción como meta clave' (esto es especialmente común para los Terminales GUI).

Para Terminal en OSX, está en Preferencias -> Configuración -> pestaña Teclado -> 'Usar opción como meta tecla' . Verificación: ¿Cómo puedo cambiar la Terminal para usar la opción como meta clave? ( Mavericks ).

Para XTerm, marque: Configurar XTerm como predeterminado para Meta Sends Escape que dice:

Agregue esta línea en cualquier parte de su archivo personal .Xdefaults ( ~/.Xdefaults):

xterm*metaSendsEscape: true

Luego vuelva a cargar la configuración con xrdb. Sin este paso, los cambios .Xdefaultsno tendrán efecto hasta el próximo reinicio de X:

xrdb -l ~/.Xdefaults

Luego asignaciones estándar con Altclave como:

:map <A-j> j
:map <A-k> k

funciona bien.

Para obtener ayuda, consulte: :h :map-alt-keys.


44
También puede querer verlo :h :map-alt-keyscomo otra fuente de información
Peter Rincker el

4

Similar a la respuesta de Kossak pero un poco más simple, al mapear las pulsaciones de teclas literales.

Ya sea en modo normal después de presionar :, o insertado en su .vimrc, asigne la entrada directamente al iniciar la asignación:

nnoremap 

luego presionando Ctrl+ y Vluego presionando la tecla para grabar, por ejemplo Alt+ . Esto se mostrará como algo así:

nnoremap ^[[1;3D

pero cada uno ^[es un carácter de escape literal único y el resaltado de sintaxis debería mostrar esto. Reemplace los escapes literales con el texto <Esc>y agregue el comando que desea utilizar:

nnoremap <Esc>[1;3D <C-w>h

Sé que OP estaba asignando Alt+ letras, pero usé flechas para mostrar cómo hacerlo para algo que puede no estar asignado de manera predeterminada.


Funcionó de maravilla, muchas gracias!
Aryndin

2

Esto funciona para mí en el terminal Ubuntu 16.04 xfce (y el terminal alacritty rust)

Establezca el desencadenador de fragmentos de ultisnip en Meta-/(al igual que el fragmento de emacs)

let g:UltiSnipsExpandTrigger="^[/"

Aquí está ahora ^[/escribo vim

En modo de inserción Ctrl-V Alt-/

( Metaes la Alttecla en el teclado de mi PC)


1

Si Control+Vseguido de ALT-xshows ^[x(escriba en la terminal) puede arreglarlo con este pequeño script de vim.wikia.com :

for i in range(97,122)
  let c = nr2char(i)
  exec "map \e".c." <M-".c.">"
  exec "map! \e".c." <M-".c.">"
endfor

Agregue a .vimrc para todas las asignaciones de teclas alternativas.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.