覆盖 Emacs 库中的单个函数

Override a single function in an Emacs library

我使用 Emacs 模式来注释我的一些文件(实际模式并不重要)。它作为一个库提供,并带有编译的 lisp 代码(当然)。我想通过覆盖其中的单个函数来修改它的行为。仅用于我的本地 Emacs 会话。现在,我只是从库的源文件中复制粘贴函数,稍微修改一下,然后点击 eval-last-sexp。到目前为止,一切都很好。但是,我得到不一致的结果:我不确定 Emacs 如何处理来自 .elc 文件的函数与来自源代码的函数的混合。有时我看到我自己的函数版本 运行,有时是原始版本。非常混乱(和烦人)。

关于如何在不修改只读的库源文件的情况下,如何始终如一地替换 Emacs 库中的 lisp 函数有什么想法吗?

像这样应该可以解决问题:

(advice-add 'name-of-func-to-override :override
            (lambda () (message "does this instead now")))

name-of-func-to-override 替换为函数名称,将 lambda 替换为您的版本。

我建议查看 add-function(和 advice-add)文档,因为 :override 实际上可能不是您想要的。

对您的问题最可能的解释是您有时在加载另一个库之前(复制和)eval-last-sexp:最后一个获胜!

按照@Jack 的建议使用 advice-add 是一个很好的解决方案,因为可以在定义函数之前应用覆盖,并且它将在函数的正常定义中继续存在。

也就是说,在许多情况下您不需要重写任何函数。也许只需要用您自己的名字定义您自己的函数,然后更改键盘映射,使其运行您的函数而不是库中的函数。