2010-03-17 65 views
6

我與這些線定義自定義文件類型:Vim的語法高亮:使區域只匹配在一行

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 

我附上我所有的標題中這樣的文件是這樣的:

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

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

    bla bla bla // this will be normally formatted 

但是現在,當我在代碼中使用等號時,它認爲它是一個標題。無論如何,我可以強制一場比賽只在一條線上?

回答

6

UPDATE:我以前的答案是錯的,你可以用一個區域做到這一點,只是做

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

:help syn-oneline:help syn-arguments。猜猜它顯示我現在不能真正運行vim,恩?


以前的答案

根據我的:help syntax的閱讀,沒有辦法與區域做到這一點。但是,你可以用一個SYN-比賽做到這一點:

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

/=\@<!/說,有立即沒有=你的比賽前,和/=\@!/說,有後未=,所以這個匹配一個=,一堆非=(不包括換行符 - 要包括換行符,它必須是\_[^=]),然後只有一個=

其餘的都是類似

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

你仍然可以做SYN-比賽中的比賽,因此,如果您有任何嵌套回事,它仍然會正常工作。

例如

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

真棒!謝謝,我知道在瀏覽vim幫助文件時,我在某處看到了這個oneline,但是當你需要它時,你永遠找不到任何東西。 – sixtyfootersdude 2010-03-17 15:57:34