2010-03-17 93 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