Come eseguire il debug di una mappatura?


66

Vedo molte domande qui su dove un utente ha una mappatura che non funziona e il più delle volte i motivi sono abbastanza simili.

Suggerisco di fare di questa domanda un riferimento per questo tipo di domande, per fornire una procedura completa per il debug di una mappatura. Se un utente ha un problema con una mappatura, potrebbe essere reindirizzato qui per eliminare i problemi più comuni.

Naturalmente ci saranno ancora casi particolari che richiederanno una domanda dedicata e non verranno affrontati qui.

Risposte:


90

La tua mappatura non fa ciò che dovrebbe fare o si comporta in modo diverso dal previsto, per risolvere questo problema sono necessari diversi passaggi:

Verifica che la chiave sia effettivamente mappata su ciò che dovrebbe fare

Vim fornisce un comando :map. Per impostazione predefinita (quando non viene fornito alcun argomento) il comando mostrerà tutti i mapping attualmente creati. Ecco un esempio del risultato del comando:

risultato di <code>: map </code>

Come sempre il documento è tuo amico: :h map-listing

Puoi vedere nella prima colonna la modalità della mappatura ( nper la modalità normale, vper la modalità visiva, ecc.), La seconda colonna mostra i tasti mappati e l'ultima colonna a cui sono mappati i tasti. Prima che le azioni mappate possano apparire alcuni caratteri aggiuntivi, è importante capirli:

  • * indica che non è rimappabile (ovvero non è una mappatura ricorsiva, vedi know when to use norepiù avanti in questa risposta)
  • & indica che sono rimappabili solo i mapping locali dello script
  • @ indica una mappatura buffer-locale

Quando chiedi aiuto su una mappatura, è una buona cosa aggiungere queste informazioni poiché può aiutare altre persone a capire il comportamento della tua mappatura.

E 'possibile limitare la richiesta di una particolare modalità con le sorelle-comandi :map, come :vmap, :nmap, :omap, etc.

Ora per limitare la tua ricerca alla mappatura problematica puoi passare la sequenza di tasti di cui stai eseguendo il debug come parametro dei comandi, in questo modo:

:map j
:map <Leader>m
:map <F5>

Si noti che la <Leader>chiave verrà sostituita dal suo valore effettivo nell'elenco.

Se il risultato del comando mostra che le tue chiavi sono mappate correttamente, probabilmente significa che il problema non proviene da Vim ma dal tuo terminale o dal tuo ambiente desktop. Vedi la parte Controlla se la tua mappatura è effettivamente intercettata da Vim

Se il risultato del comando mostra che le chiavi non sono mappate correttamente, vedere la parte seguente.

Controlla cosa ha scavalcato la tua mappatura

Un altro comodo utilizzo del :mapcomando è quello di combinarlo con verbose: Ciò richiederà l'ultimo file che ha modificato la mappatura.

Ad esempio, vedi queste due schermate che sono il risultato di :verbose map: la prima è una mappatura modificata dalla mia .vimrce la seconda una mappatura creata da un plugin:

Mappatura impostata da vimrc

Mappatura impostata da un plug-in

Ora, se vedi che un altro script ha modificato la tua mappatura, dovrai vedere se puoi rimuoverla o modificarne il comportamento. (Nota che alcuni plugin forniscono variabili per abilitare / disabilitare i loro mapping, sfortunatamente non tutti i plugin lo fanno)

Se l'ultimo file che ha modificato la mappatura è tuo .vimrc, assicurati che non vi siano altre righe che definiscano anche una mappatura per la stessa chiave. Il .vimrcfile sovrascriverà felicemente qualsiasi mapping con l'ultimo del suo genere nel file.

Controlla se la tua mappatura è effettivamente intercettata da Vim

Diverse situazioni possono indicare che Vim non intercetta la chiave:

  • Il comando :mapmostra che la tua chiave è correttamente mappata ma premendo non fa nulla.
  • La tua mappatura funziona su gVim (GUI) ma non fa nulla nel terminale Vim
  • La mappatura funziona su un emulatore di terminale definito ma non su un altro
  • La mappatura funziona su un sistema operativo definito ma non su un altro.

