首先,我将展示我遇到的具体问题,但我认为问题可以概括。
我正在使用一种具有明确括号语法的语言(如Lisp),但是只有左侧paren保留的关键字。例如:
(key key)
前者是保留字,但后者是对名为“key”
的变量的引用不幸的是,我发现突出显示左边的paren很烦人,所以我最终使用
syn keyword classification key
而不是
syn keyword classification (key
但前者对变量的触发也是如此。
我会解决我的问题,但是我更感兴趣的是一种通用方法来突出显示给定匹配的一个子集。
答案 0 :(得分:7)
在这种情况下单独使用syn keyword
无法正常工作,因为您希望突出显示更加了解周围的语法。 syn region
,syn 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
以上只会使用功能突出显示组突出显示键,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被拒绝。