2015-09-19 16 views
0

我正在嘗試改進emacs c + +模式語法高亮顯示,並且需要找到正則表達式來匹配代碼中的成員變量。正則表達式匹配成員變量

atom's syntax highlighting

我想匹配正則表達式中有什麼截圖紅關鍵字,而不是藍色的。

要查找函數調用(藍色的),我使用的是表達([a-zA-Z_]+[a-zA-Z0-9_]*)+[(]

我要修改此所以,如果有關鍵字後的任何括號,它不匹配。

+0

一些正則表達式引擎支持負向前視語法,如'a(?!\()'(匹配字符'a',但前提是後面沒有開頭的文字)看看你的是不是。 –

+0

Emacs Wiki表示它不支持。是否可以用另一種方法,使用邏輯操作等? – Hckr

+1

你是否試圖通過'font-lock-keywords'?無論如何,向我們展示一些代碼 - 正如您已經確定的那樣,elisp regexps沒有這種零寬度的斷言,所以您需要編寫一些elisp來執行此操作,所以 – phils

回答

1

我認爲這應該做你想做的。

(font-lock-add-keywords 
'c++-mode 
'(("\\(\\_<[a-zA-Z_][a-zA-Z0-9_]*\\_>\\)[(]" 1 font-lock-function-name-face) 
    ("\\.\\(\\_<[a-zA-Z_][a-zA-Z0-9_]*\\_>\\)" 1 font-lock-variable-name-face))) 

爲了解決您的性能問題,請稍微修改您的第一個正則表達式(請參閱下面的解釋)。第二個正則表達式只是交換了一個前導期的尾部括號;我們依靠兩個正則表達式的順序來處理方法調用,這兩個方法調用可以匹配。

正如其他人所提到的,你的性能問題可能是由於一個正則表達式,可以在許多方面匹配。錨定符號邊界標記\_<\_>應該有所幫助。我也遇到了非分離字符集上相鄰的+*組,但我不知道這是否是一個問題。

由於您似乎不希望在字符串和註釋中突出顯示,因此您應該將append關閉。如果您想要字符串和註釋突出顯示,那麼您將使用prepend,而append只有在您使用設置屬性的字符串或註釋所面臨的並不是您想要組合這兩者的屬性時纔有用。要查看我在說什麼,請嘗試用'hi-yellow替換font-lock-function-name-face。 (這裏的引用是相關的,因爲突出顯示的面沒有可變的別名,例如字體鎖定面。)

+0

感謝您的出色答案。我已經在不使用'_ <'的情況下解決了問題。 '+'可能是主要問題。我會用'_ <'嘗試看看它是如何影響性能的。對於'append',你是絕對正確的。我想補充一點,我認爲,這兩個關鍵字都可以用於所有C族語言:c,C++,java。爲此,可以在「c-mode-common-hook」中添加一個鉤子。 – Hckr

+0

正如我所說的使用'+'是主要問題。但再次感謝額外的'\ _ <'。 – Hckr