在Vim中进行子匹配语法高亮

4
首先,我将展示我遇到的具体问题,但我认为该问题可以概括描述。
我正在使用一种具有显式括号语法(类似Lisp)的语言,但是只有关键字保留在左括号中。例如:
(key key)

前者是保留字,但后者是指名为“key”的变量的引用。

不幸的是,我发现突出显示左括号很烦人,所以最终我使用了:

syn keyword classification key

替代

syn keyword classification (key

但前者也会在变量使用时触发。

我可以采取一些方法来解决我的问题,但我更感兴趣的是一种通用方法,只突出显示给定匹配的子集。

2个回答

7

仅使用syn keyword不能很好地解决此情况,因为您希望高亮显示更加了解周围的语法。 syn regionsyn matchsyn keyword的组合效果很好。

hi link lispFuncs Function
hi link lispFunc Identifier
hi link sExpr Statement

syn keyword lispFuncs key foo bar contained containedin=lispFunc
syn match lispFunc "(\@<=\w\+" contained containedin=sExpr contains=lispFuncs
syn region sExpr matchgroup=Special start="(" end=")" contains=sExpr,lispFuncs

上述内容仅使用Function高亮组突出显示key、foo和bar,前提是它们也被lispFunc匹配。如果在(之后有除key、foo和bar之外的任何单词,则将使用Identifier高亮组进行突出显示。这使您可以区分标准函数名称和用户创建的名称。 ()将使用Special高亮组进行突出显示,而()中第一个单词之后的任何内容都将使用Statement高亮组进行突出显示。

0

似乎存在一些分层高亮的能力,如此看来:在反转模式下突出显示Vim中的匹配项
这提供了ex命令

:match myBaseHighlight /foo/
:2match myGroup /./

我在我的语法文件中无法让类似的东西工作。我尝试了类似于:

syn match Keyword "(key"
syn match Normal "("

高亮显示取决于文件中先出现的是普通文本还是关键词(受文件排列顺序影响)

Vim在“syn”后坚决拒绝使用“2match”作为关键词。


2
2matchmatch命令的一种变体,优先级较低。它与syn match完全无关。:match及其相关命令/函数用于突出显示当前窗口中的模式,而不考虑缓冲区。在Vim 7之前,只有match命令。在Vim 7中,它增加了2match3match。补丁7.1.040添加了clearmatches()getmatches()matchadd()matchdelete()setmatches()函数,允许使用基本上无限的匹配模式。 - jamessan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接