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:
Come sempre il documento è tuo amico: :h map-listing
Puoi vedere nella prima colonna la modalità della mappatura ( n
per la modalità normale,
v
per 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 nore
più 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 :map
comando è 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 .vimrc
e la seconda una mappatura creata da un plugin:
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 .vimrc
file 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
:map
mostra 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.conf
se 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 .vimrc
la mappatura nnoremap <Leader>x :w
verrà creata, !% python -m json.tools
verrà 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é? nore
sta per non-recursive
mappatura 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
:map
e: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. :iunmap
rimuoverà 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
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
come ho detto nella prima riga della mia domanda, la raccolta di questi motivi dovrebbe consentire di ridurre il numero di domande duplicate sulla mappatura.