Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Emacs 如何为出现在第一行的关键字设置面?_Emacs_Elisp_Highlight_Emacs Faces - Fatal编程技术网

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

Emacs 如何为出现在第一行的关键字设置面?,emacs,elisp,highlight,emacs-faces,Emacs,Elisp,Highlight,Emacs Faces,如何为指定的关键字设置面,但仅设置第一行中的关键字? 例如,拥有这个文件 --- cut here --- hello world <-- this "hello" should have face set hello world <-- while this "hello" should not --- cut here --- 但似乎出于某种原因(bobp)在字体锁定关键字中使用时总是返回true。我还尝试在pos上使用行号,结果相同。缓冲区的第一行?段落的第一行

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

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

但似乎出于某种原因(bobp)在字体锁定关键字中使用时总是返回true。我还尝试在pos上使用行号,结果相同。

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

不管怎样,我认为你可以用你自己的次要模式来做,你可以用你喜欢的方式扫描缓冲区/区域。在您的扫描中,您需要从头开始,注意您第一次看到每个关键字的位置,突出显示它,然后继续扫描。如果在扫描过程中看到重复的关键字,则不要突出显示该关键字

我相信你不能用简单的字体锁定关键字。无论它们出现在何处,它们始终是关键字。但您可以使用自定义匹配器来实现字体锁定。获取有关
字体锁定关键字的帮助,您将看到:

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

匹配器

其中MATCHER可以是要搜索的regexp,也可以是要搜索的函数名
调用进行搜索(使用一个参数调用,即搜索的限制;
如果
它成功了;比如
向前搜索
会)

这些matcher函数或regexp在缓冲区中的任意位置,在看似任意的时间被调用或计算。由于这个原因,使用regexp不起作用,但是使用函数,您可以扫描回缓冲区的开头,
向前重新搜索该关键字,并确定这是否是您第一次看到该关键字,然后采取适当的操作。您还可以缓存关键字的第一个位置,然后在一个afterchange钩子中管理缓存,但这会变得相当复杂


编辑在重读时,我发现您曾经尝试过后一种想法,但它对您不起作用。奇怪。

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

不管怎样,我认为你可以用你自己的次要模式来做,你可以用你喜欢的方式扫描缓冲区/区域。在您的扫描中,您需要从头开始,注意您第一次看到每个关键字的位置,突出显示它,然后继续扫描。如果在扫描过程中看到重复的关键字,则不要突出显示该关键字

我相信你不能用简单的字体锁定关键字。无论它们出现在何处,它们始终是关键字。但您可以使用自定义匹配器来实现字体锁定。获取有关
字体锁定关键字的帮助,您将看到:

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

匹配器

其中MATCHER可以是要搜索的regexp,也可以是要搜索的函数名
调用进行搜索(使用一个参数调用,即搜索的限制;
如果
它成功了;比如
向前搜索
会)

这些matcher函数或regexp在缓冲区中的任意位置,在看似任意的时间被调用或计算。由于这个原因,使用regexp不起作用,但是使用函数,您可以扫描回缓冲区的开头,
向前重新搜索该关键字,并确定这是否是您第一次看到该关键字,然后采取适当的操作。您还可以缓存关键字的第一个位置,然后在一个afterchange钩子中管理缓存,但这会变得相当复杂

编辑在重读时,我发现您曾经尝试过后一种想法,但它对您不起作用。奇怪。

Emacs有一个仅在缓冲区开头匹配空字符串的字符串,请尝试以下操作:

(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. 
Emacs具有仅在缓冲区开头匹配空字符串的字符串,因此请尝试以下操作:

(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. 

你很接近,但有一些问题“限制”可能远远超出第一行的末尾,如果搜索失败,则不需要出现错误,并且无论搜索通过/失败,都需要移动点。这一切归结为更改函数中的一行:

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

你很接近,但有一些问题“限制”可能远远超出第一行的末尾,如果搜索失败,则不需要出现错误,并且无论搜索通过/失败,都需要移动点。这一切归结为更改函数中的一行:

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

谢谢你的解答和解释。在阅读文档时,我错过了这些东西。祝贺你的银牌。谢谢你的解决方案和解释。我在读文件的时候错过了这些。恭喜你拿到了银牌。这没关系。我需要将正则表达式改为“\\`.\\\\(hello\\)”,因为hello不必是第一个单词。不幸的是,它只突出显示hello的最后一次出现(或者如果我将“*”替换为“*?”),则显示第一次出现。这没关系。我需要将正则表达式改为“\\`.\\\\(hello\\)”,因为hello不必是第一个单词。不幸的是,它只突出显示hello的最后一次出现(或者如果我将“*”替换为“*?”,则为第一次)。