我有一个自定义配置,涉及以下语法:
key=value
$(var)
代表变量 $(var)
部分可以同时显示在key
和value
中,即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
代码与configKey
和configVar
成功匹配,但如果key=value
内则h:syn-priority
成功匹配。这由语法匹配优先级(configVar
)决定:
规则3给出了其他两个匹配优先级高于configVar
的优先级。
我的问题是,如何分别匹配三种模式,{{1}}具有最高优先级?
答案 0 :(得分:3)
要在configVar
内configValue
匹配,您必须包含;这是通过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