2010-03-17 1 views
6

Ho definito un tipo di file personalizzato con queste righe:Vim evidenziazione della sintassi: rendere regione corrisponde solo su una linea di

syn region SubSubtitle start=+=+ end=+=+ 
highlight SubSubtitle ctermbg=black ctermfg=DarkGrey 

syn region Subtitle start=+==+ end=+==+ 
highlight Subtitle ctermbg=black ctermfg=DarkMagenta 

syn region Title start=+===+ end=+===+ 
highlight Title ctermbg=black ctermfg=yellow 

syn region MasterTitle start=+====+ end=+====+ 
highlight MasterTitle cterm=bold term=bold ctermbg=black ctermfg=LightBlue 

allego tutte le mie voci in questo tipo di documento come questo:

==== Biggest Heading ==== // this will be bold and light blue 

    ===Sub heading === // this will be yellow 

    bla bla bla // this will be normally formatted 

Tuttavia in questo momento quando uso un segno di uguale nel mio codice, pensa che sia un titolo. Esiste comunque la possibilità di forzare una partita su una sola riga?

risposta

6

UPDATE: La mia risposta precedente era sbagliata, si può fare questo con una regione, basta fare

syn region SubSubtitle start=+=+ end=+=+ oneline 

Vedi :help syn-oneline e :help syn-arguments. Suppongo che dimostri che in realtà non posso eseguire vim adesso, hunh?


risposta precedente

Secondo la mia lettura della :help syntax, non c'è modo di fare questo con una regione. Tuttavia, si potrebbe fare questo con un sin-partita:

syn match SubSubtitle /=\@<!=[^=]*==\@!/ 

Il /=\@<!/ dice che non c'è = subito prima della partita, e il /=\@!/ dice che non c'è = subito dopo, quindi questo corrisponde esattamente un =, un gruppo di non- = (escluso newline - per includere newlines dovrebbe essere \_[^=]), quindi esattamente uno =.

Il resto sono simili

syn match Subtitle /=\@<!=\{2}[^=]*=\{2}=\@!/ 
syn match Title  /=\@<!=\{3}[^=]*=\{3}=\@!/ 
syn match MasterTitle /=\@<!=\{4}[^=]*=\{4}=\@!/ 

si può ancora fare le partite entro syn-match, quindi se avete qualsiasi nidificazione in corso, esso continuerà a funzionare.

Per esempio

syn match Todo /\<TODO\>/ containedin=SubSubtitle,Subtitle,Title,MasterTitle contained 
+1

Impressionante! Grazie, sapevo di averlo visto on line da qualche parte mentre sfogliavo l'aiuto di vim ma non riesci mai a trovare le cose quando ne hai bisogno. – sixtyfootersdude