2012-07-09 58 views
2

我正在爲支持兩種略有不同的編程語言的編程環境編寫emacs主模式。兩者都是lisps(一個是Scheme),所以都使用s表達式。這兩種語言是由它們的功能定義關鍵字分化:方案採用define,而其他語言(稱爲xtlang)使用bind-func基於頂級s表達式的字體鎖定關鍵字

因此,在相同的緩衝,我有

(define foo  ; this is scheme 
    (lambda (a) 
     (+ scheme-fn a)) 

(bind-func bar  ; this is xtlang 
    (lambda (b) 
     (* xtlang-fn b)) 

我已經得到的字體鎖定工作,使用像

(font-lock-add-keywords nil 
         '(("(\\(define\\)\\>" 
          (1 font-lock-keyword-face)) 
          ("(\\(bind-func\\)\\>" 
          (1 font-lock-keyword-face)) 
          ("\\<scheme-fn\\>" 
          (0 font-lock-function-name-face)) 
          ("\\<xtlang-fn\\>" 
          (0 font-lock-function-name-face)) 
         )) 

東西,我想什麼,能夠做的是能夠以不同顏色基於語言(方案/ xtlang)的括號。

所以,所有顏色的形式紅色括號如果頂層defun定義是define,藍色,如果它是一個bind-func,同時仍強調所有關鍵字/表格內恢復正常功能。

這可能需要多行字體鎖定,因爲define/bind-func可能會位於要高亮顯示的關鍵字的上一行。 This thread暗示font-lock-multiline與匹配錨定在font-lock-keywords可能是答案,但接着暗示font-lock-multiline應該只在多行方面是例外而不是規則的情況下使用。

我的其他選擇似乎是使用syntax-propertize,但我有點困惑如何工作 - 文檔有點稀疏。

回答

1

來處理,這是利用了以下事實,最簡單的方法:

匹配可以是搜索的正則表達式,或者函數名 打電話讓搜索(用一個參數調用,該在 搜索的限制;

換句話說,你可以用反覆搜索使用re-search-forward正則表達式的函數替換像"\\<scheme-fn\\>"正則表達式,如果找到匹配在正確的合作返回ntext

有關使用此技術的軟件包的具體示例,請參閱標準Emacs發行版的一部分cwarn-mode