考虑以下 3 组高亮组和语法匹配:
hi Foo ctermfg=black ctermbg=red guifg=black guibg=red
hi Filler ctermfg=black ctermbg=green guifg=black guibg=green
hi Bar ctermfg=black ctermbg=blue guifg=black guibg=blue
syn match Foo "foo" nextgroup=Filler
syn match Filler "\_s*" nextgroup=Bar contained
syn match Bar "bar" contained
hi Baz ctermfg=black ctermbg=cyan guifg=black guibg=cyan
hi Qux ctermfg=black ctermbg=yellow guifg=black guibg=yellow
syn match Baz "baz\_s*" nextgroup=Qux
syn match Qux "qux" contained
hi Abc ctermfg=black ctermbg=magenta guifg=black guibg=magenta
hi Xyz ctermfg=black ctermbg=white guifg=black guibg=white
syn match Abc "abc" nextgroup=Xyz skipwhite skipnl
syn match Xyz "xyz" contained
Filler
并且Bar
仅在Foo
;之后匹配 同样,Qux
仅在 之后Baz
,并且Xyz
仅在 之后Abc
。:set list
为了清楚起见,以下示例说明了除非有尾随空格,否则如何匹配Filler
和Bar
不匹配:Foo
Foo
该Baz
Qux
示例验证匹配换行符,那么为什么在拆分为and\_s
时这不起作用?这句话是相关的:Baz
Foo
Filler
:help syn-skipnl
当存在“skipnl”时,下一行可能会找到与 nextgroup 的匹配项。这只发生在当前项目在当前行的末尾结束时!当“skipnl”不存在时,下一个组只会在同一行中的当前项目之后找到。
该Abc
Xyz
示例完全使用skipwhite
skipnl
和不使用\_s
,确实在这两种情况下都匹配。这是否意味着EOL
不符合“在同一行中的当前项目之后”的条件?当然它不能成为下一行的一部分?这似乎与正常搜索\_s
或\n
导致EOL
字符在同一行匹配的事实相矛盾。