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 函数参数突出显示与突出显示特殊语法组相同。
我正在尝试获取要突出显示的 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 函数参数突出显示与突出显示特殊语法组相同。