2010-01-08 110 views
4

首先,我将展示我遇到的具体问题,但我认为问题可以概括。Vim中的子匹配语法高亮

我用具有明确的括号语法(如Lisp)语言的工作,但那些只对左括号保留关键字。例如:

(key key) 

前者是一个保留字,但后者则是名为“关键”

不幸的是,我发现突出了左括号恼人的变量的引用,所以我最终使用

syn keyword classification key 

代替

syn keyword classification (key 

但对可变前触发器用途。

我会带一个黑客绕过我的问题,但我会更感兴趣的一般方法,以仅仅强调一个给定的比赛的一个子集。

回答

7

使用syn keyword孤单,因为你希望你的高亮更加意识到周围语法的这种情况不工作的权利。 syn region,syn 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和酒吧,只有当他们也被lispFunc匹配。

,如果多于关键,foo和酒吧,走过了(后其他任何话,他们将使用标识符高亮组高亮显示。这使您可以区分标准功能名称和用户创建的名称。

()将使用特殊高光组突出显示,并且()之后的任何内容都会使用语句高亮组突出显示。

0

目前确实出现了分层高亮一些功能,如下所示:Highlighting matches in Vim over an inverted pattern
这给前命令

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

我一直没能得到这样的事情在我的语法文件工作,但是。我想是这样的:

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

高亮显示进入正常或关键字在整个位取决于什么被第一次拿起(由安排在文件中改变)

Vim中使用“2match”一片反对之声为“syn”后的关键字。

+0

'2match'只是'match'命令的一个变体,具有较低的优先级。这与'syn match'完全无关。无论缓冲区如何,使用':match'和相关命令/函数突出显示当前窗口中的模式。在Vim 7之前,只有'match'命令。在Vim 7中,它获得了'2match'和'3match'。补丁7.1.040添加了'clearmatches()','getmatches()','matchadd()','matchdelete()'和'setmatches()'函数,允许基本上无限的匹配模式。 – jamessan 2010-01-08 22:14:41