Probabilmente è causato da una delle due cose seguenti:

  • Qualcosa intercetta la chiave prima di Vim : possono essere diverse applicazioni: il tuo sistema operativo, il tuo ambiente desktop, il tuo emulatore di terminale, Tmux (se lo usi) ...

    Per risolvere questo problema, dovresti:

    • Prova a rimuovere temporaneamente il tuo .tmux.confse usi tmux
    • Fare riferimento al documento del proprio terminale o dell'ambiente desktop.

    Puoi anche fare riferimento a siti gemelli come superutente , Unix e Linux , askUbuntu , ecc ...

    Se questo è il problema, hai due soluzioni: o impieghi (molto) tempo per cambiare il comportamento dell'applicazione che causa il problema o trovi un'altra combinazione di tasti da mappare che non viene intercettata da un'altra applicazione.

  • L'emulatore di terminale non è in grado di gestire la combinazione di tasti che si sta tentando di mappare : gli emulatori di terminale sono implementati in modo diverso e alcuni di essi non sono in grado di gestire una particolare combinazione di tasti. (Il motivo per cui non possono farlo non rientra nell'ambito di questa domanda, consultare il loro documento o i siti gemelli menzionati prima per maggiori dettagli).

    In questo caso, non hai molte soluzioni: o cambi la chiave per un'altra che è gestita correttamente dal tuo terminale o cambi l'emulatore di terminale.

Verifica le insidie ​​comuni

