Su mapeo no hace lo que debería hacer o se comporta de manera diferente a lo esperado, se deben seguir varios pasos para solucionarlo:
Verifique que la clave esté efectivamente asignada a lo que debería hacer
Vim proporciona un comando :map
. De forma predeterminada (cuando no se proporciona ningún argumento), el comando mostrará todas las asignaciones creadas actualmente. Aquí hay un ejemplo del resultado del comando:
Como siempre el doctor es tu amigo: :h map-listing
Puede ver en la primera columna el modo de la asignación ( n
para el modo normal,
v
para el modo visual, etc.), la segunda columna muestra las teclas asignadas y la última columna a qué están asignadas las teclas. Tenga en cuenta que antes de las acciones asignadas pueden aparecer algunos caracteres adicionales, es importante comprenderlos:
*
indica que no es reasignable (es decir, no es un mapeo recursivo, ver know when to use nore
más adelante en esta respuesta)
&
indica que solo las asignaciones de script local son reasignables
@
indica una asignación local de búfer
Cuando solicite ayuda sobre un mapeo, es bueno agregar esta información, ya que puede ayudar a otras personas a comprender el comportamiento de su mapeo.
Es posible restringir el símbolo de un modo particular, con las hermanas de comandos :map
, como :vmap
, :nmap
, :omap
, etc.
Ahora, para restringir su búsqueda a la asignación problemática, puede pasar la secuencia de teclas que está depurando como parámetro de los comandos, de esta manera:
:map j
:map <Leader>m
:map <F5>
Tenga en cuenta que la <Leader>
clave se reemplazará por su valor real en la lista.
Si el resultado del comando muestra que sus claves están correctamente asignadas, probablemente significa que el problema no proviene de Vim sino de su terminal o su entorno de escritorio. Vea la parte Verifique si su mapeo es realmente interceptado por Vim
Si el resultado del comando muestra que sus claves no están correctamente asignadas, consulte la siguiente parte.
Comprueba qué anuló tu mapeo
Otro uso conveniente del :map
comando es combinarlo con verbose
: Esto abrirá el último archivo que modificó su mapeo.
Por ejemplo, vea estas dos capturas de pantalla que son el resultado de :verbose map
: la primera es una asignación modificada por my .vimrc
y la segunda una asignación creada por un complemento:
Ahora, si ve que otro script modificó su mapeo, tendrá que ver si puede eliminarlo o modificar su comportamiento. (Tenga en cuenta que algunos complementos proporcionan variables para habilitar / deshabilitar sus asignaciones, desafortunadamente no todos los complementos lo hacen)
Si el último archivo que cambió su asignación es su .vimrc
, asegúrese de que no haya otra línea que también defina una asignación para la misma clave. El .vimrc
archivo anulará felizmente cualquier mapeo con el último de su tipo en el archivo.
Compruebe si su mapeo es realmente interceptado por Vim
Varias situaciones pueden indicar que Vim no intercepta su clave:
- El comando
:map
muestra que su clave está correctamente asignada pero presionarla no hace nada.
- Su mapeo funciona en gVim (GUI) pero no hace nada en el terminal Vim
- Su mapeo funciona en un emulador de terminal definido pero no en otro
- Su mapeo funciona en un sistema operativo definido pero no en otro.
Probablemente sea causado por una de las dos cosas siguientes:
Algo intercepta la clave antes de Vim : pueden ser diferentes aplicaciones: su sistema operativo, su entorno de escritorio, su emulador de terminal, Tmux (si lo usa) ...
Para solucionarlo, debes:
- Intenta eliminar temporalmente tu
.tmux.conf
si usas tmux
- Consulte el documento de su terminal o de su entorno de escritorio.
También puede referirse a sitios hermanos como superusuario ,
Unix y Linux , askUbuntu , etc.
Si este es el problema, entonces tiene dos soluciones: o dedica (mucho) tiempo a cambiar el comportamiento de la aplicación que causa el problema o encuentra otra combinación de teclas para asignar que no es interceptada por otra aplicación.
Su emulador de terminal no puede manejar la combinación de teclas que está tratando de asignar : los emuladores de terminal se implementan de manera diferente y algunos de ellos no pueden manejar alguna combinación de teclas en particular. (La razón por la que no pueden está fuera del alcance de esta pregunta, consulte su documento o los sitios hermanos mencionados anteriormente para obtener más detalles).
En este caso, no tiene muchas soluciones: o cambia su clave por otra que su terminal maneja adecuadamente o cambia su emulador de terminal.
Verifique las trampas comunes
Algunos problemas en las asignaciones son bastante recurrentes y están relacionados principalmente con la sintaxis de vimscript. Si su mapeo tiene un comportamiento inesperado, recuerde verificar los siguientes puntos:
No ponga un comentario en la misma línea que su mapeo , en su lugar, coloque el comentario en la línea de arriba. Ejemplo:
No hagas eso:
inoremap ii <esc> " ii to go back into normal mode
Vim considerará los espacios en blanco, el "
y el comentario como parte de la asignación que dará como resultado un comportamiento inesperado.
En cambio, haz eso:
" ii to go back into normal mode
inoremap ii <esc>
Esto es más fácil de leer y no afectará su mapeo.
No canalice sus comandos con|
. Ejemplo:
No hagas eso:
nnoremap <Leader>x :w | !% python -m json.tools
Vim considerará la tubería |
como una terminación de comando: cuando se crea .vimrc
el mapeo nnoremap <Leader>x :w
, se creará el comando externo !% python -m json.tools
.
En cambio, haz eso:
nnoremap <Leader>x :w <bar> !% python -m json.tools
Ver una explicación sobre<bar>
.
Sepa cuándo usar nore
: siempre .
LearnVimscriptTheHardWay explicarlo con bastante claridad: no utilice nunca map
, nmap
, vmap
, etc ... Siempre es preferible la versión Nore: noremap
, nnoremap
, vnoremap
, etc ... ¿Por qué? nore
significa non-recursive
mapeo, significa que el lado derecho del mapeo se considerará como la característica incorporada, incluso si lo remapeó. Ejemplo:
Supongamos que desea asignar >
para eliminar una línea e -
incrementar la sangría de una línea. Si no utiliza asignaciones no recursivas, lo hará:
( No hagas eso es por ejemplo )
nmap > dd
nmap - >
Cuando llegue a >su línea se eliminará, eso es bueno. Pero cuando llegue a -su línea también se eliminará en lugar de sangrarse. ¿Por qué? Porque Vim entendió "Recibí un hit al -
que debería traducir, al >
que, a su vez, debería traducir dd
".
En cambio haz eso
nnoremap > dd
nnoremap - >
De esta manera, Vim traducirá -
como >
y no intentará hacer ninguna otra traducción debido a nore
.
Editar nota "Siempre" puede ser una respuesta exagerada, en algunos casos necesitará usar el formulario de mapeo recursivo, pero no es muy común. Para aclarar, citaré @romainl de esta respuesta :
Use un mapeo recursivo solo si tiene la intención de usar cualquier otro mapeo en su mapeo. Utilice asignaciones no recursivas si no lo hace.
Recuerde que algunas combinaciones de teclas son equivalentes : debido a los códigos hexadecimales que se producen, Vim interpretará algunas combinaciones de teclas como otra clave. Por ejemplo
<C-h>
es equivalente a <backspace>
<C-j>
como <enter>
- En los teclados franceses
<M-a>
es lo mismo á
y lo mismo ocurre con todas las
<m-
asignaciones. Como @LucHermitte señaló en el comentario que es un problema con los complementos que utilizan este tipo de asignaciones como vim-latex.
<C-S-a>
es equivalente a
<C-a>
. La asignación de Ctrl + letra mayúscula por separado de Ctrl + letra minúscula no es posible debido a la forma en que los terminales envían códigos ASCII.
Cuando su asignación parece afectar a otra tecla, intente usar otra combinación de lhs, si eso resuelve el problema, inspeccione qué códigos hexadecimales se envían a Vim.
Verifique que su líder esté correctamente definido : si sus asignaciones involucradas<leader>
no funcionan y cambió su líder con el comandomapleader
, verifique que la definición de su líder se realice antes de la definición de las asignaciones. De lo contrario, Vim intentará crear asignaciones con una clave que no sea la que usted piensa. Además, si desea utilizar la barra espaciadora como su líder (que es bastante actual), asegúrese de utilizar la notación correcta:let mapleader = "\<Space>"
¿Tu mapeo aún no funciona?
Si siguió todos los pasos de esta respuesta y su mapeo aún no funciona como desea, es probable que desee pedir ayuda en este sitio.
Para ayudar a las personas a ayudarlo, recuerde proporcionar información crucial como:
- El comando que usó para definir su mapeo.
- Lo que espera que haga su mapeo.
Una descripción precisa del problema:
"No funciona" no será realmente útil para las personas que intentarán ayudarlo. Debe precisar si el mapeo no hace nada o cómo se comporta de manera diferente a lo que esperaba.
- Indique también que realmente siguió los pasos descritos aquí y los resultados que obtiene
:map
y:verbose map
Todo esto le ahorrará a usted y a los usuarios del sitio mucho tiempo.
Un comando útil: :unmap
A veces puede ser útil restablecer una asignación sin salir de Vim para ayudar a depurar su comportamiento.
Para hacerlo, puede usar el comando :unmap <key>
que eliminará la asignación asignada para <key>
los modos Normal, Visual y Operativo pendiente. :iunmap
eliminará las asignaciones para el modo Insertar. Para otros modos ver :help :unmap
.
Referencias
Una excelente introducción al mapeo: learnvimscriptthehardway (y muchos otros aspectos de Vim)
El doc: :h mapping
,
:h :map
La sección 20 de las preguntas frecuentes de Vim trata sobre el mapeo y contiene preguntas interesantes:
Y una ventaja adicional: una pregunta sobre las mejores prácticas para encontrar qué claves usar en su mapeo
I see a lot of questions on here where a user has a mapping which doesn't work and most of the time the reasons are pretty similar
como dije en la primera línea de mi pregunta, reunir estas razones debería permitir reducir el número de preguntas duplicadas sobre el mapeo.