我有以下语法文件:
syn match TaskName /^\[.*\]/
syn match TaskType /^\[.*\]\s*\zs[a-z]*/
syn match TaskDescription /^\[.*\]\s*[a-z]*\s\+\zs.*/
hi def link TaskName Title
hi def link TaskType Todo
hi def link TaskDescription Comment
,上下文是:
Task Type Command
[file-run] local no description
为什么只匹配[file-run]
?
如果我在普通模式下输入/^\[.*\]\s*\zs[a-z]*
,则local
将被匹配。
答案 0 :(得分:1)
不匹配的原因是:syn match
不会尝试
评估已经匹配的文本。因此,它无法与:syn match TaskName
已经匹配的文本匹配。
此外,您的模式还有很多可以改进的地方,
[a-z]*
之类的模式将匹配
到处都有(尤其是指出了这种模式作为
:syn-pattern
的帮助文档中应避免的一种模式)。多数情况
情况下,将 1个或更多匹配项与\+
匹配比 0或
更多与*
匹配。:syn match
的参数。我建议结合使用nextgroup
自变量的力量
skipwhite
的{{1}}参数:
:syn match
可让您分辨
Vim尝试匹配此匹配项后指定的组。nextgroup
参数可以在出现以下情况时跳过制表符和空格
尝试将下一组与skipwhite
匹配。记住这些,您可以将模式重写为:
nextgroup
为此,我还将您的syn match TaskName /^\[.\+\]/ nextgroup=TaskType skipwhite
syn match TaskType /[a-z]\+/ nextgroup=TaskDescription skipwhite
syn match TaskDescription /\w\+\(\s\+\w\+\)*/
匹配项修改为“一个字,
后跟0个或多个用空格隔开的单词。”
您会看到,利用TaskDescription
和nextgroup
使每种语法都匹配
更简短,除了使每个组的内容更清晰。
相关skipwhite
个查询:
:help