Come posso aggiungere ulteriori regole di evidenziazione della sintassi nel mio vimrc locale?


11

Ho installato gvim su Fedora e Win7. Ho scoperto che sia vim che gvim su Fedora non hanno evidenziato il nome della funzione nel codice c mentre gvim su win7 lo ha evidenziato.

Ho scoperto che su win7, vim73/syntax/c.vimha le righe aggiuntive alla fine:

syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
hi cFunction gui=NONE guifg=#B5A1FF

Se aggiungo queste righe c.vimsu Fedora, anche gvim può evidenziare il nome della funzione.

Per mantenere la portabilità, voglio solo modificare il .vimrcper evidenziare il nome della funzione. Tuttavia, dopo aver aggiunto queste righe in .vimrc, non ha funzionato.

Quindi qualcuno può aiutarmi? Ho fatto una ricerca e ci sono molte soluzioni per evidenziare i nomi delle funzioni in vim. Ma sono solo curioso di sapere come far funzionare queste linee .vimrc. Grazie mille!


5
Prova ~/.vim/after/syntax/c.viminvece ad aggiungerlo a .
muru,

@muru Sì, funziona. Ma che ne dici di aggiungerlo a .vimrc?
Tamlok,

Probabilmente dovresti usare qualcosa del genere autocmd BufEnter *.c hl ..., ma dovresti tenerlo dentro after/syntax/c.vim. Qualsiasi versione moderna di Vim capirà la .vim/after/directory. Su Windows, il percorso dovrebbe essere vimfiles/after/..., quindi la portabilità non dovrebbe essere un grosso problema (soprattutto se si utilizzano plug-in).
Muru,

Risposte:


14

Tuttavia, dopo aver aggiunto queste righe in .vimrc, non ha funzionato.

Il motivo è che Vim cancella gli elementi di sintassi esistenti quando si imposta l' 'syntax'opzione. Questo perché mantenere gli elementi della vecchia sintassi porterebbe a situazioni strane; se hai un buffer che ha syntax=fooe usa set syntax=bar, finirai con un buffer che ha l'evidenziazione della sintassi per entrambi foo e bar.

All'avvio di Vim carica vimrcuna volta (all'avvio), ma carica i file del tipo di file e della sintassi ogni volta che vengono impostate le opzioni filetypeo syntax, che ripristinerà i valori impostati in vimrc.

Anche se non lo ripristinasse, non sarebbe una buona idea aggiungerlo a Vimrc, poiché si applicherebbe a tutti i buffer e non solo ai buffer syntax=c.


Il testo seguente presuppone Vim su un sistema Unix-y, ma funzionerà anche per gli utenti Neovim e Windows:

  • Gli utenti Neovim dovrebbero sostituire ~/.vim/con ~/.config/nvim/.
  • Gli utenti Windows devono sostituire ~/.vim/con %USERPROFILE%\vimfiles\.

Sostituzione di un intero file

Il modo più semplice per cambiare qualcosa è semplicemente ignorarlo . Per fare ciò, crea un file in ~/.vim/<file>.vim.

<file.vim>è il percorso relativo a $VIMRUNTIME(comprese le sottodirectory). Nel tuo esempio, dovrebbe essere syntax/c.vim. Verrà caricato al posto del file $VIMRUNTIME.

Il risultato è che è più semplice apportare modifiche: a volte modificare i file di sintassi in uscita può essere un po 'complicato. Il rovescio della medaglia è che non otterrai aggiornamenti futuri nel file di sistema.

Lo uso spesso come punto di partenza per sperimentare i file di sintassi e successivamente estrarre le modifiche locali in un'aggiunta locale utilizzando uno dei metodi descritti di seguito.

Aggiunte locali

Esistono due modi per aggiungere aggiunte locali ai file di sintassi, sono funzionalmente identici e puoi usare il metodo che preferisci.

Syntax autocmd

Usa Syntaxautocmd:

augroup ft_c
    autocmd!
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    autocmd Syntax c syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    autocmd Syntax c hi cFunction gui=NONE guifg=#B5A1FF
augroup end

Si noti che concatenare diversi comandi |è problematico qui, poiché tendono ad essere interpretati come parte del :syncomando, motivo per cui ho ripetuto autocmd Syntax cpiù volte. Un'alternativa sarebbe usare una funzione:

fun s:c()
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>[^()]*)("me=e-2 
    syn match cFunction "\<[a-zA-Z_][a-zA-Z_0-9]*\>\s*("me=e-1 
    hi cFunction gui=NONE guifg=#B5A1FF
endfun

augroup ft_c
  autocmd!
  autocmd Syntax c call s:c()
augroup end

Il vantaggio è che tutte le modifiche possono essere contenute in un singolo file. Lo svantaggio è che è un po 'brutto, soprattutto se hai molti cambiamenti.

dopo la directory

Utilizzare la directory dopo-: ~/.vim/after/<file>.vim.

Questo verrà caricato dopo <file>.vimhas, dove si <file.vim>trova il percorso relativo $VIMRUNTIME(comprese le sottodirectory). Nel tuo esempio, dovrebbe essere syntax/c.vim.

Vedere anche :help after-directory.

Il vantaggio è che è un po 'più leggibile rispetto a autocmd, soprattutto se si hanno molte modifiche. Lo svantaggio è che dovrai copiare su un file aggiuntivo se vuoi rispecchiare la tua configurazione di Vim su macchine diverse (questo è un motivo importante per cui molte persone conservano i loro file Vim in un repository GitHub, quindi può essere facilmente replicato su tutte le macchine ).

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.