覆盖Emacs Lisp中的函数

时间:2010-03-09 05:12:17

标签: emacs elisp

我想暂时覆盖 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))))

某种形式 - 绑定功能应该是什么?还是我在错误的树上吠叫?

3 个答案:

答案 0 :(得分:13)

您的some-form-that-binds-a-function被称为flet,因此您就近了。

答案 1 :(得分:11)

这是一个解决方案:

(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)))

答案 2 :(得分:2)

查看advice包,它非常擅长完成所有这些。