Wie kann ich ein Makro ändern, das ich häufig aufrufe?

7

Ich use-packageorganisiere meine init.el. Mir ist aufgefallen, dass alle meine Erklärungen verwenden :ensure t. Eine Beispieldeklaration lautet:

(use-package auto-complete
  :ensure t
  :diminish auto-complete-mode
  :init (global-auto-complete-mode t))

Gibt es eine Möglichkeit, Änderungen implizit einzuschließen, ohne use-package.el direkt zu ändern , da alle meine use-packageDeklarationen verwendet werden? Idealerweise möchte ich keine Funktion mit einem anderen Namen verwenden.:ensure tuse-package:ensure t

Ich bin ein bisschen vertraut damit advice-add, aber ich habe den Eindruck, dass dies verwendet wird, um einer Funktion einen Hook oder eine Umgebung hinzuzufügen, nicht um die Funktion oder das Makro selbst zu ändern.

bsamek
quelle
2
Ratschläge helfen hier nicht weiter, wie Sie bemerkt haben: use-packageIst eigentlich ein Lisp-Makro. Sie können wahrscheinlich ein eigenes my-use-packageMakro erstellen, das use-packagemit den von Ihnen bevorzugten Standardeinstellungen erweitert wird .
Glucas
Makros können ebenfalls empfohlen werden. Fall abgeschlossen.
Politza
@politza Stimmt - nicht sicher, was ich dachte. :-) Könnten Sie ein Beispiel geben, wie das in diesem Fall funktionieren könnte? Ich nehme an, Sie könnten :filter-argsRatschläge verwenden, um Schlüsselwörter wie hinzuzufügen :ensure t?
Glucas
Das wusste ich auch nicht, bevor ich die Infoseite über nadvice.el gelesen habe.
Politza
Ich verstehe, dass die Lösung hier funktioniert, aber ich denke, dasselbe wäre gewesen, eine Wrapper-Funktion für das Use-Package zu schreiben und stattdessen nur diesen Wrapper zu verwenden. Es ist viel klarer und es klingt so, als ob der gesamte Code unter Ihrer Kontrolle steht.
Joseph Garvin

Antworten:

6

Basierend auf @ politzas Kommentar, dass (natürlich!) Ratschläge mit Makros funktionieren, habe ich etwas gefunden, das zu funktionieren scheint.

(defun use-package-always-ensure (form)
  (append form '(:ensure t)))

(advice-add #'use-package :filter-args #'use-package-always-ensure)

Beachten Sie, dass in diesem Beispiel die Beratungsfunktionen von Emacs 24.4 verwendet werden. Ich habe nicht herausgefunden, was das Äquivalent für ältere Versionen von Emacs sein würde.

Glucas
quelle
Ich bin mir nicht sicher, wie sich diese Verwendung von Ratschlägen auf das Verhalten von Byte-Kompilierungsdateien auswirkt, die das empfohlene Makro verwenden ... Kann jemand dazu einen Kommentar abgeben?
Glucas
1
Makros werden während der Kompilierung ausgewertet, daher muss der Rat zum Zeitpunkt der Kompilierung verfügbar sein, entweder durch requireeine Funktion, die den Rat liefert, oder mit eval-when-compile.
5

Die neuere Version von use-packagebietet Folgendes, um dieses Verhalten für alle Pakete zu aktivieren:

(setq use-package-always-ensure t) 

Nur für den Fall, dass jemand die gleiche Frage hatte.

Tianxiang Xiong
quelle