2010-03-09 10 views
9

Quisiera anular temporalmente la función kill-new. Tengo una forma en la que quiero volver a implementar kill-new que funciona solo en ciertos contextos, pero no quiero volver a implementar una versión especial de kill-region encima de eso. (kill-new se llama desde kill-region)Reemplazando una función en Emacs Lisp

Dado que Emacs Lisp utiliza el alcance dinámico, esto debería ser posible, ¿no? (Por otro lado, parece que sería inseguro apoyar esto, y podría ponerme un poco nervioso sabiendo que es posible ...)

He experimentado con el uso de let y fset, pero entonces Hasta ahora no han encontrado la forma de hacerlo funcionar como se esperaba. Por lo tanto, es de esperar que alguien puede llenar el espacio en blanco en el siguiente pseudocódigo:

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

Lo que debe alguna forma-que-une-a-función ser? ¿O estoy ladrando el árbol equivocado?

Respuesta

12

Aquí es una solución:

(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

Creo que prefiero usar flet para este propósito. Aunque hay más ceremonias al hacerlo usando consejos, me da fácil acceso a la implementación existente de matar-nuevo. – kes

+6

Probablemente desee eliminar el consejo con un desenrollar-proteger, para que las salidas no locales también eliminen el consejo. Solo usa flet. – jrockway

+0

@kes Si desea acceder a la definición original de 'kill-new', simplemente' flet' it 'old-kill-new'. –

3

Mire el paquete advice, que es muy bueno para hacer todo esto.

+0

FYI: en la actualidad 'advice' ha sido reemplazado por' nadvice'. –

+0

Estoy ejecutando las emacs sangrantes, y nadvice no está allí, pero el consejo sigue siendo fuerte. –

+0

Eso es sorprendente. A menos que por "no esté allí" querías decir que 'nadvice' no tiene todas las características de' advice' https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/nadvice.el –

13

Su some-form-that-binds-a-function se llama flet, por lo que estaban cerca.

Cuestiones relacionadas