2013-05-07 106 views
0

我正在編寫一個語法文件來匹配日誌格式(基本上是基於列的;認爲syslog是一個類似的例子),我試圖爲列設置一種類型的繼承。VIM中的語法高亮顯示的多個匹配

我對此有兩個主要目標。首先,我想說第3列是「組件」字段(假設它標有標題;它也可以位於固定位置),並將背景設置爲灰色。然後我想說,組件「foo」獲得紅色的前景色,組件「bar」獲得綠色的前景色,但它們應該繼承「組件」列的背景色。在這種情況下,該字段應該確實有兩個語法匹配;這也很容易隱藏整個色譜柱(a la Toggling the concealed attribute for a syntax highlight in VIM

其次,有一個級別的字段;我想將整條線的背景設置爲紅色的關鍵級別消息,但前景應該繼續通過正常突出顯示(組件,源等;我省去了大部分其他要求)來設置。

從我在vim文檔中看到的情況來看,這似乎不可行。我錯過了什麼嗎?或者,任何人都可以提出一個很好的解決方法?

謝謝

回答

0

你不能(還)。對於每個字符,Vim只使用一個特定的高亮組,由最後一個「最內在的」非透明語法組匹配決定。

要解決此問題,您需要定義組合高亮組​​和相應的:syntax命令。一些語法(例如$VIMRUNTIME/syntax/html.vim和各種Wiki格式)使用它來組合粗體,斜體和下劃線,但在此之後它變得單調乏味且重複。

有一個patch proposed將爲:syntax命令添加combine修飾符;它在布拉姆的待辦事項列表中。

+0

我很害怕這個。我可以編寫所有組合的代,而不是將它們寫出來......對於我如何能夠實現隱藏效果的任何建議?我總是可以有一些特殊的值遍歷所有可能的類型,但我希望通過這種方式讓用戶查看synID並知道隱藏的內容。 – Mikeage 2013-05-07 09:37:07

+0

鏈接隱藏解決方案在外部語法上使用時看起來像一個很好的破解,但在您自己的語法中(尤其是如果您必須腳本化定義,無論如何),我寧願使用一個配置變量來確定哪個語法組獲得'隱藏'屬性。要改變,你必須改變這個變量,再次改變':syntax on'。 – 2013-05-07 10:01:32

+0

現在,我有用於隱藏公共列的地圖,所以它可以以任何方式工作;然而,我有這個想法,讓用戶調用ConcealCurrentGroup()並讓它自動隱藏光標所在的任何列。好吧。 – Mikeage 2013-05-07 10:54:18