2010-01-08 165 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