2011-05-25 38 views
1

我想使用的字體鎖和elisp的的正則表達式來突出像這樣的比賽次數未知:在正則表達式和字體鎖

class Foo implements A, B, C, D { } 

問題是逗號的長度未知implements後分隔的列表。我(重新使用Builder也,A,B,C和d高亮顯示)已經做了正則表達式這凸顯在列表中的所有單詞:

"implements\\s-+\\(?:\\(\\sw+\\)\\s-*,\\s-*\\)*\\(\\sw+\\)" 

,但我無法用這種字體鎖結合。

顯然

'("implements\\s-+\\(?:\\(\\sw+\\)\\s-*,\\s-*\\)*\\(\\sw+\\)" 
    (1 font-lock-type-face) (2 font-lock-type-face)) 

不起作用,因爲它強調僅去年occurances(C和d)忽略第一反向引用後星(*)。

有沒有一種方法來捕獲所有匹配的單詞列表或可能完全不同的方式來解決這個問題?

回答

2

如果你不想太突出了逗號,你的方法無法工作。當您使用subexp-highlighter形式的

(subexp facespec) 

subexp指子組的正則表達式和亮點給定facespec。現在,正則表達式匹配的子組是具有開始和結束的文本的連續範圍。實際上,只要您執行正則表達式搜索,就可以使用函數(match-beginning subexp)(match-end subexp)來查詢這些值。

但這意味着您無法將可變數量的類名稱排除逗號與單個子表達式匹配,因爲該子表達式必須是連續跨度。覆蓋可變數量類名的連續跨度也必須包含逗號,這是沒有辦法的。

下面是你的方法不是這樣一個好主意的另一個原因:你的regexp明確地使用空白。無論突出顯示是否排除空白都沒有關係,但即使在正則表達式中使用它也不是一個好主意,因爲只要允許空格,您總是可以遇到註釋。

考慮下面的代碼行:

class Foo implements A, /*B, C,*/ D { } 

在這種情況下,你會想在跨度/*B, C,*/字符使用font-lock-comment-face被突出顯示,並在font-lock-type-face周圍的類。如果突出顯示其他所有內容後突出顯示註釋,並允許註釋覆蓋其他字體鎖匹配,則仍然可以實現此效果。但是這會導致相當低效的匹配,因爲每個評論都會首先突出顯示,就好像它是代碼一樣,然後在第二遍中突出顯示爲評論。

一種解決這兩個問題很可能是來劃分關鍵字的匹配(「工具」)及其類別分成兩個不同的匹配規則,也許你可以作爲一個起點,東西線沿線的使用

'(("\\bimplements\\b" . font-lock-keyword-face) 
    ("\\b[A-Z]\\w*\\b" . font-lock-type-face)) 
+0

我沒有解決最初的問題,試圖檢查cc-mode/java-mode來源,但是當添加換行符時解決方案會中斷......所以我想這更像您在上面解釋的。謝謝! – Xaerxess 2011-12-13 19:16:14

1

像這樣的事情似乎在這裏工作:

'("\\(implements\\)\\s-+\\(\\(\\sw+\\s-*,\\s-*\\)*\\sw+\\)" 
    (1 font-lock-warning-face) 
    (2 font-lock-keyword-face)) 

(顯然你可能想不同的面孔...)

+0

這不完全是我想要的,因爲它突出顯示逗號(以及單詞之間的空格,因爲它們匹配)。 – Xaerxess 2011-05-26 10:17:19

+0

P.S.它是用於首次匹配的'font-lock-keyword-face'(執行)和用於休息的'font-lock-type-face') – Xaerxess 2011-05-26 10:20:35