簡體   English   中英

覆蓋Emacs Lisp中的函數

[英]Overriding a function in Emacs Lisp

我想暫時覆蓋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稱為flet ,所以你很接近。

這是一個解決方案:

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

看看advice包,它非常擅長做所有這些。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM