Wann muss ein Paketname in Use-Paketen angegeben werden: Tag sicherstellen?

7

use-packageMit dieser Option können Sie Pakete mithilfe des :ensureTags automatisch installieren . Sie können dies wie folgt tun

(use-package <package>
  :ensure t)

Aber für einige Pakete, die nicht funktionieren, wie z auctex. In diesen Fällen können Sie das Paket ensurewie folgt angeben

(use-package tex
  :ensure auctex)

Laut diesem Blog / Tutorial / Site ist der Grund

da nach der Installation auctexdas texPaket überschrieben wird .

Was bedeutet das und wie kann ich feststellen, wann dies für andere Pakete zu tun ist?

LinFelix
quelle

Antworten:

11

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.

Basilikum
quelle