如何设置第一行出现的关键字的面?

时间:2011-05-22 23:38:59

标签: emacs elisp highlight emacs-faces

如何为指定的关键字设置面,但只为第一行设置? 例如,有这个文件

--- 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)在font-lock-keywords中使用时总是返回true。我也尝试使用相同结果的line-number-at-pos。

3 个答案:

答案 0 :(得分:2)

你很亲密,但有一些问题。 'limit'可能远远超出第一行的末尾,如果搜索失败,您需要没有错误,并且无论搜索通过/失败,您都需要移动点。这一切都归结为改变你的功能中的一行:

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

答案 1 :(得分: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. 

答案 2 :(得分:0)

缓冲区的第一行?段落的第一行?

无论如何,我认为您可以使用自己的次要模式来执行此操作,您可以按照自己喜欢的方式扫描缓冲区/区域。在扫描中,您需要从头开始,记下第一次看到每个关键字的位置,突出显示它,然后继续扫描。如果您在扫描期间看到重复的关键字,则不要突出显示该关键字。

我相信你不能用简单的font-lock-keywords来做到这一点。它们始终是关键字,无论它们出现在何处。但你可以使用自定义匹配器进行字体锁定。获取font-lock-keywords的帮助,您会看到:

  

用户级关键字列表中的每个元素都应具有以下形式之一:

     

匹配
    ...

     

其中MATCHER可以是要搜索的正则表达式,也可以是函数名称   打电话进行搜索(用一个参数调用,搜索的限制;
  它应返回非零值,移动点,并在适当时设置match-data   它成功了;像re-search-forward那样。

这些匹配器函数或正则表达式在看似任意的时间内在缓冲区中的任意位置被调用或计算。使用正则表达式不会因此而起作用,但使用函数,您可以扫描回缓冲区的开头,re-search-forward查找关键字,并查看是否是您第一次看到该关键字,然后采取适当的行动。您还可以缓存关键字的第一个看到的位置,然后在更改后的挂钩中管理缓存,但这变得非常复杂。

重新阅读

编辑我看到你尝试了后一种想法而且它不适合你。奇怪。