覆盖 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
是一个很好的解决方案,因为可以在定义函数之前应用覆盖,并且它将在函数的正常定义中继续存在。
也就是说,在许多情况下您不需要重写任何函数。也许只需要用您自己的名字定义您自己的函数,然后更改键盘映射,使其运行您的函数而不是库中的函数。
我使用 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
是一个很好的解决方案,因为可以在定义函数之前应用覆盖,并且它将在函数的正常定义中继续存在。
也就是说,在许多情况下您不需要重写任何函数。也许只需要用您自己的名字定义您自己的函数,然后更改键盘映射,使其运行您的函数而不是库中的函数。