考慮以下3套高亮組和語法匹配:爲什麼nextgroup不匹配換行而沒有結尾空白?
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
例子驗證\_s
匹配換行符,所以爲什麼不這樣工作時Baz
分爲Foo
和Filler
?這從:help syn-skipnl
報價是相關的:
當「skipnl」存在,與之相匹配的nextgroup可能會在未來 線被發現。只有當前項目在當前 行結束時纔會發生!當「skipnl」不存在時,只有在同一行中的當前項目 之後纔會找到下一個組。
的Abc
Xyz
例如,使用skipwhite
skipnl
和不完全\_s
,確實在這兩種情況下匹配。這是否意味着EOL
不符合「在同一行中的當前項目之後」?當然,它不能成爲下一行的一部分?這似乎與以下事實相矛盾:正常搜索\_s
或\n
導致EOL
字符在同一行上匹配。
我不完全相信你問什麼。你的截圖中的結果似乎與你想要做的相匹配(正如我從你的代碼中理解的那樣)。 – romainl
我不明白爲什麼'Filler'與第2行的'EOL'不匹配,這會導致'Bar'與第3行匹配。 –