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

9

我定义了一个自定义文件类型,代码如下:

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个回答

9

更新: 我之前的回答是错误的,你可以使用一个区域来实现这个,只需执行以下操作

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

1
太棒了!谢谢,我知道在浏览vim帮助时看到过那个命令,但总是在需要的时候找不到。 - sixtyfootersdude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接