【问题标题】:Override a single function in an Emacs library覆盖 Emacs 库中的单个函数
【发布时间】:2016-07-21 17:59:02
【问题描述】:

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

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

【问题讨论】:

    标签: function emacs advising-functions


    【解决方案1】:

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

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

    【讨论】:

    • 重要的是要提到 'add-function' 和其他仅在 Emacs 24.4 中添加(我需要更新我的 Emacs)。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-26
      • 1970-01-01
      • 2014-05-05
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多