6

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

任何想法如何在修改库的只读源文件的情况下一致地替换 Emacs 库中的 lisp 函数?

4

2 回答 2

6

这样的事情应该可以解决问题:

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

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

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

于 2016-07-21T19:29:03.583 回答
2

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

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

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

于 2016-07-22T18:13:20.917 回答