Alcuni problemi nelle mappature sono piuttosto ricorrenti e principalmente legati alla sintassi di vimscript. Se la tua mappatura ha un comportamento inaspettato, ricorda di controllare i seguenti punti:

  • Non inserire un commento sulla stessa riga della tua mappatura , invece metti il ​​commento sulla riga sopra. Esempio:

    Non farlo:

    inoremap ii <esc>    " ii to go back into normal mode
    

    Vim considererà gli spazi bianchi, il "e il commento come parte della mappatura che si tradurrà in un comportamento inaspettato.

    Invece fallo:

    " ii to go back into normal mode
    inoremap ii <esc>
    

    È più facile da leggere e non rovinerà la tua mappatura.

  • Non inoltrare i tuoi comandi con| . Esempio:

    Non farlo:

    nnoremap <Leader>x :w | !% python -m json.tools
    

    Vim considererà la pipe |come una terminazione del comando: quando si genera .vimrcla mappatura nnoremap <Leader>x :wverrà creata, !% python -m json.toolsverrà eseguito il comando esterno .

    Invece fallo:

    nnoremap <Leader>x :w <bar> !% python -m json.tools
    

    Vedi una spiegazione in merito<bar> .

  • Sapere quando usare nore: sempre .

    LearnVimscriptTheHardWay spiegarlo abbastanza chiaramente: non utilizzare mai map, nmap, vmap, ecc ... preferiscono sempre la versione Nore: noremap, nnoremap, vnoremap, ecc ... Perché? noresta per non-recursivemappatura significa che il lato destro della mappatura verrà considerato come la funzione integrata anche se lo hai rimappato. Esempio:

    Diciamo che si desidera mappare >per eliminare una linea e -aumentare il rientro di una linea. Se non usi mappature non ricorsive, lo farai:

    ( Non farlo per l'esempio )

    nmap > dd
    nmap - >
    

    Quando colpirai la >tua linea verrà eliminata, va bene. Ma quando colpirai la -tua linea verrà anche eliminata invece di essere rientrata. Perché? Perché Vim ha capito "Ho ricevuto un hit su -cui dovrei tradurre in >cui, a sua volta, dovrei tradurre dd".

    Invece fallo

    nnoremap > dd
    nnoremap - >
    

    In questo modo Vim tradurrà -come >e non proverà a fare altre traduzioni a causa del nore.

    Modifica nota "Sempre" può essere una risposta esagerata in alcuni casi è necessario utilizzare il modulo di mappatura ricorsiva ma non è molto comune. Per chiarire, citerò @romainl da questa risposta :

    Utilizzare una mappatura ricorsiva solo se si intende utilizzare qualsiasi altra mappatura nella mappatura. Se non lo fai, utilizza i mapping non ricorsivi.

  • Ricorda che alcune combinazioni di tasti sono equivalenti : a causa dei codici esadecimali prodotti alcune combinazioni di tasti verranno interpretate da Vim come un'altra chiave. Per esempio

    • <C-h> è equivalente a <backspace>
    • <C-j> come <enter>
    • Sulle tastiere francesi <M-a>è lo stesso áe lo stesso vale per tutte le <m-mappature. Come ha sottolineato @LucHermitte nel commento, si tratta di un problema con i plugin che utilizzano questo tipo di mappature come vim-latex.
    • <C-S-a>è equivalente a <C-a> . La mappatura di Ctrl + lettere maiuscole separatamente da Ctrl + lettere minuscole non è possibile a causa del modo in cui i terminali inviano i codici ASCII.

    Quando la tua mappatura sembra influenzare un'altra chiave, prova ad usare un'altra combinazione di lhs, se questo risolve il problema controlla quali codici esadecimali vengono inviati a Vim.

  • Verifica che il tuo leader sia definito correttamente : se i tuoi mapping che coinvolgono<leader>non funzionano e hai cambiato il tuo leader con il comandomapleader, controlla che la definizione del tuo leader sia fatta prima della definizione dei mapping. Altrimenti, Vim proverà a creare mappature con una chiave che non è quella che pensi. Inoltre, se vuoi usare la barra spaziatrice come leader (che è piuttosto attuale) assicurati di aver usato la notazione corretta:let mapleader = "\<Space>"

La tua mappatura continua a non funzionare?

Se hai seguito tutti i passaggi di questa risposta e la tua mappatura continua a non funzionare come desideri, probabilmente vorrai chiedere aiuto su questo sito.

Per aiutare le persone ad aiutarti a ricordare di fornire alcune informazioni cruciali come:

  • Il comando che hai usato per definire la tua mappatura.
  • Cosa ti aspetti che faccia la tua mappatura.
  • Una descrizione precisa del problema:

    "Non funziona" non sarà molto utile per le persone che cercheranno di aiutarti. Dovresti specificare se la mappatura non fa nulla o come si comporta in modo diverso da quello che ti aspettavi.

  • Indica anche che hai effettivamente seguito i passaggi descritti qui e i risultati ottenuti con :mape:verbose map

Tutto ciò farà risparmiare molto tempo a te e agli utenti del sito.


Un comando utile: :unmap

A volte può essere utile ripristinare una mappatura senza uscire da Vim per facilitare il debug del suo comportamento.

Per fare ciò è possibile utilizzare il comando :unmap <key>che rimuoverà la mappatura assegnata <key>per le modalità Normale, Visiva e Operativa in sospeso. :iunmaprimuoverà i mapping per la modalità Inserisci. Per altre modalità vedi :help :unmap.


Riferimenti

Un'eccellente introduzione alla mappatura: learnvimscriptthehardway (E molti altri aspetti di Vim)

La Doc: :h mapping, :h :map

La sezione 20 delle FAQ di Vim riguarda la mappatura e contiene domande interessanti:

E un bonus: una domanda sulle migliori pratiche per trovare quali chiavi usare nella tua mappatura


2
Per condividere la mia esperienza con altri utenti come suggerito dal nostro moderatore . E perché, 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 similarcome ho detto nella prima riga della mia domanda, la raccolta di questi motivi dovrebbe consentire di ridurre il numero di domande duplicate sulla mappatura.
statox

1
Un problema ricorrente con vim-latex e tastiere francesi: <m-i>e ésono uguali per vim, ed è lo stesso con tutti i tasti meta +: sono associati a un diverso diacritico.
Luc Hermitte,

1
È anche importante sapere come leggere le mappature buffer-locali quando chiediamo la loro definizione con :map {sequence}-> c'è un *punto culminante al contrario in ciò che vim stampa prima dell'azione associata.
Luc Hermitte,

2
A volte vogliamo davvero eseguire il debug di ciò che accade. In genere quando la mappatura chiama una mappatura plug-in o una funzione con un nome impossibile da ricordare o con parametri complessi. In questo caso siamo in grado di eseguire: :debug normal {keysequence}(senza botto), o :debug i{keysequence}per mappature modalità di inserimento, ecc Se la sequenza di tasti contiene cose come tasti speciali ( <cr>, <left>, <c-x>, <m-i>, <leader>...). Quindi dobbiamo giocare con execute + double-quotes + backslash -> :debug execute "normal \<leader>\<cr>Z".
Luc Hermitte,

2
Per quanto riguarda le meta-sequenze, questo è un vecchio punto di FAQ in quanto vim-latex ha scelto di usare cose come <m-i>. La maggior parte degli utenti non usa la meta-chiave poiché sono fortemente orientati all'esecuzione di Vim nel terminale, dove la meta-chiave non può essere utilizzata semplicemente. Dobbiamo usare gvim o macvim per notare il problema.
Luc Hermitte,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.