我想暂时覆盖 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))))
某种形式 - 绑定功能应该是什么?还是我在错误的树上吠叫?
答案 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
包,它非常擅长完成所有这些。