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

six*_*ude 7 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
Run Code Online (Sandbox Code Playgroud)

我将所有标题都附在这样的文件中:

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

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

    bla bla bla  // this will be normally formatted
Run Code Online (Sandbox Code Playgroud)

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

ram*_*ion 7

更新:我之前的回答是错误的,你可以用一个地区来做,只是做

syn region SubSubtitle start=+=+ end=+=+ oneline
Run Code Online (Sandbox Code Playgroud)

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


以前的答案

根据我的阅读:帮助语法,就没有办法用一个区域来做到这一点.但是,您可以使用syn-match执行此操作:

syn match SubSubtitle /=\@<!=[^=]*==\@!/
Run Code Online (Sandbox Code Playgroud)

/=\@<!/说,没有有=立即的比赛之前,和/=\@!/说不准有=后,所以这个匹配一个=,一堆非=(不包括换行符-包括换行符它必须是\_[^=]),那么只有一个=.

其余的相似

syn match Subtitle    /=\@<!=\{2}[^=]*=\{2}=\@!/
syn match Title       /=\@<!=\{3}[^=]*=\{3}=\@!/
syn match MasterTitle /=\@<!=\{4}[^=]*=\{4}=\@!/
Run Code Online (Sandbox Code Playgroud)

你仍然可以在syn-matches中进行匹配,所以如果你有任何嵌套,它仍然可以工作.

例如

syn match Todo /\<TODO\>/ containedin=SubSubtitle,Subtitle,Title,MasterTitle contained
Run Code Online (Sandbox Code Playgroud)