Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.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 - Fatal编程技术网

是否存在在创建每个缓冲区后运行的Emacs挂钩?

是否存在在创建每个缓冲区后运行的Emacs挂钩?,emacs,elisp,Emacs,Elisp,我希望每次Emacs创建缓冲区时都运行一些代码。这个有钩子吗?在make buffer functions之后使用类似于的名称的东西 编辑:如果有人想知道我想要这个的目的,你可以在这里阅读我的Emacs配置的相关部分: 基本上,我希望在具有某些主要模式的所有缓冲区中启用tempbuf模式。所以Lindydancer的答案实际上比我最初想要的更合适 我知道我已经可以通过将tempbuf模式钩子添加到所有主要模式钩子来在特定模式下启用tempbuf模式,但我想通过M-x customize使其可编辑

我希望每次Emacs创建缓冲区时都运行一些代码。这个有钩子吗?在make buffer functions之后使用类似于
的名称的东西

编辑:如果有人想知道我想要这个的目的,你可以在这里阅读我的Emacs配置的相关部分:

基本上,我希望在具有某些主要模式的所有缓冲区中启用tempbuf模式。所以Lindydancer的答案实际上比我最初想要的更合适


我知道我已经可以通过将tempbuf模式钩子添加到所有主要模式钩子来在特定模式下启用tempbuf模式,但我想通过
M-x customize
使其可编辑,这是最简单的方法。

不幸的是,没有。Emacs使用低级函数“get buffer create”来创建缓冲区,而且它不提供任何挂钩机制

您可以使用advice来拾取对该函数的所有调用,尽管我不推荐这种方法,因为它非常具有侵入性。(更新:advice钩子将只看到来自elisp的调用,而不会看到来自Emacs核心部件的调用。)

根据您正在实施的内容,您可以使用一些替代方案:

  • 更改主模式挂钩
    ——在主模式更改之前调用

  • 更改主模式后挂钩
    ——在主模式开始更改时调用

您可以使用
缓冲区列表更新挂钩

缓冲区列表更新挂钩

每当缓冲区列表更改时,这是一个正常的钩子运行

您可以定义一个函数来做任何您想做的事情

 (defun awesome-foo ()
     ;;  do awesome things
   )
将该函数挂钩到缓冲区列表挂钩

 (add-hook 'buffer-list-update-hook 'awesome-foo)

作为一个在这种情况下认为建议是一种极好的方法的人,我不得不问,在什么方面建议是“侵入性的”?(和/或为什么这是一件坏事?)。你是对的,没有钩子,但advice不会接收所有调用,因为C代码中有许多对该函数的调用,advice不会在该级别上钩子。@phils,所谓“侵入性”,我的意思是,如果你不仔细编写代码,如果其他包在创建缓冲区时不希望发生任何事情,则可以破坏它们。另外,我知道(根据个人经验),Emacs维护人员不愿意接受使用建议的软件包,因为他们认为Emacs标准发行版提供的所有内容都应该在没有它们的情况下进行管理。
更改后主模式钩子
满足了我的要求。我的函数不会在基本模式缓冲区中运行,但它不需要。Lindydancer:好的,这是常识。我完全理解维护人员不希望在标准发行版中得到任何建议,但是为了最终用户的目的,在根据自己的目的调整编辑器时,建议非常有用。没有你想要的钩子,但是,如果你能更详细地说明你真正想要实现的目标,也许还有另一种方法可以实现。不幸的是,它不起作用。它完全破坏了Emacs,消息是«Command attepmpted to use minibuffer while in minibuffer»。是的,我用类似于
(if(not(active minibuffer window))(做点什么,因为它不是minibuffer)
的代码修复了它!