¿Puedo asignar la tecla Alt en Vim?

90

Intenté mapear como agregando la siguiente línea a .vimrc, pero no funciona. Verifiqué que el .vimrc está cargado por Vim.

map <Alt-D> <C-D>

¿Hay algún error en este mapeo?

Thomson
fuente
¿Está utilizando vim en una terminal o una versión de interfaz gráfica de usuario (gvim, macvim)?
Nick Knowlson
También tenga en cuenta que si sus encodingcambios después de que se ejecuta el mapeo, lo que obtenga de sus teclas Alt puede que no coincida con lo que estableció inicialmente.
dash-tom-bang

Respuestas:

136

Para los usuarios de Mac: para mapear ALT + hjkl, use en su lugar el carácter real generado (descubra qué carácter usando la combinación en el modo INSERT), por ejemplo, con mi teclado obtengo:

<ALT+j> ==> ª
<ALT+k> ==> º

y así. Solución encontrada aquí en StackOverflow.

Usé esto para mover líneas hacia arriba y hacia abajo con ALT + k \ j, usando esto en mi .vimrc:

nnoremap ª :m .+1<CR>==
nnoremap º :m .-2<CR>==

inoremap ª <Esc>:m .+1<CR>==gi
inoremap º <Esc>:m .-2<CR>==gi

vnoremap ª :m '>+1<CR>gv=gv
vnoremap º :m '<-2<CR>gv=gv

como se explica aquí .

Espero que sea útil, disfruta de Vim :)

ADDENDUM BY Dylan_Larkin (2019): Para que esto funcione en una Mac, " Usar opción como tecla Meta " debe estar APAGADO en Terminal-> Preferencias-> Teclado

