Aber für einige Pakete funktioniert das nicht. Wie zum Beispiel auctex.
Der Grund dafür (use-package tex :ensure t)funktioniert nicht, auctexweil auctexein GNU ELPA-Paket benannt wird (siehe (emacs) Packages), während texeine Funktion (siehe (elisp) Named Features) benannt wird, die vom auctexPaket bereitgestellt wird .
Mit anderen Worten, texbenennt eine einzelne Datei, tex.eldie als Teil des auctexPakets verteilt wird. Betrachten Sie die folgenden Beispiele:
Tippen M-xpp-macroexpand-last-sexpRETmit Punkt nach
(use-package tex
:ensure t)
gibt eine Form, die auf läuft
(progn
(use-package-ensure-elpa 'tex '(t) 'nil)
(require 'tex nil t))
während das gleiche mit tun
(use-package tex
:ensure auctex)
effektiv erweitert auf
(progn
(use-package-ensure-elpa 'tex '(auctex) 'nil)
(require 'tex nil t))
Dies zeigt den Unterschied im Zweck zwischen dem NAMEArgument to use-packageund seinem :ensureSchlüsselwort. Ersteres deklariert, welches benannte Merkmal der Rest der Strophe betrifft / standardmäßig mit genau der gleichen Bedeutung wie in with-eval-after-load; siehe (elisp) Hooks for Loading.
Letzterer fordert lediglich die Installation der angegebenen Pakete über das zweite Argument für die Funktion an use-package-ensure-elpa, wobei tnur das vom aktuellen Namen benannte Paket bezeichnet wird NAME. use-package-ensure-elpawiederum Anrufe package-install; Details dazu siehe (emacs) Package Installation.
Laut diesem Blog / Tutorial / Site ist der Grund
da auctex nach der Installation das tex-Paket überschreibt.
Was bedeutet das
Leider ist dies sowohl falsch als auch irreführend. "Überschreiben" bezieht sich normalerweise auf das Ersetzen oder Patchen vorhandener Funktionen durch Affen, z . B. durch Beratung . Wenn ein Paket dieselbe benannte Funktion wie ein anderes bietet und diese somit vor den Emacs-Ladefunktionen verbirgt, wird dies als "Shadowing" bezeichnet.
Die AUCTeX-Distribution überschreibt und erweitert verschiedene integrierte TeX-bezogene Funktionen, schattiert jedoch keine integrierten Bibliotheken. Sie können dies bestätigen, indem Sie das Ergebnis von überprüfen M-xlist-load-path-shadowsRET.
Eine bessere Autorität ist die use-packageDokumentation selbst: https://github.com/jwiegley/use-package/#package-installation .
Wie kann ich feststellen, wann dies für andere Pakete zu tun ist?
Dies hängt sowohl davon ab, wie Sie Ihre use-packageStrophen gruppieren möchten, als auch vom Namen des entsprechenden Pakets. Wenn Sie beispielsweise alle oder die meisten Ihrer Org-bezogenen Einstellungen unter einer einzigen zusammenfassen (use-package org ...)möchten, aber die org-plus-contribVerteilung von Org anstelle der integrierten verwenden möchten, schreiben Sie
(use-package org
:ensure org-plus-contrib
...)
Du würdest nicht schreiben
(use-package org-plus-contrib
:ensure t
...)
weil es keine Datei org-plus-contrib.elmit dem Namen gibt, auch wenn es ein Paket mit dem Namen gibt org-plus-contrib. Sie würden auch nicht schreiben
(use-package auctex
:ensure t
...)
Aus dem gleichen Grund gibt es keine benannte Funktion auctex(es gibt eine Datei auctex.el, die jedoch nicht aufgerufen wird (provide 'auctex)).
Beachten Sie, dass keine dieser Diskrepanzen / Semantiken spezifisch ist für use-package; Dies sind alles (leistungsstarke und nützliche) Emacs-Funktionen, die use-packagebeim Abstrahieren nur so weit gehen können.