2011-05-22 55 views
0

如何爲指定的關鍵字設置面部,但只有第一行的面部設置? 例如有了這個文件如何爲首行中出現的關鍵字設置臉部?

--- cut here --- 
hello world <-- this "hello" should have face set 
hello world <-- while this "hello" should not 
--- cut here --- 

只有第一聲問候應該有面子設置

我想這

(defun first-line-hello(limit) 
    (and (save-excursion (beginning-of-line) 
         (bobp)) 
     (re-search-forward "hello" limit))) 

(font-lock-add-keywords 'emacs-lisp-mode 
         '((first-line-hello . font-lock-warning-face))) 

但似乎出於某種原因(bobp)在使用時總是返回真字體鎖定的關鍵字。我也嘗試使用相同結果的行號。

回答

2

你接近,但有是一些問題。 '限制'可能會超出第一行的結尾,如果搜索失敗,則不需要出現錯誤,無論搜索合格/不合格,您都需要移動點。這些都歸結爲在您的功能中更改一行:

(defun first-line-hello(limit) 
    (and (save-excursion (beginning-of-line) 
         (bobp)) 
     (re-search-forward "hello" (min (point-at-eol) limit) 'go))) 
+0

感謝您提供解決方案和解釋。閱讀文檔時我錯過了這些東西。 – 2011-05-23 20:36:38

+0

祝賀銀牌。 – 2011-05-25 02:01:56

0

第一行緩衝區?一段的第一行?

無論如何,我認爲你可以用你自己的次要模式來做到這一點,在這種模式下你可以按你喜歡的方式掃描緩衝區/區域。在您的掃描中,您需要從頭開始,記下第一次看到每個關鍵字的位置,突出顯示它,然後繼續掃描。如果在掃描過程中看到重複的關鍵字,則不要突出顯示該關鍵字。

我相信你不能用簡單的字體鎖定關鍵字。無論它們出現在何處,它們總是關鍵字。但是你可以使用自定義匹配器來進行字體鎖定。獲得相關幫助font-lock-keywords,你會看到:

在用戶級關鍵字列表中的每個元素應該有這些形式之一:

匹配
...

其中匹配可以是要搜索的正則表達式,或函數名稱
調用進行搜索(使用一個參數調用搜索的極限;
它應該返回非零,移動點並適當設置match-data如果
它成功;像re-search-forward會)。

這些匹配函數或正則表達式在看似任意的時間在緩衝區中的任意位置被調用或計算。使用正則表達式不會出於這個原因,但使用函數,您可以掃描回關鍵字緩衝區開始處re-search-forward,並確定這是您第一次看到關鍵字,然後取出適當的行動。你也可以緩存一個關鍵字的第一個位置,然後在一個更改後的鉤子中管理緩存,但這會變得非常複雜。

編輯關於重新閱讀我看到你試過這後一個想法,它不適合你。奇怪。

1

的Emacs有空字符串只在緩衝區的開頭相匹配的regexp construct,那麼試試這個:

(font-lock-add-keywords 'emacs-lisp-mode '(("\\`hello" . font-lock-warning-face))) 

文檔說:

‘\`’ 
    matches the empty string, but only at the beginning of the buffer or string being matched against. 
+0

這沒關係。我需要將正則表達式更改爲「\\\'。* \\\(hello \\\)」,因爲hello不一定是第一個單詞。不幸的是,它只會突出顯示最後一次發生的問候(或者,如果我用「。*?」替換「。*」),則首先發生。 – 2011-05-23 20:38:58

相關問題