Переопределение функции в Emacs Lisp - PullRequest
9 голосов
/ 09 марта 2010

Я бы хотел временно переопределить функцию 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 ]

13 голосов
/ 09 марта 2010

Ваш some-form-that-binds-a-function называется flet, поэтому вы были близко.

11 голосов
/ 09 марта 2010

Вот решение:

(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 голосов
/ 09 марта 2010

Посмотрите на пакет advice, который очень хорошо справляется со всем этим.

...