Vim中的子匹配语法高亮显示

时间:2010-01-08 21:22:58

标签: vim syntax-highlighting vim-syntax-highlighting

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

我正在使用一种具有明确括号语法的语言(如Lisp),但是只有左侧paren保留的关键字。例如:

(key key)

前者是保留字,但后者是对名为“key”

的变量的引用

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

syn keyword classification key

而不是

syn keyword classification (key

但前者对变量的触发也是如此。

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

2 个答案:

答案 0 :(得分: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

以上只会使用功能突出显示组突出显示键,foo和bar,只有当它们也与lispFunc匹配时才会突出显示。

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

()将使用特殊突出显示组突出显示,()内第一个单词后面的任何内容都将使用语句突出显示组突出显示。

答案 1 :(得分:0)

似乎有一些分层突出显示功能,如下所示:Highlighting matches in Vim over an inverted pattern
这给出了ex命令

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

但是我无法在我的语法文件中使用这样的东西。我试过像:

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

突出显示整个位的正常或关键字取决于首先拾取的内容(通过文件中的排列更改)

在“syn”之后使用“2match”作为关键字,Vim被拒绝。