2013-08-06 54 views
1

我試圖爲主要模式設置字體鎖定。下面是一些示例代碼:Emacs中的上下文敏感不連續字體鎖定

USING: foo bar bar ; 

IN: fuelcolors 

TUPLE: font < super-class 
    name 
    size 
    bold? 
    italic? 
    { foreground initial: COLOR: black } 
    { background initial: COLOR: white } ; 

TUPLE: rgb red green blue ; 

: foobar (seq -- seq) 
    hello there { 1 2 3 } ; 

下面的符號應該與一些面部突出(並不重要,我的問題是匹配的部分):名稱,大小,粗體斜體??,前景,背景,紅色,綠色,藍色。它們表示元組中插槽的名稱。

我知道一個正則表達式不會這樣做,因爲匹配的區域不是連續的。斜體?和前景應該匹配,但不是 {這些符號之間的字符。所以相反,我認爲我可以編寫一個字體鎖匹配器函數,類似於這裏提供的一個Dmitri:Context-sensitive font-locking in emacs,用於解決非常類似的問題。

但是,他的解決方案利用了以下事實:要突出顯示的項目的「序列」在paranthesises內部,這不是這裏的情況。

字體鎖有這樣的情況(Unknown number of matches in regex and font-lock)的麻煩,但我仍然希望有一些「足夠好」的解決方案,即使它需要黑客的字體鎖內部。

+0

我不明白應該遵循的規則是什麼。例如。爲什麼不'bar','foo','fuelcolors',...? – Stefan

+0

只應突出顯示'TUPLE:....;'表達式中的單詞。 –

回答

0

這裏是我結束了與解決方案:

(,"\\(TUPLE\\):[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)\\(?:[ \n]+<[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)\\)?" 
    (1 'factor-font-lock-parsing-word) 
    (2 'factor-font-lock-type-name) 
    (3 'factor-font-lock-type-name nil t) 
    ("\\(\\(?:\\sw\\|\\s_\\)+\\)\\|\\(?:{[ \n]+\\(\\(?:\\sw\\|\\s_\\)+\\)[^}]+\\)" 
     ((lambda (&rest foo) 
     (save-excursion 
      (re-search-forward " ;" nil t) 
      (1- (point))))) 
     nil 
     (1 'factor-font-lock-symbol nil t) 
     (2 'factor-font-lock-symbol nil t))) 
1

匹配器函數似乎是一個很好的匹配。

我會使用兩個函數,一個可以用來匹配TUPLE並設置搜索成員的限制,一個內部匹配器來查找每個元素。可以編寫內部函數以瞭解{ name ... }結構。

訣竅是內部函數被稱爲每個元素一次,因此永遠不會有你有未知數量的匹配的情況。

規則看起來是這樣的:

'(my-match-a-tuple 
    (1 'font-lock-keyword-name-face) ;; Highlight the word TUPLE 
    (my-match-tuple-member 
    ;; Pre-match form (can be used move the point around and to set search limits) 
    nil 
    ;; Post-match form (can be used to move point around afterwords) 
    nil 
    (1 'font-lock-variable-face))) 

你可以看一下我的包fontifying CMake的腳本,它使大量使用的匹配功能:https://github.com/Lindydancer/cmake-font-lock

+0

偉大的*有*解決方案。 :)但獲得錨定匹配正確的方式來爲我難。 –