我用以下几行定义了一个自定义文件类型:

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

但是现在,无论何时我在代码中使用等号都认为它是标题。无论如何,我是否可以强制一场比赛只能在一行上进行?

最佳答案

更新:我以前的答案是错误的,您可以使用区域来执行此操作,只需执行

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中进行匹配,因此,如果正在进行任何嵌套,它将仍然有效。

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

关于unix - Vim语法突出显示: make region only match on one line,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2462380/

10-13 09:32