覆盖Emacs库中的单个函数

时间:2016-07-21 17:59:02

标签: function emacs advising-functions

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

任何想法如何在不使用修改库的只读源文件的情况下,如何在Emacs库中持续替换lisp函数?

2 个答案:

答案 0 :(得分:3)

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

(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可能实际上并不是您想要的。

答案 1 :(得分:2)

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

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

这就是说,在许多情况下你不需要覆盖任何功能。也许只需要用你自己的名字定义你自己的函数,然后更改keymap,使它运行你的函数而不是库中的函数。