2013-10-27 23 views
0

我剛開始玩emacs模式。我製作了派生模式(從text-mode),它可以針對不同情況進行簡單的顏色修改。例如,文本的以上所有等號的線(=)變爲品紅色,這是使用的代碼來完成:emacs major-mode:僅在首次加載文件時發生字體鎖

(make-face 'heading-face1) 
(set-face-foreground 'heading-face1 "brightmagenta") 
(set-face-attribute 'heading-face1 nil :weight 'ultra-bold)                                       
(setq font-lock-heading-face1 'heading-face1) 

(font-lock-add-keywords nil '(("\\(.*\n=\\{5,\\}.*\\)" 
          1 font-lock-heading-face1 prepend))) 

當我第一打開具有這樣一個文本文件,它被適當着色的;但如果我添加一個額外的=,或者創建一個新行=============,它們將轉爲正常文本顏色。

其他字體鎖動態工作。例如,數字立即使用不同的顏色...

什麼會導致模式與第一次打開文件時動態地進行不同匹配?

回答

2

你的問題面臨的問題是在處理多行關鍵字時字體鎖需要特別小心。

當你第一次打開你的文件時,font-lock會在相當大的塊(〜500bytes IIRC)中進行高亮顯示,但是在緩衝區以某種方式更改之後,默認情況下只會將它逐行重新高亮顯示,因爲優化的原因,這意味着當它會考慮你的標題行時,它的工作區甚至不會包含下一行來執行匹配。

如果您的特殊={5,}.*行是該區域的第一行或該區域之後的第一行,則快速修復將爲font-lock-extend-region-functions添加一個鉤子,該鉤子將擴展您的重新照亮區域。這不是唯一的(也可能不是最理想的)方法,但它應該起作用。

有關詳細信息,請參閱EmacsLisp手冊的Multiline Font Lock Constructs部分。

+0

謝謝@immerrr,這很有道理 - 而且似乎是解釋。我對lisp完全不熟悉,並且無法破譯多行結構的文檔。你有可能提供一個例子嗎? – DilithiumMatrix

+1

@zhermes,如果你留在Emacs中,不熟悉Lisp只是時間問題:)同時,你可以嘗試並遵循下面的例子:http://stackoverflow.com/a/15239704/944617 – immerrr

0

如果不止一個模式匹配,則字體鎖定關鍵字的順序很重要。嘗試使用t而不是prepend

至於爲什麼它在第一次打開文件時有效:也許當你第一次打開文件時,它通常首先被字體鎖定,然後你添加新的規則。

(FWIW:你不需要變量font-lock-heading-face1,至少不會所示的代碼 - 只需使用面部標誌和考慮只定義與defface臉)

相關問題