2010-03-09 11 views
9

Ich möchte vorübergehend die kill-neue Funktion außer Kraft setzen. Ich habe einen Weg, den ich kill-new neu implementieren will, dass nur in bestimmten Kontexten funktioniert, aber ich möchte nicht eine spezielle Version von kill-region obendrauf implementieren. (kill-new heißt von kill-region)Überschreiben einer Funktion in Emacs Lisp

Da Emacs Lisp dynamische Scoping verwendet, sollte dies möglich sein, oder? (Auf der anderen Seite scheint es, dass dies eine unsichere Sache zu unterstützen wäre, und es könnte mich ein bisschen nervös zu wissen, dass es möglich ist ...)

Ich habe mit der Verwendung von Let und Fset experimentiert, aber so Bisher haben wir noch keine Möglichkeit gefunden, es wie erwartet zum Laufen zu bringen. Also, hoffentlich jemand kann den freien Raum in dem folgenden Pseudocode füllen:

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

Was sollte some-Form-that-Bindungen-a-Funktion sein? Oder belle ich den falschen Baum an?

Antwort

12

ist eine Lösung:

(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

Ich denke, ich bevorzuge die Verwendung von flet für diesen Zweck. Obwohl es mehr Zeremonie bei der Verwendung von Ratschlägen gibt, gibt es mir einen einfachen Zugang zu der bestehenden Implementierung von kill-new. – kes

+6

Wahrscheinlich möchten Sie den Hinweis mit einem Abrollschutz entfernen, so dass auch nicht-lokale Ausgänge den Hinweis entfernen. Benutze einfach flet. – jrockway

+0

@kes Wenn Sie auf die ursprüngliche Definition von 'kill-new' zugreifen möchten, müssen Sie nur' flet' auf 'old-kill-new' klicken. –

3

Schauen Sie sich das Paket advice an, was sehr gut ist. Hier

+0

FYI: Heutzutage wurde "Beratung" von "nadvice" abgelöst. –

+0

Ich führe die blutenden Emacs, und Nadice ist nicht da, aber Ratschläge sind immer noch stark. –

+0

Das ist überraschend. Es sei denn, "ist nicht da" du meintest, "nadvice" hat nicht alle Merkmale von "advice"? https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/nadvice.el –

13

Ihre some-form-that-binds-a-functionflet genannt wird, so Sie in der Nähe waren.

Verwandte Themen