4

首先,我将展示我遇到的具体问题,但我认为这个问题可以概括。

我正在使用一种具有显式括号语法的语言(如 Lisp),但其关键字仅保留在左括号中。例子:

(key key)

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

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

syn keyword classification key

代替

syn keyword classification (key

但前者也触发了变量使用。

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

4

2 回答 2

7

在这种情况下单独使用syn keyword是行不通的,因为您希望突出显示更多地了解周围的语法。syn regionsyn match和的组合syn 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 highlight 组突出显示 key、foo 和 bar,前提是它们也被 lispFunc 匹配。

如果在 a 之后有除 key、foo 和 bar 之外的任何单词(,它们将使用 Identifier highlight 组突出显示。这使您可以区分标准函数名称和用户创建的函数名称。

(和将)使用特别高亮组突出显示,()过去第一个单词内的任何内容都将使用语句高亮组突出显示。

于 2010-01-08T22:09:24.643 回答
0

似乎确实有一些分层突出显示的功能,如下所示:Highlighting matches in Vim over an reverse pattern
which give ex commands

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

不过,我无法在我的语法文件中使用类似的东西。我试过类似的东西:

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

突出显示在整个位上为 Normal 或 Keyword,具体取决于首先拾取的内容(由文件中的排列更改)

Vim 坚决拒绝在 "syn" 之后使用 "2match" 作为关键字。

于 2010-01-08T21:55:48.397 回答