¿Cómo depurar un mapeo?


66

Veo muchas preguntas aquí donde un usuario tiene un mapeo que no funciona y la mayoría de las veces las razones son bastante similares.

Sugiero hacer de esta pregunta una referencia para este tipo de preguntas, para dar un procedimiento completo para depurar un mapeo. Si un usuario tiene un problema con un mapeo, podría ser redirigido aquí para eliminar los problemas más comunes.

Por supuesto, todavía habrá casos particulares que requerirán una pregunta específica y no se abordarán aquí.

Respuestas:


90

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:

resultado de <code>: map </code>

Como siempre el doctor es tu amigo: :h map-listing

Puede ver en la primera columna el modo de la asignación ( npara el modo normal, vpara 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 noremá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 :mapcomando 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 .vimrcy la segunda una asignación creada por un complemento:

Conjunto de mapas de vimrc

Conjunto de mapas desde 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 .vimrcarchivo 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 :mapmuestra 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.confsi 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 .vimrcel 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é? noresignifica non-recursivemapeo, 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 :mapy: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. :iunmapeliminará 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


2
Para compartir mi experiencia con otros usuarios como nuestro moderador sugirió hacer . Y porque, 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 similarcomo 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.
statox

1
Un problema recurrente con vim-latex y teclados franceses: <m-i>y éson los mismos para vim, y es lo mismo con todas las teclas meta +: están asociadas a un diacrítico diferente.
Luc Hermitte

1
También es importante saber cómo leer las asignaciones locales de búfer cuando solicitamos su definición con :map {sequence}-> hay un *resaltado inverso en lo que vim imprime antes de la acción asociada.
Luc Hermitte

2
A veces realmente queremos depurar lo que sucede. Normalmente, cuando la asignación llama a una asignación de conexión, o una función con un nombre imposible de recordar o con parámetros complejos. En ese caso, podemos ejecutar: :debug normal {keysequence}(sin ningún tipo de explosión), o :debug i{keysequence}para la inserción de las asignaciones de modo, etc. Si la secuencia de teclas contiene cosas como teclas especiales ( <cr>, <left>, <c-x>, <m-i>, <leader>...). Entonces necesitamos jugar con execute + double-quotes + backslash -> :debug execute "normal \<leader>\<cr>Z".
Luc Hermitte

2
Con respecto a las meta-secuencias, este es un viejo punto de preguntas frecuentes ya que vim-latex eligió usar cosas como <m-i>. La mayoría de los usuarios no usan la meta clave, ya que están fuertemente orientados a ejecutar Vim en el terminal, donde la meta clave no se puede usar simplemente. Necesitamos usar gvim o macvim para notar el problema.
Luc Hermitte
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.