Wie bekomme ich die gleiche Emacs-Umgebung auf einem anderen Computer?

16

Ich bin ein Anfänger in Emacs (benutze es seit ungefähr 2 Wochen und liebe es). Während ich meine ~/.emacs.d/init.elDatei aktualisiere und erweitere , hängen die Dinge, die ich dort schreibe, von bestimmten Paketen ab, die ich mit MELPA installiert habe M-x package-install, von .elDateien, die ich selbst geschrieben habe usw.

Meine Frage ist, sollte ich in Zukunft zum Beispiel auf andere Computer umsteigen, wie lässt sich auf dem neuen Computer am besten die gleiche Emacs-Umgebung wie jetzt nahtlos erreichen?

space_voyager
quelle
3
Solange Sie sich bewegen können init.el(zum Beispiel mit git), funktioniert dieser Ansatz auch (basierend auf use-package): lunaryorn.com/posts/…
VanLaser
Ein Ansatz besteht darin, das Verzeichnis .emacs.d in Dropbox abzulegen. Ich habe es nur auf Computern mit demselben Betriebssystem verwendet. Verschiedene Versionen von * nix sollten in Ordnung sein, aber Sie könnten Probleme haben, wenn Sie versuchen, auf Computern mit zu unterschiedlichen Betriebssystemen zu arbeiten.
Qudit
Diese Frage steht sehr nahe an emacs.stackexchange.com/q/408/2710 . Können Sie die Unterschiede hervorheben?
Andrew Swann
Für Nicht-Programmierer wie mich war es effektiv und zuverlässig, die emacs-Konfiguration und -Pakete auf drei Computern (zwei Fenster, ein OSX) mit Google Drive zu synchronisieren. Dies funktioniert, weil Emacs und die meisten seiner Pakete weitgehend plattformunabhängig sind. Die plattformübergreifende Wiedergabe einer identischen Emacs-Erfahrung erfordert nur wenige Zeilen in der Datei init.el, um betriebssystemspezifische Pfade zum synchronisierten Emacs-Paketverzeichnis aufzulösen.
Snelephant
Ihre Konfiguration ist Ihr gesamtes ~/.emacs.dVerzeichnis. Verwenden Sie also eine beliebige Methode, um diese zwischen Computern zu synchronisieren. (zB ein Github-Repository oder ein Dropbox-Ordner oder was auch immer für Sie am besten funktioniert).
Phils

Antworten:

9

Die richtige Lösung ist straight.el, einen Paketmanager zu verwenden , den ich geschrieben habe, um dieses Problem zu lösen. Weitere Informationen hierzu finden Sie in einer anderen Antwort auf diese Frage .

Diese Antwort, die Monate vor Beginn meiner Arbeit verfasst wurde straight.el, beschrieb zuvor einen streng minderwertigen Weg, um eine Teillösung zu erreichen. Dieser Ansatz wird im Folgenden kurz beschrieben. Ich kann es nicht mehr empfehlen.

Auch wenn Sie nicht verwenden möchten straight.el, sollten Sie sich zumindest verabschieden use-package. (Nicht, dass sich die beiden gegenseitig ausschließen - ich glaube, das sauberste Setup ergibt sich aus der Verwendung von beiden.)


Beginnen Sie mit der Definition einer Liste von Paketen in Ihrer Init-Datei:

(defvar my-packages
        '(
          aggressive-indent
          avy
           .
           .
           .
          projectile
          undo-tree
          )
  "List of packages to be installed at Emacs startup.")

Dann installiere sie automatisch:

