2016-07-21 19 views
3

Ich verwende einen Emacs-Modus, um einige meiner Dateien zu kommentieren (der tatsächliche Modus ist nicht wichtig). Es wird als eine Bibliothek geliefert und kommt mit kompiliertem Lisp-Code (natürlich). Ich möchte sein Verhalten ändern, indem ich eine einzelne Funktion darin überschreibe. Nur für meine lokale Emacs-Sitzung. Für den Moment kopiere ich einfach die Funktion aus der Quelldatei der Bibliothek, ändere sie etwas und tippe dann auf eval-last-sexp. So weit, ist es gut. Allerdings bekomme ich inkonsistente Ergebnisse: Ich bin mir nicht sicher, wie Emacs Funktionen aus .elc Dateien mit Funktionen aus der Quelle gemischt behandelt. Manchmal sehe ich meine eigene Version der Funktion, manchmal die Originalversion. Sehr verwirrend (und nervig).Eine einzelne Funktion in einer Emacs-Bibliothek überschreiben

Alle Ideen, wie kann ich eine Lisp-Funktion in einer Emacs-Bibliothek ersetzen ohne Änderung der Bibliothek Quelldateien, die schreibgeschützt sind?

Antwort

1

So etwas sollte es tun:

(advice-add 'name-of-func-to-override :override 
      (lambda() (message "does this instead now"))) 

ersetzen name-of-func-to-override mit dem Funktionsnamen und die lambda mit Ihrer Version.

Ich schlage vor, Blick auf die add-function (und advice-add) Dokumente wie :override möglicherweise nicht wirklich was Sie wollen.

+1

Wichtig zu erwähnen, dass 'add-function' und die anderen nur in Emacs 24.4 hinzugefügt wurden (Ich muss meine Emacs aktualisieren). –

1

Die wahrscheinlichste Erklärung für Ihr Problem ist, dass Sie manchmal (kopieren und) eval-last-sexp, bevor die andere Bibliothek geladen ist: der letzte gewinnt!

Die Verwendung von advice-add, wie von @Jack vorgeschlagen, ist eine gute Lösung, da diese Überschreibung angewendet werden kann, bevor die Funktion definiert wird und die normale Definition der Funktion übersteht.

Dies besagt, dass Sie in vielen Fällen keine Funktion außer Kraft setzen müssen. Vielleicht genügt es, eine eigene Funktion mit einem eigenen Namen zu definieren und dann die Tastaturbelegung so zu ändern, dass sie Ihre Funktion statt der aus der Bibliothek ausführt.