Vim语法高亮:使区域仅匹配一行

时间:2010-03-17 13:08:05

标签: unix 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

但是现在,当我在我的代码中使用等号时,它认为它是一个标题。反正我是否可以强迫比赛只在一条线上?

1 个答案:

答案 0 :(得分:7)

更新:我之前的回答是错的,您可以使用某个地区执行此操作,只需执行

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

请参阅:help syn-oneline:help syn-arguments。猜猜它表明我现在实际上无法运行vim,嗯?


上一个回答

根据我对:help syntax的解读,没有办法用区域来做到这一点。但是,您可以使用syn-match执行此操作:

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

/=\@<!/表示匹配前没有=/=\@!/表示之后没有=,所以这只匹配一个= ,一堆非=(不包括换行符 - 包含新行必须\_[^=]),然后只有一个=

其余的相似

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

您仍然可以在同步匹配中进行匹配,因此如果您正在进行任何嵌套,它仍然有效。

例如

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