(require 'cl-lib)
(package-initialize)
(unless (cl-every #'package-installed-p my-packages)
  (dolist (package my-packages)
    (unless (package-installed-p package)
      (package-install package))))

Wenn Sie Ihre init.elDatei unter Versionskontrolle halten, führt die Synchronisierung mit einem anderen Computer dazu, dass Ihre Pakete automatisch installiert werden. Natürlich sind die installierten Versionen völlig anders und es ist nicht zu erwarten, dass Ihre Konfiguration sofort funktioniert. Dies ist ein grundlegender Mangel von package.elund einer der Gründe, warum dieser Ansatz schlecht ist. Sehen Sie noch einmal straight.el. Beachten Sie auch, dass der oben beschriebene Code Ihre Paketliste von Ihrer Konfiguration für diese Pakete trennt, was es schwieriger macht, die Dinge in Ihrer Init-Datei im Auge zu behalten. Dies ist ein weiterer großer Nachteil. Sehen Sie noch einmal use-package.

Radon Rosborough
quelle
Danke für das Schreiben! Wenn ich alles auf Github hosten möchte, einschließlich der Pakete, die ich von MELPA heruntergeladen habe, behält dies die Fähigkeit von MELPA bei, die Pakete auf dem neuen Computer automatisch zu aktualisieren?
space_voyager
1
@space_voyager Ja, alles wird immer noch genauso ablaufen. Allerdings: (1) , wenn Sie auf einen neuen Computer zu klonen, wird Emacs nicht brauchen , um Download - Pakete von Melpa, weil sie bereits im Repository sind Sie nur geklont; und (2) wann immer Sie package.elzum Aktualisieren von Paketen verwenden, werden Sie nicht bereitgestellte Änderungen in Ihrem Repository haben, und Sie müssen ein Commit durchführen, um die Paketaktualisierungen aufzunehmen.
Radon Rosborough
Vielen Dank. Eine weitere Sache: Ich dachte, MELPA führt Paketaktualisierungen automatisch durch. Ist das nicht der Fall?
space_voyager
1
@space_voyager: Natürlich wird das Remote-Paket-Repository aktualisiert, aber die aktualisierten Versionen der Pakete werden nicht automatisch heruntergeladen und auf Ihrem lokalen Computer installiert. Dafür musst du M-x list-packages RET U.
Radon Rosborough
1
@Lassi Kurze Antwort: Benutze was immer du willst, um Emacs zu installieren; verwendet straight.elnur Emacs - Pakete zu installieren. Nix ist eine großartige Idee, aber meines Wissens nach nicht optimal für die Entwicklung von Emacs-Paketen (bitte korrigieren Sie mich, wenn ich mich irre) . Wenn Sie zur Installation von Emacs-Paketen einen Systempaket-Manager verwenden, können Sie deren Quellcode nicht einfach bearbeiten und die Änderungen anschließend festschreiben und in den Upstream übertragen. Als ich mir das letzte Mal eine Nix-Konfiguration für Emacs-Pakete angesehen habe, schien sie übermäßig komplex und der straight.elEntwicklungserfahrung generell unterlegen zu sein . Aber was auch immer Ihr Boot schwimmt.
Radon Rosborough
11

Wenn Sie use -package verwenden , können Sie diese Datei von Computer zu Computer verschieben. Wenn Emacs gestartet wird, werden die Pakete abgerufen und konfiguriert, sofern Sie über einen Internetzugang verfügen.

Richten Sie zuerst die Paketbibliothek ein:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)

Und dann Bootstrap use-package:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

(eval-when-compile (require 'use-package))

Anstatt Emacs zu konfigurieren und davon auszugehen, dass Pakete installiert sind, können Sie sie jetzt use-packagesowohl installieren als auch konfigurieren. Zum Beispiel für einige meiner Helmeinstellungen:

(use-package helm
  :ensure t
  :bind (("M-x" . helm-M-x)
         ("M-y" . helm-show-kill-ring)
         ("C-x C-f" . helm-find-files)
         ("M-s o" . helm-occur))

  :config
  (helm-mode 1)
  (setq helm-echo-input-in-header-line t))
zck
quelle
Wohlgemerkt, das bringt die Konfiguration (in init.el) rüber, aber es steckt noch viel mehr dahinter. Zum Beispiel werden die Dabbrev-Dateien, Ihre benutzerdefinierten Snippets oder jede Menge andere Dinge nicht portiert.
Omair Majid
Ja. Wenn Sie andere Dateien haben, die Teil Ihrer Konfiguration sind, müssen Sie diese neben Ihrer Init-Datei auch verschieben.
zck
an diesem Punkt wird es wieder eine Partie „ die Datei tatsächlich einen Teil meiner Konfiguration ist und wie halte ich es synchron über meine Maschinen“ :(
Omair Majid
Sie sollte noch hinzufügen , :ensure tauf die use-packageErklärung oder Satz use-package-always-ensurezu t. Andernfalls würde es nicht automatisch auf einem anderen System installiert, wenn die Konfiguration kopiert wird.
Chakravarthy Raghunandan
6

Paketverwaltung der nächsten Generation mit straight.el

Nach einem langen und frustrierenden Kampf package.el, meine Pakete mit + Quelpa zu verwalten, habe ich mich aufgeregt und meinen eigenen Paketmanager geschrieben . Es soll vollständig ersetzt package.elwerden, indem eine Paketverwaltungserfahrung bereitgestellt wird, die in fast jeder Hinsicht überlegen ist .

Sie können die sehr umfangreiche Dokumentation lesen , um mehr über alle Funktionen zu erfahren. Die relevanteste für diese Frage ist jedoch, dass straight.eldie perfekte Reproduzierbarkeit im Vordergrund steht . Dies bedeutet, dass es keine Rolle spielt, ob Sie Emacs normal oder auf einem neuen Computer starten. Alle lokalen Änderungen sind versionskontrolliert und können in einen kanonischen Zustand zurückgesetzt werden. In der Praxis wird dies erreicht, indem (1) Pakete als Git-Repositorys geklont werden und automatisierte Tools zum Verwalten ihres Zustands bereitgestellt werden; (2) Verwenden der Init-Datei als einzige Wahrheitsquelle für den Paketverwaltungsstatus, wobei keine veränderlichen Daten an anderer Stelle gespeichert werden; und (3) Verwenden optionaler Versionssperrdateien, um genaue Git-Revisionen jedes Pakets sowie aller Rezept-Repositorys und zu spezifizierenstraight.el selbst.

Fügen Sie zunächst das Bootstrap-Snippet ein , das installiert und aktiviert wird straight.el. Um sicherzustellen, dass ein Paket installiert ist, rufen straight-use-packageSie einfach in Ihrer init-Datei auf:

(straight-use-package 'projectile)

Ja, so einfach ist das. Kein Umgang mit package-refresh-contentsoder irgendetwas davon. Wenn Sie dieses Formular aus Ihrer Init-Datei entfernen und Emacs neu starten, wird Projectile (anders als in ) nicht mehr geladenpackage.el . Dies bedeutet, dass Sie sich keine Gedanken darüber machen müssen, ob Ihre Konfiguration auf einem neuen Computer nicht funktioniert, da Sie versehentlich von nicht deklarierten Paketen abhängig waren.

Sie können Pakete in Ihrer gesamten Init-Datei installieren, wann und wo immer Sie möchten (es ist nicht erforderlich, eine Liste von Paketen an einem einzelnen Punkt zu deklarieren). Natürlich kannst du das auch einfach machen

(dolist (package '(ace-jump-mode ... zzz-to-char)) (straight-use-package package))

wenn Sie die Liste bevorzugen. Ich empfehle jedoch, dass Sie verwenden use-package, um Ihre Paketkonfiguration zu verwalten. Zuerst musst du es installieren:

(straight-use-package 'use-package)

Dann, da straight.eldie Integration mit eingebaut wurde use-package, "funktioniert" folgendes:

(use-package projectile
  :straight t
  :init (projectile-mode 1))

Sobald Sie Ihre Init-Datei geschrieben haben, um die benötigten Pakete zu installieren, führen Sie sie aus M-x straight-freeze-versions, um eine Versionssperrdatei zu speichern ~/.emacs.d/straight/versions/default.el. Sie sollten diese Datei unter Versionskontrolle halten, da Sie straight.elbeim ersten Start von Emacs auf einem neuen Computer die korrekten Versionen aller Ihrer Pakete überprüfen können. (Sie können mit manuell zu den in der Sperrdatei angegebenen Versionen zurückkehren M-x straight-thaw-versions.)

Um die Idee von maschinenlokalen Punktdateien zu unterstützen, die ich in meiner anderen Antwort erwähnt habe , straight.elbietet sich ein Profilsystem an . Ich empfehle weiterhin die Verwendung von Symlinks für Ihre Punktedateien (in diesem Fall init.elIhre lokale Init-Datei, falls zutreffend, und die Versionssperrdatei, falls Sie eine verwenden möchten).

Wenn Sie sich fragen, wie sich der straight.elVergleich mit anderen Paketmanagern gestaltet, lesen Sie den Abschnitt mit den ausführlichen Vergleichen . Aber auch zu allem anderen gibt es viel mehr Dokumentation .

Radon Rosborough
quelle
4

Sie können cask verwenden , um Ihre Pakete zu verwalten. Verwende git / github, um deine Emacs-Dotfiles zu verwalten und zu synchronisieren.

Goromlagche
quelle