Bruno Belotti
fuente
10
¡Esto es solo por lo que vine aquí (Alt + HJKL para mover divisiones)! ¡Gracias!
Jamie Schembri
6
Una forma fácil de averiguar qué personaje es mediante cat. Simplemente escriba caty dentro de la ventana del gato la combinación de teclas que desee. Descubrí que alt + corchetes es "y" en mi mac.
dvcrn
4
esto funciona muy bien como Alt + HJKL para moverse entre divisiones, ¡a mis dedos les encanta! nmap ˙ <C-w><Left> nmap ¬ <C-w><Right> nmap ˚ <C-w><Up> nmap ∆ <C-w><Down>
John Morales
3
Es posible que estas asignaciones exactas no funcionen como se esperaba en futuras versiones de OSX. Use sed -n lpara ver la salida de <Ak> y <Aj> antes de configurar la asignación. En mi caso, <Aj> es y <Ak> es˚
luk3thomas
4
En macOS, al configurar Use Option as Meta Keyo en el perfil de iTerm, ⌥ key to Esc+se comportará de la forma tradicional (como en Linux / Unix). Por lo tanto, no es necesario configurar en Vim el mapa <^[j>, simplemente asignarlo a <A+j>o <M+j>y funciona.
goetzc
40

:help key-notationdescribe qué formato debe utilizarse para asignar diferentes claves. En el caso de alt, puede usar <A-o <M-. Entonces tu mapeo sería

map <M-d> <C-d>

También recomendaría usar la norevariante de :map(por ejemplo, noremap) a menos que desee explícitamente permitir que se reevalúe el lado derecho para las asignaciones.

jamessan
fuente
1
Esto todavía no tiene ningún efecto. La entrada Alt + D todavía introduce algún carácter extraño en Vim.
Thomson
9
Ese es un tema aparte. Su terminal está enviando un carácter multibyte a Vim y Vim no sabe interpretarlo como <A-d>. Probablemente necesite cambiar la configuración de su terminal para que envíe <A-d>como <Esc>d.
jamessan
1
@jamessan ¿cómo hacerlo en iterm2?
finlandés
33

Ya no estoy seguro de que sea "posible". Lea la actualización a continuación.

Sí, se puede, incluso en vim terminal, pero no hay verdadera captura toda respuesta. Básicamente tienes que seguir dos pasos:

  1. Asegúrese de que <M-d>exista la notación y asigne exactamente lo que ingresa su terminal ( ^[es el carácter de escape):

    $ cat
    ^[d
    $
    
    " in your .vimrc
    execute "set <M-d>=\ed"
    " you have to use double quotes!
    
  2. Asigne algo a su combinación recién "creada":

    noremap <M-d> :echo "m-d works!"<cr>
    

Entendiendo cómo funciona, puede expandir este "truco" a otras combinaciones "extrañas", por ejemplo, estoy usando termitas y vim no reconoce <S-F1>, usando cat I get ^[[1;2P. Luego, en mi vimrc hago:, execute "set <S-F1>=\e[1;2P"y luego puedo asignarlo a cualquier cosa.

Nota: No sé por qué, pero para algunas personas que usan \<Esc>obras en lugar de \e.


Actualización (febrero de 2016)

Dependiendo de la terminal que ejecute su terminal, tal vez podría ... en la mayoría de las terminales, por ejemplo, se asigna "alt + h" ^[h, que es: "escape + h". Entonces podría sobrescribir claves. Lo intenté (de nuevo) y parece funcionar, pero creo que es una implementación muy propensa a errores y errores.

Sin embargo, para los valientes, aquí hay un complemento experimental:

Pablo Olmos de Aguilera C.
fuente
En lugar de las execute "set...cosas, puede usar directamente set <M-d>=^[d. En ^[realidad, es un carácter de escape introducido con C-v-Esc. Esto era necesario en rxvt / urxvt, pero xterm no debería necesitar un tratamiento especial. Más información sobre este tema en la wiki de vim .
Micah Elliott
¿Existe un enfoque análogo a esto que funcione con tmux de modo que, es decir, Md pueda enlazarse?
George
2
Para mí, <Esc>entonces dahora hace lo mismo que <Alt>+ d. Además, puede hacer esto en una línea con Ctrl-v, <Esc>según aquí .
Sparhawk
24

Map Alt Key en Vim en Mac OSx:

Comience por ver el código clave que su terminal está enviando a vim:

$ sed -n l
^[[1;9D 

En el ejemplo anterior, ejecuté el comando y presioné Alt + Left.

El ^[[1;9Des la secuencia escapado de ser enviado a vim, de modo que podamos usuario que para nuestro mapeo.

map <Esc>[1;9D 
lfender6445
fuente
3
Si está utilizando la aplicación iTerm2, es bueno verificar cómo se asignan las claves en Perfil> Claves.
fikovnik
1
Con la Optiontecla izquierda ( ) configurada como Esc+en iTerm2, podría mapear alt+qpara salir de vim: nnoremap <silent> <Esc>q :qa!<cr>
ryenus
También puede configurar iTerm2 para trabajar con esa reasignación si va a Preferencias> Perfiles, selecciona su perfil actual, vaya a la pestaña "teclas" para ese perfil y cambie la opción que dice "Tecla" izquierda "a" Esc + "(disponible las opciones son "Normal", "Meta" y "Esc +").
Giovanni Benussi
12

Utilizar:

map <A-D> <C-D>

Ver :help key-notation.

Benoit
fuente
1
Parece que esto todavía no funciona. Alt + d ingresará un carácter extraño en Vim, que es lo mismo con el caso de desasignar.
Thomson
Funciona para mí (lo estoy usando gvimen Windows)
Deqing
8

Es posible que su terminal no transmita "correctamente" el Alt-D. Puede usar CV para enviar la secuencia de escape real a Vim y usarla para crear su mapeo. Es decir, edite su .vimrc y reemplace el actual escribiendo la siguiente secuencia "CV Alt-D" para que tenga la secuencia de escape correcta en su vimrc. Eso no funcionará si su terminal no envía nada a vim.

mb14
fuente
8

Mi terminal produciría ^[xcomandos (por ejemplo, para alt-x). Lo que hizo que funcionara dentro de Vim fue 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 corregir todas las asignaciones de teclas alt.

laktak
fuente
1

como seguimiento a la respuesta de Bruno para los usuarios de Mac, intente asegurarse de que su clave de opción esté asignada a Esc+.

Esto le dará el comportamiento "normal" de la Atecla option ( ) en Vim.

Por ejemplo, en iterm2, esta opción se puede encontrar en Preferences > Profiles > Keys:

captura de pantalla de preferencias de iterm2

axelyung
fuente
También tuve que cambiar la configuración nnoremap <Esc>j :m .+1<CR>==y similar ...
mihaipopescu
0

Hola, después de una buena solución después de años de probar todo lo anterior en Mac, seguí buscando.

Aquí está mi solución:

Para crear una combinación de teclas que incluya Alt, debe declarar la combinación en la preferencia> teclado y usar esa combinación en el archivo de configuración de vim (marque la opción de uso como tecla meta).

La salida debe ser un carácter inusual (no, apor ejemplo) para que no anule un carácter regular.

En el siguiente ejemplo, debería poder hacer vim con ALT-Up.

configuración de vim: ajuste de vim

configuración de mac: configuración de mac

MC F
fuente