2011-05-22 37 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

相关问题