首页 > 解决方案 > vim 语法 - 如何突出显示区域内的匹配项

问题描述

我正在编写一个 vim 语法高亮脚本来确定全局参数是否仅为大写。如果不是 - 我想强调它。问题是全局参数位于页面的特定部分。

代码看起来像这样:

***VARS***
${VAR1}
${var2}

***OTHERS***
${var3}

所以我希望突出显示VARS下包含小写的所有变量 - 在我的示例中,只有 ${var2} 应该突出显示。

我试图这样做:

syn match global_var_match "\${.*[a-z][^}]+}" contained
syn region global_variables start="\(\*\*\*VARS\*\*\*\)\@<=" end="\(\*\*\* OTHERS\*\*\*\)\@=" contains=global_var_match 
hi link global_variables ErrorMsg

但随后也突出显示了 ${VAR1} 和 ${var2}。

标签: vimsyntax-highlightingvim-syntax-highlighting

解决方案


一个问题是简单的错字:

hi link global_variables ErrorMsg

这应该是

hi link global_var_match ErrorMsg

即坏匹配,而不是包含区域。但是,随着这种变化,包含小写的变量仍然在***OTHERS***.

该问题是由匹配中的虚假空间引起的***OTHERS***

我也改变了你的global_var_match正则表达式。我有它:

syn match global_var_match "\${[^}]*[a-z][^}]*}" contained

这对我来说在测试用例中表现得很好,比如

${VAR} blah ${VAr} ${vAR}

和其他:仅标记包含小写的变量。仍在调查为什么该地区不正确。

这是我所拥有的:

syn match global_var_match "\${[^}]*[a-z][^}]*}" contained
syn region global_variables start="\(\*\*\*VARS\*\*\*\)\@<=" end="\(\*\*\*OTHERS
\*\*\*\)\@=" contains=global_var_match
hi link global_var_match ErrorMsg

推荐阅读