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