【问题标题】:Overriding a function in Emacs Lisp覆盖 Emacs Lisp 中的函数
【发布时间】:2010-03-09 05:12:17
【问题描述】:

我想暂时覆盖 kill-new 功能。我有一种方法我想重新实现 kill-new 仅在某些情况下有效,但我不想在此之上重新实现 kill-region 的特殊版本。 (kill-new 是从 kill-region 调用的)

由于 Emacs Lisp 使用动态范围,这应该是可能的,对吧? (另一方面,支持这似乎是一件不安全的事情,知道它可能会让我有点紧张......)

我已经尝试过使用 let 和 fset,但到目前为止还没有找到让它按预期工作的方法。所以,希望有人能在下面的伪代码中填空:

(defun my-kill-new (string &optional replace yank-handler) 
   (message "in my-kill-new!"))

(defun foo ()
   (some-form-that-binds-a-function (kill-new my-kill-new)
   (kill-region (point) (mark))))

some-form-that-binds-a-function应该是什么?还是我找错树了?

【问题讨论】:

    标签: emacs elisp


    【解决方案1】:

    你的some-form-that-binds-a-function 被称为flet,所以你很接近。

    【讨论】:

      【解决方案2】:

      这是一个解决方案:

      (defadvice kill-new (around my-kill-new (string &optional replace yank-handler)) 
         (message "my-kill-new!"))
      
      
      (defun foo ()
        (progn (ad-enable-advice 'kill-new 'around 'my-kill-new)
           (ad-activate 'kill-new)
           (kill-region (point) (mark))
           (ad-disable-advice 'kill-new 'around 'my-kill-new)
           (ad-activate 'kill-new)))
      

      【讨论】:

      • 我想我更喜欢这个而不是使用 flet 来达到这个目的。虽然使用建议来做这件事需要更多的仪式,但它让我可以轻松访问现有的 kill-new 实现。
      • 您可能希望使用 unwind-protect 删除通知,以便非本地退出也删除通知。只需使用 flet。
      • @kes 如果你想访问kill-new的原始定义,只需将flet它到old-kill-new即可。
      【解决方案3】:

      看看advice 包,它非常擅长做这一切。

      【讨论】:

      • 仅供参考:现在advice 已被nadvice 取代。
      • 我正在运行流血的 emacs,但没有 nadvice,但建议仍然很强大。
      • 这太令人惊讶了。除非“不存在”是指nadvice 不具备advice 的所有功能? github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/…
      • 啊,仍然被称为“建议”,并且仍然如此记录。所以它在那里,但它是“更新的”。不错。
      • 确实如此。较新的系统完成与旧系统相同的事情,但“花里胡哨的东西更少”。也就是说,它更直观,适用于更多情况,更一致,更简单。有朝一日advice.el 将被弃用,但很有可能不会很快被弃用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多