Vim 正则表达式未创建语法组

Vim regex not creating syntax group

我正在尝试获取要突出显示的 python 函数的参数(粗略地说,我只想突出显示括号中的任何内容)。我有一个可以突出显示正确内容的工作正则表达式:

syn match pythonArguments "\vdef.*\(\zs.+\ze\)"
hi def link pythonArguments Special

现在,我在同一个文档(函数调用)中得到了类似的东西:

syn match pythonFunctionCall "\v\w+\ze\("
hi def link pythonFunctionCall Function

但是,由于某些原因,参数正则表达式不会变成语法组。我尝试 运行 它们作为命令而不是在我的 ~/.vim/after/syntax/python.vim 文档中,但无济于事。当我的光标位于搜索 /\vdef.*\(\zs.+\ze\) 突出显示的表达式上时,没有语法组。我已经尝试了所有我能想到的。

所以,对于任何感兴趣的人来说,vim(MacOS 上的 8.1)似乎有错误的语法组。我最终得到它与工作:

syn match pythonFunctionDeclaration "\v\(.+\):" contains=ALL transparent
syn match pythonArguments "\v\(\zs.+\ze\)" contained contains=ALL

我不知道为什么我尝试过的其他方法不起作用,但这会突出显示 python 函数参数(并且它会保留已经存在的语法组)。

编辑: 我学到了更多。因此,语法组的正则表达式的问题是忽略了不同模式之间的重叠。例如:

/\vdef|def something 将匹配 'def something' 的 'def' 部分,因为 vim 将跳过 'something' 部分,因为它已经与第一个模式匹配。我不知道这是否有意义,请查看 this.

回到让突出显示更好,上面语法组的问题是一些 if 语句和 for 循环也会匹配。但是,这项工作:

syn clear pythonFunction
syn match pythonFunction "\h\w*" 
nextgroup=pythonFunctionDeclaration display contained
syn match pythonFunctionDeclaration "\v\(.+\):" contains=pythonArguments transparent contained
syn match pythonArguments "\v\(\zs.+\ze\)" contained contains=ALLBUT,pythonFunction
hi def link pythonArguments Special

这将使我们的特殊语法组仅发生在函数之后。

TLDR;将第二个(较长的)代码块添加到 ~/.vim/after/syntax/python.vim 文件中,使 python 函数参数突出显示与突出显示特殊语法组相同。