是否有一个Emacs钩子在每个缓冲区创建后运行?

Rya*_*son 19 emacs elisp

我希望每次Emacs创建一个缓冲区时运行一些代码.有这个挂钩吗?有什么名字的东西after-make-buffer-functions

编辑:如果有人想知道我想要的是什么,你可以在这里阅读我的Emacs配置的相关部分:https://github.com/DarwinAwardWinner/dotemacs/blob/master/site-lisp/settings/tempbuf-settings .el

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

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

Lin*_*cer 15

很不幸的是,不行.Emacs使用低级函数'get-buffer-create'来创建缓冲区,并且它不提供任何钩子机制.

可以使用建议来获取对此函数的所有调用,即使我不推荐使用此方法,因为它非常具有侵入性.(更新:通知挂钩只会看到来自elisp的调用,而不是来自Emacs C核心部件的调用.)

您可以使用一些替代方案,具体取决于您实施的内容:

  • change-major-mode-hook - 在主要模式改变之前调用.
  • after-change-major-mode-hook - 主要模式开始变化时调用.

  • 你是正确的没有钩子,但建议不会接受所有的调用,因为在C代码中有许多对该函数的调用,并且建议不会在该级别挂钩. (3认同)
  • @phils,通过"侵入性",我的意思是如果你不仔细编写代码,如果他们不希望在创建缓冲区时发生事情,你可以打破其他包.此外,我知道(根据个人经验)Emacs维护者不愿意接受使用*advice*的软件包,因为他们认为Emacs标准发行版提供的所有内容都应该在没有它们的情况下进行管理. (3认同)
  • `after-change-major-mode-hook`做我想要的.我的函数不会在基本模式缓冲区中运行,但它不需要. (3认同)
  • 作为一个在这种情况下找到建议的神话般的方法的人,我不得不问在什么方面建议"侵入性"?(和/或为什么这是一件坏事?). (2认同)
  • Lindydancer:好吧,这都是常识。我完全理解维护人员不希望在标准发行版中得到任何建议,但对于最终用户根据自己的目的调整编辑器的目的,建议非常有用。 (2认同)

Chi*_*and 7

您可以使用 buffer-list-update-hook

buffer-list-update-hook

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

你可以定义一个函数来做任何你想做的事。

 (defun awesome-foo ()
     ;;  do awesome things
   )
Run Code Online (Sandbox Code Playgroud)

将该函数挂钩到缓冲区列表挂钩

 (add-hook 'buffer-list-update-hook 'awesome-foo)
Run Code Online (Sandbox Code Playgroud)

  • 不幸的是它不起作用。它完全破坏了 Emacs,显示消息 «Command atttepmpted to use minibuffer while in minibuffer»。 (2认同)
  • 是的,我用类似`(if (not (active-minibuffer-window)) (do-some-as-it-is-not-minibuffer)`这样的代码修复了它! (2认同)