2010-03-09 3 views
9

Я хотел бы временно переопределить функцию kill-new. У меня есть способ, которым я хочу переопределить kill-new, который работает только в определенных контекстах, но я не хочу переопределять специальную версию kill-region. (kill-new вызывается из области kill)Переопределение функции в Emacs Lisp

Поскольку 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)))) 

Что должно некоторые форм-что-связывает-а-функция быть? Или я лаяю неправильное дерево?

ответ

12

Вот решение:

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

Я думаю, что я предпочитаю это использовать flet для этой цели. Несмотря на то, что это делается с большей консультацией, это дает мне легкий доступ к существующей реализации kill-new. – kes

+6

Возможно, вы захотите удалить совет с помощью защиты от размотки, чтобы нелокальные выходы также удалили совет. Просто используйте flet. – jrockway

+0

@kes Если вы хотите получить доступ к исходному определению 'kill-new', просто' flet' до 'old-kill-new'. –

3

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

+0

FYI: В настоящее время 'совет' был заменен на' nadvice'. –

+0

Я запускаю кровоточащие emacs, а nadvice там нет, но советы все еще сильны. –

+0

Это удивительно. Если «нет», то вы имели в виду, что «nadvice» не обладает всеми функциями «совета»? https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/nadvice.el –

13

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

Смежные вопросы