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

时间:2014-03-25 04:36:57

标签: vim vim-syntax-highlighting

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

  • key=value
  • $(var)代表变量

$(var)部分可以同时显示在keyvalue中,即message="hello $(FirsName) $(LastName)"。如果value部分包含空格字符,则"部分必须用双引号key包围。

我想匹配value$(var)syn match configValue "\(\S\+=\)\@<=\"[^\"]*\"\|\(\S\+=\)\@<=\S\+" syn match configKey "^\s*[a-zA-Z0-9_.]\+\(\s*=\)\@=" syn match configVar "\$(.*)" 并在vim中单独突出显示。

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

configValue

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

  1. 当多个匹配或区域项目在同一位置开始时,该项目 最后定义的是优先权。
  2. 关键字优先于匹配和区域项目。
  3. 以较早位置开头的项目优先于项目 从以后的职位开始。
  4. 规则3给出了其他两个匹配优先级高于configVar的优先级。

    我的问题是,如何分别匹配三种模式,{{1}}具有最高优先级?

1 个答案:

答案 0 :(得分:3)

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

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

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


您说configVar也可以显示在configKey中,但为此,允许的字符范围也需要包含$()。然后,收容也起作用:

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