gpt4 book ai didi

vim - 如何在 Vim 语法文件中匹配另一个匹配中的模式

转载 作者:行者123 更新时间:2023-12-04 20:12:22 29 4
gpt4 key购买 nike

我有一个涉及以下语法的自定义配置:

  • 键=值
  • $(var)代表一个变量

$(var) 部分可以出现在 keyvalue 中,即 message="hello $(FirsName) $(姓氏)”value 部分如果包含空格字符,则必须用双引号 " 括起来。

我想匹配 key, value$(var) 并在 vim 中分别高亮它们。

这是我的 vim 语法文件中的内容:

syn match configValue "\(\S\+=\)\@<=\"[^\"]*\"\|\(\S\+=\)\@<=\S\+"
syn match configKey "^\s*[a-zA-Z0-9_.]\+\(\s*=\)\@="
syn match configVar "\$(.*)"

代码成功匹配 configValueconfigKey,但如果它在 key=value 内,则不匹配 configVar。这是由语法匹配优先级 (h:syn-priority) 决定的:

  1. 当多个 Match 或 Region 项目从同一位置开始时,该项目最后定义的优先。
  2. 关键字优先于匹配项和区域项。
  3. 在较早位置开始的项目优先于在较早位置开始的项目从以后的职位开始。

规则 3 赋予其他两个匹配项高于 configVar 的优先级。

我的问题是,如何分别匹配三种模式,configVar的优先级最高?

最佳答案

要在 configValue 中匹配 configVar,您必须包含它;这是通过 containedcontains=... 属性完成的(如果 var 也可以匹配任何地方,而不仅仅是在 key=value 内部,则将其关闭):

syn match configValue "\(\S\+=\)\@<=\"[^\"]*\"\|\(\S\+=\)\@<=\S\+" contains=configVar
syn match configVar "\$([^)]*)" contained

请注意,我已经更改了 configVar 的模式以避免将 $(foo) 和 $(bar) 匹配为 一个 元素。


你说 configVar 也可以出现在 configKey 中,但是为此,允许的字符范围需要包括 $(),也。然后,遏制也同样有效:

syn match configKey "^\s*[a-zA-Z0-9_.$()]\+\(\s*=\)\@=" contains=configVar

关于vim - 如何在 Vim 语法文件中匹配另一个匹配中的模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22625544/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com