2014-11-05 14 views
7

Ho scoperto un caso limite interessante nell'evidenziazione della sintassi Vim. Si consideri il seguente frammento da un Makefile società:Vim: Riavvia sintassi Evidenziazione da linea arbitraria

LDSCRIPT := $(subst ",,$(CONFIG_SYS_LDSCRIPT)) 

La linea di cui sopra semplicemente rimuove le virgolette da un dato LDSCRIPT. Niente sintatticamente sbagliato; la marca funziona come previsto e senza problemi.

Il problema

Dal momento che la linea di cui sopra contiene solo un doppio apice, le regole di evidenziazione pensano erroneamente che il resto del corpo del Makefile è citato il testo ed i colori come tale. Per i Makefile semplici, questo è un inconveniente; per 1KLOC + Makefile, questo diventa un vero problema (specialmente dal momento che questa pre-elaborazione si trova vicino alla parte superiore del file).

La questione

Esiste un modo per entrambi i sintassi disattivare l'evidenziazione basa su linee che corrispondono a una certa data espressione regolare (ad es. subst[ \t]*['"],.*) o qualcosa di simile? In caso contrario, c'è un modo per riavviare l'evidenziazione di Vim su una linea arbitraria preservando i punti salienti sopra?

Se possibile, mi piacerebbe evitare le modifiche al Makefile in quanto questo script è condiviso su più reparti.

Sono disposto a scrivere/modificare vimscript per ottenere ciò, tuttavia non l'ho ancora fatto prima (in misura ragionevole). Qualsiasi suggerimento, suggerimento o altro suggerimento utile sarebbe molto apprezzato.

quello che ho provato

:syntax sync minlines=1 
:syntax sync fromstart 
:syntax sync clear 

Nessuno dei precedenti sembra avere alcun effetto sul evidenziazione quando viene eseguito nell'editor. Guardando attraverso i documenti di aiuto di Vim, sembra che :syn-sync-fourth possa essere in grado di fare ciò che sto cercando, tuttavia non sono sicuro di come funzioni in modo inverso (ad esempio per disabilitare l'evidenziazione piuttosto che applicarla).

+0

Ricerca cercata e, infine, mi hai aiutato capo :) –

risposta

3

Penso che il meglio che si può fare è aggiungere una regola di sintassi aggiuntiva (in ~/.vim/after/syntax/make.vim) per abbinare il costrutto offendente. Questo sembra funzionare:

syn match makeIgnore /subst[ \t]*['"],,/ containedin=makeIdent 

Il containedin= è necessaria perché è utilizzato in un $(...) costrutto.

+0

Impressionante, che ha funzionato come un fascino. Una differenza minore specifica della piattaforma: sul mio box Fedora 18 il file da modificare è '/ usr/share/vim/vim73/syntax/make.vim'. – phobos51594

+0

Non modificare i file di sistema forniti dal pacchetto! Perderai le modifiche al prossimo aggiornamento. Se è assolutamente necessario modificare il file originale, creare un clone in '~/.vim/syntax/make.vim'. Ma per il, l'uso del _after_ location ha funzionato bene, non c'è bisogno di fare confusione con la sceneggiatura originale. –

+0

Ci scusiamo per il ritardo; era fuori dal paese. Ho provato ad aggiungere solo la riga sopra a '~/.vim/after/syntax/make.vim' (ho dovuto creare il file in primo luogo), ma non sembrava funzionare. Devo copiare il sistema 'make.vim' nella mia posizione di casa e modificarlo? – phobos51594