2010-08-06 30 views
6

有沒有辦法觸發執行除M-x myfun以外的emacs lisp功能?我希望在每次更改緩衝區時重新調用該函數。持續執行emacs lisp功能

背景:我有一個數字表有一些錯誤。該表具有列總數和可用於識別錯誤的其他功能。我的elisp函數突出顯示可疑的數字列。我想要的是,只要數字得到糾正,突出顯示就會消失,而不會重複調用突出顯示錯誤功能。

在Excel中的類似功能被稱爲,我相信,「條件格式」

+1

當然,你可以做到這一點。查看'c-mode'實現'電子支架'。 – 2010-08-06 17:48:17

回答

9

您在第一段中尋找的概念是掛鉤。一個hook變量是當某個事件發生時執行的函數列表。大多數鉤子變量的名字都以-hook結尾。每次鍵入內容或更改緩衝區時,都會執行掛鉤after-change-functions。掛鉤在Emacs Lisp手冊的「掛鉤」標題下討論。

但是,考慮到您要做的事情,使用Emacs的突出顯示機制會更容易。解決方案可能很簡單,只需在正確的位置添加正則表達式即可。

包含結構化文本(尤其是編程語言)的大多數文件都使用字體鎖定機制突出顯示。這在Emacs和Emacs Lisp手冊的「字體鎖定」下都有記錄。特別參見功能font-lock-add-keywords,對此,Emacs手冊給出了一個幾乎與您相同的示例。還有some information on the Emacs wiki

新增:

字體鎖可以超越正則表達式;不幸的是,文檔僅限於font-lock-keywords的文檔字符串中的簡潔說明。 cperl-mode.el中有幾個簡單的例子(儘管它們有點埋在大衆中)。該wiki還參考使用此功能的ctypes.el。這是一個示例,其中突出顯示了錯誤的整數加法。

(defun maybe-warn-about-addition() 
    (let ((x (string-to-int (match-string 1))) 
     (y (string-to-int (match-string 2))) 
     (z (string-to-int (match-string 3)))) 
    (if (/= (+ x y) z) 
     font-lock-warning-face))) 
(font-lock-add-keywords 
nil 
'(("\\s-\\([0-9]+\\)\\s-*\\+\\s-*\\([0-9]+\\)\\s-*=\\s-*\\([0-9]+\\)\\s-" 
    (3 (maybe-warn-about-addition) t)))) 

即使是正則表達式可以通過查找你想要突出(函數名MATCHER,使用的詞彙從文檔字符串)什麼界限任意代碼來代替。在標準C模式下有一個字體鎖定關鍵字的高級示例(cc-fonts.el)。

+0

非常感謝。我的感覺是Font Lock可以爲正則表達式定製,但是沒有基於內容的條件,比如突出顯示行1 1 3(因爲1 + 1!= 3),然後在行變爲2時刪除突出顯示1 3(因爲2 + 1 = 3)。 – josh 2010-08-07 06:49:52

+0

@josh:你可以使用字體鎖來編寫任意代碼來配​​置突出顯示,它只是更復雜一點。你的例子絕對有可能。我會尋找一些示例代碼並將其添加到我的答案中。 – Gilles 2010-08-07 10:15:23

1

加入你的函數變量after-change-functions