Aber für einige Pakete funktioniert das nicht. Wie zum Beispiel auctex
.
Der Grund dafür (use-package tex :ensure t)
funktioniert nicht, auctex
weil auctex
ein GNU ELPA-Paket benannt wird (siehe (emacs) Packages
), während tex
eine Funktion (siehe (elisp) Named Features
) benannt wird, die vom auctex
Paket bereitgestellt wird .
Mit anderen Worten, tex
benennt eine einzelne Datei, tex.el
die als Teil des auctex
Pakets verteilt wird. Betrachten Sie die folgenden Beispiele:
Tippen M-xpp-macroexpand-last-sexp
RETmit 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 NAME
Argument to use-package
und seinem :ensure
Schlü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 t
nur das vom aktuellen Namen benannte Paket bezeichnet wird NAME
. use-package-ensure-elpa
wiederum 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-shadows
RET.
Eine bessere Autorität ist die use-package
Dokumentation 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-package
Strophen 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-contrib
Verteilung 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.el
mit 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-package
beim Abstrahieren nur so weit gehen können.