为什么taskinfo语法文件无法按预期工作?

时间:2020-10-01 10:38:55

标签: vim

我有以下语法文件:

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将被匹配。

1 个答案:

答案 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个或多个用空格隔开的单词。”

您会看到,利用TaskDescriptionnextgroup使每种语法都匹配 更简短,除了使每个组的内容更清晰。


相关skipwhite个查询:

:help
相关问题