Come sovrascrivere l'evidenziazione della sintassi predefinita in vim?
-
06-07-2019 - |
Domanda
In VIM, devo eseguire un semplice compito: evidenziare " (" e ") " ;. Posso farlo facilmente emettendo due comandi:
:syn match really_unique_name display "[()]"
:hi really_unique_name guifg=#FF0000
Ma se aggiungo gli stessi comandi (senza ':' ovviamente) per svuotare .vimrc e riavviare VIM - " (" e ") " non sono più evidenziati nei file .cpp. Sembra che se creo / carico file .cpp, VIM carica il file di sintassi per esso che sovrascrive i miei momenti salienti personalizzati. Come posso configurare i momenti salienti nel mio file .vimrc in modo che avvenga dopo le definizioni di sintassi standard o non sia influenzato dalla definizione di sintassi standard?
Soluzione
Esistono quattro opzioni (due delle quali sono state suggerite da altri):
-
Usa la struttura
after
in vimfiles (~ / .vim / after / syntax / cpp.vim)::help after-directory
-
Usa la corrispondenza per la finestra corrente:
:match really_unique_name "[()]"
-
Usa matchadd (), di nuovo per la finestra corrente, ma ciò ti consente di eliminare singole corrispondenze se in seguito devi:
:call matchadd('really_unique_name', "[()]") " Or :let MyMatchID = matchadd('really_unique_name', "[()]") " and then if you want to switch it off :call matchdelete(MyMatchID)
-
Installa il plug-in rainbow.vim del Dr Chip per ottenere l'evidenziazione del controvento in diversi colori a seconda del livello di rientro.
Per questa situazione, raccomanderei l'opzione 1 in quanto sembra che tu voglia renderlo parte della sintassi generale. Se si desidera utilizzare le corrispondenze e si desidera che siano specifiche del buffer (anziché specifiche della finestra), è necessario qualcosa del tipo:
function! CreateBracketMatcher()
call clearmatches()
call matchadd('really_unique_name', "[()]")
endfunc
au BufEnter <buffer> call CreateBracketMatcher()
Per ulteriori informazioni, consultare:
:help after-directory
:help :match
:help matchadd()
:help matchdelete()
:help clearmatches()
:help function!
:help autocmd
:help autocmd-buffer-local
:help BufEnter
Potresti anche essere interessato alla mia risposta a questa domanda , che copre l'evidenziazione più generale dell'operatore.
Altri suggerimenti
Metti le impostazioni in ~ / .vim / after / syntax / cpp.vim
Invece di usare syn match, usa solo match. ad esempio:
hi really_unique_name guifg=#FF0000
match really_unique_name "[()]"
match
ha una precedenza maggiore rispetto a syn-match (ovvero: la sua evidenziazione sovrascriverà l'evidenziazione generata da syn-match) e i file di sintassi (ben educati) non dovrebbero confonderlo.
L'unica avvertenza con match è che è per finestra, piuttosto che per buffer.
Se hai bisogno di ulteriori match puoi usare 2match e 3match.
Vedi : help: match
in Vim per maggiori informazioni.
Di solito lo faccio in questo modo:
:hi really_unique_name guifg=#FF0000
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]"
au
sta per autocmd
. L'aiuto dirà di più.