Wie automatisiere ich die Installation von Paketen mit der .emacs-Datei?

9

Meine ~/.emacs( auf GitHub zu findende ) Datei lädt mehrere verschiedene Emacs-Pakete und ich möchte, dass sie automatisch installiert werden, sobald Emacs gestartet wird, sofern sie nicht bereits installiert sind. Auf diese Weise muss ich nicht jedes Paket manuell installieren, wenn ich mein Ubuntu 16.04-Betriebssystem erneut installieren muss M-x package-install. Gibt es eine Möglichkeit, eine ~/.emacsDatei so zu schreiben , dass beim Laden automatisch alle geladenen Pakete installiert werden? Ich möchte, dass dies mit einem Minimum an Zeilen durchgeführt wird, da über zehn verschiedene Pakete geladen sind. Wenn ich also für jedes einzelne Paket zusätzliche Zeilen hinzufügen muss, wird dies ~/.emacsziemlich lang.

BH2017
quelle
3
Es gibt verschiedene Möglichkeiten, aber Sie sollten github.com/jwiegley/use-package
Bertfred
Ist es möglich, mehrere Pakete in einer einzigen Zeile mit zu laden use-package, wie ich es in Zeile 61 meiner .emacs-Datei tue?
BH2017
Siehe package-install-selected-packages(erfordert Emacs 25.1).
Politza
Warum ist es aus Neugier so wünschenswert, alle Ihre Pakete in einer einzigen Zeile aufzulisten? Der einzige Grund, den Sie angeben, besteht darin, zu verhindern, dass Ihre ~/.emacsDatei "lang" wird. Aber wenn Sie nur ein Dutzend Pakete laden, sind Sie wirklich besorgt über die zusätzlichen 11 Zeilen in Ihrer Konfiguration?
Nispio
Nun, das war vor ein paar Monaten, also erinnere ich mich nicht an mein spezifisches Denken, aber ich vermute, es war in dem Sinne, dass versucht wurde, den Arbeitsaufwand zu minimieren, wenn ich ein Paket zur automatisch installierten Liste hinzufüge oder von dieser abziehe. Ich wollte nicht, dass der Datei für jedes einzelne installierte Paket mehrere Zeilen hinzugefügt werden.
BH2017

Antworten:

11

Am einfachsten ist die Installation use-package.

(package-initialize)
(require 'package)
(add-to-list 'package-archives
    '("melpa" . "http://melpa.milkbox.net/packages/") t)

(dolist (package '(use-package))
   (unless (package-installed-p package)
       (package-install package)))

Dann

 (use-package paredit
   :ensure t)

Das :ensure tist es, was sicherstellt , dass das Paket installiert ist.

Um nur zu laden, stellen Sie sicher, dass mehrere Pakete installiert sind

(dolist (package '(package-a package-b package-c))
 (unless (package-installed-p package)
   (package-install package))
   (require package))))
njdan5691
quelle
Können Sie mehrere Pakete angeben, die in eine einzelne Zeile geladen werden sollen?
BH2017
Wenn Sie Use-Package meinen, dann kann nein, aber der obige Ausdruck
njdan5691
Nun, meine Frage bezieht sich auf mehrere Pakete. Bearbeiten Sie Ihre Antwort so, dass sie genau das tut, mehrere Pakete lädt und, falls nicht vorhanden, automatisch installiert.
BH2017
Die Doliste kann in '(use-package' some-other-package) geändert werden, es kann jedoch keine andere Konfiguration vorgenommen werden. Ich würde empfehlen, für jedes Paket eine Zeile mit use-package zu haben.
njdan5691
Ich habe über zehn verschiedene Pakete geladen, daher wäre eine kompaktere Lösung wünschenswert.
BH2017
4

package.elVerfolgt die Pakete, die Sie installieren möchten (im Gegensatz zu den Paketen, die automatisch als Abhängigkeiten installiert werden), in der benutzerdefinierten Variablen package-selected-packages.

Wenn Sie also Ihre ~/.emacs(in die Custom normalerweise Einstellungen wie die von schreibt package-selected-packages) auf ein anderes System kopieren , müssen Sie nur noch etwas tun M-x package-install-selected-packages.

Natürlich werden die Pakete dadurch nicht automatisch installiert, wenn sie nicht vorhanden sind, aber ich halte es für eine Funktion (ich denke, es ist ein Fehler für ein Programm wie Emacs, Netzwerkverbindungen ohne ausdrückliche Aufforderung herzustellen). Und es erspart Ihnen die Mühe, jedes Paket einzeln zu installieren.

Stefan
quelle
Vielen Dank. Ich möchte nur meinen Anwendungsfall teilen, der sich von dem des OP unterscheidet: Ich übertrage meine Punktedateien häufig zwischen Maschinen (insbesondere in der Cloud, wo sie ständig erstellt und beendet werden). Das Paketverzeichnis ist ziemlich umfangreich, mit elpy v-env und dem Spülbecken, besonders wenn alte Versionen nicht automatisch zugeschnitten werden, AFAIK. Es ist viel einfacher, ein paar kleine Dateien einzulegen und Pakete neu zu installieren, als sie herumzutragen.
km
Ich habe vergessen, eines zu erwähnen: (package-refresh-contents)Muss schon einmal aufgerufen werden, (package-install-selected-packages)wenn das lokale Paketverzeichnis vollständig fehlt, damit die Archivverzeichnisse der Paketverteilung zuerst in den Unterverzeichnissen des archive/Verzeichnisses zwischengespeichert werden.
km