2012-10-14 57 views
4

說我哈瓦一個LaTeX文檔中Vim的開放,我想強調的語法匹配括號之間突出

{\color{red} ... } 

(其中點都應該象徵着某些內容)每一次出現,那就是,我想有{\color{red},}和這些突出顯示之間的所有內容。這個我已經跟

:syn region WarningMsg start=+{\\color{red}+ end=+}+ 

這樣做,但我認爲,如果我喜歡寫東西{\color{red} some{thing} important},那就只有{\color{red} some{thing}其中被突出問題,自然是因爲Vim的符合項目的}第一次出現。我怎樣才能使這個突出顯示規則,以便它跳過匹配大括號?即使是多層次的。

+0

你想得到最大可能的匹配,而不是最小的一個(只是拋出它)。我不知道如何實現它。 – keyser

+0

@Keyser:不一定是最大可能的匹配。它只忽略匹配的括號是很重要的。我不希望它在我的文檔中第一次出現{{color {red}'到最後一次出現}之間突出顯示。由於我的文檔明顯以'\ end {document}'結尾,因此只會在第一次出現{{color {red}'時突出顯示文件的其餘部分。 – Kristian

+0

所以要澄清:當你偶然發現一個開放的大括號時,你想允許一個額外的閉合花括號。我認爲這是可以做到的。 – keyser

回答

1

爲了清楚起見,最好給每個語法區域一個定製名稱,然後將其鏈接到標準顏色組。我已將您的原始地區redTeX更名。

您需要定義第二個區域innerBrace,定義要忽略的大括號,並將該區域標記爲透明。然後redTeX應被標記爲包含透明區域,然後它將忽略。

syn region innerBrace start=+{+ end=+}+ transparent contains=redTeX 
syn region redTeX start=+{\\color{red}+ end=+}+ contains=innerBrace 
hi link redTeX WarningMsg 

注意,在這種情況下,有增加的精妙之處在於redTeX本身作爲一個innerBrace匹配。我通過將innerBrace標記爲redTeX來解決這個問題。

希望有道理!

+0

這很好用,除了它不允許你有多級別的大括號​​,例如,如果你寫'{\ color {red} some {thing {very}} impoartant}',那麼它只會突出顯示{\ color {red }一些{東西{非常}}。我意識到這可以通過在'innerBrace'的定義中用'contains = redTeX,innerBrace'替換'contains = redTeX'來解決,這樣一組大括號可以包含另一組大括號。以這種方式修理它會有什麼問題嗎?謝謝。 – Kristian

+0

你的修復應該沒問題。它是否用一個大括號來打破原始問題? –