2009-07-31 9 views
12

In VIM, ho bisogno di eseguire un compito semplice - evidenziare "(" e ")". Posso farlo facilmente con l'emissione di due comandi:Come sovrascrivere l'evidenziazione della sintassi predefinita in vim?

:syn match really_unique_name display "[()]" 
:hi really_unique_name guifg=#FF0000 

Ma se aggiungo stessi comandi (senza ':' ovviamente) per svuotare Vimrc e riavviare VIM - "(" e ")" non sono evidenziati più nei file .cpp. Sembra che se creo/carichi il file .cpp, VIM carica il file di sintassi per esso che sovrascrive i miei highlight personalizzati. Come posso configurare le evidenziazioni nel mio file .vimrc in modo che avvenga dopo le definizioni di sintassi standard o non sia influenzato dalla definizione di sintassi standard?

risposta

24

Ci sono quattro opzioni (due dei quali sono stati suggeriti da altri):

  1. utilizzare la struttura after in vimfiles (~/.vim/dopo/sintassi/cpp.vim):

    :help after-directory 
    
  2. Utilizzare partita per la finestra corrente:

    :match really_unique_name "[()]" 
    
  3. Usa matchadd(), ancora una volta per la finestra corrente, ma questo consente di eliminare singole partite se in seguito bisogno di:

    :call matchadd('really_unique_name', "[()]") 
    " Or 
    :let MyMatchID = matchadd('really_unique_name', "[()]") 
    " and then if you want to switch it off 
    :call matchdelete(MyMatchID) 
    
  4. Installare rainbow.vim plug-in del dottor Chip per ottenere doppietta mettendo in evidenza in diversi colori a seconda del livello di indentazione.

Per questa situazione, io consiglierei l'opzione 1 in quanto sembra che si vuole rendere parte della sintassi generale. Se si desidera utilizzare le partite e si desidera che siano tampone specifico (anziché finestra specifica), avrete bisogno di qualcosa di simile:

function! CreateBracketMatcher() 
    call clearmatches() 
    call matchadd('really_unique_name', "[()]") 
endfunc 
au BufEnter <buffer> call CreateBracketMatcher() 

Per ulteriori informazioni, vedere:

:help after-directory 
:help :match 
:help matchadd() 
:help matchdelete() 
:help clearmatches() 
:help function! 
:help autocmd 
:help autocmd-buffer-local 
:help BufEnter 

Si può anche essere interessato alla mia risposta a this question, che copre più generale evidenziazione dell'operatore.

+0

Grazie per "au BufEnter", funziona perfettamente su Windows e Macos box (ciao non funziona su macos box - viene cancellato in qualche modo dopo che .vimrc viene elaborato). – grigoryvp

+0

L'autocomposizione locale del buffer deve essere creata solo dopo l'apertura del buffer. Nessuno dei suggerimenti che ho elencato dovrebbe essere in .vimrc: utilizzare vimfiles/after/syntax/cpp.vim o una delle opzioni simili. In alternativa, è possibile fonderlo con "au BufEnter, BufNew, BufReadPost * .cpp chiama CreateBracketMatcher()", ma è un po 'un fudge. – DrAl

+0

@DrAl Ho appena scritto uno snippet http://vimrcfu.com basato sulla risposta: http://vimrcfu.com/snippet/197 Grazie! –

4

Invece di utilizzare la corrispondenza syn, utilizzare solo la corrispondenza. es:

hi really_unique_name guifg=#FF0000 
match really_unique_name "[()]" 

match ha priorità più alta rispetto syn-match (es: la sua evidenziazione sovrascrive l'evidenziazione generato da syn-match), e file di sintassi (ben educati) non dovrebbe pasticciare con essa.

L'unica avvertenza con la corrispondenza è che è per finestra, piuttosto che per buffer.

Se sono necessarie ulteriori corrispondenze, è possibile utilizzare 2match e 3match.

Vedere :help :match in Vim per maggiori informazioni.

+0

Grazie. Funziona bene sulla mia finestra di Windows. Ma su MacOS BOX "hi really_unique_name guifg = # FF0000" non funziona. Anche se si tratta di una sola riga in una .vimrc, dopo aver avviato vim e aver fatto "hi really_unique_name", vedo "really_unique_name xxx clear". Perché è "cancellato"? – grigoryvp

9

Mettere le impostazioni in ~/.vim/dopo/sintassi/cpp.vim

+0

Hmmm, sembra una buona soluzione. Ma non funziona per me ... http://stackoverflow.com/questions/2464593/custumizing-syntax-highlighting-in-vim – sixtyfootersdude

2

faccio di solito in questo modo:

:hi really_unique_name guifg=#FF0000 
:au BufNewFile,BufRead * :syn match really_unique_name display "[()]" 

au sta per autocmd. Aiuto dirà di più.

+0

scusa, in due righe ... per un po 'di errore è stato rimosso il mio invio ... – Peter

Problemi correlati