Come ottenere lo stesso ambiente Emacs su un altro computer?


16

Sono un principiante in Emacs (lo uso da circa 2 settimane e lo adoro). Mentre ~/.emacs.d/init.elaggiorno ed espando il mio file, le cose che scrivo lì dipendono da alcuni pacchetti che ho installato da MELPA M-x package-install, dai .elfile che ho scritto da solo, ecc.

La mia domanda è, dovrei in futuro cambiare computer, ad esempio, qual è il modo migliore per ottenere lo stesso ambiente Emacs esatto sul nuovo computer esattamente come ho ora?


3
Finché puoi muoverti init.el(usando git per esempio), questo approccio funziona anche (basato su use-package): lunaryorn.com/posts/…
VanLaser

Un approccio è mettere la tua directory .emacs.d in Dropbox. L'ho usato solo su computer con lo stesso sistema operativo. Diversi tipi di * nix dovrebbero essere ok, ma potresti avere problemi se provi a condividere su macchine che eseguono sistemi operativi troppo diversi.
Qudit,

Questa domanda è molto vicina a emacs.stackexchange.com/q/408/2710 . Puoi evidenziare le differenze?
Andrew Swann,

Per i non programmatori come me, sincronizzare la configurazione e i pacchetti di emacs su tre macchine (due finestre, un OSX) utilizzando Google Drive è stato efficace e affidabile. Questo funziona perché emacs e la maggior parte dei suoi pacchetti sono in gran parte indipendenti dalla piattaforma. La riproduzione multipiattaforma di un'esperienza emacs identica richiede solo poche righe nel file init.el per risolvere percorsi specifici del sistema operativo nella directory del pacchetto emacs sincronizzato.
Snelephant,

La tua configurazione è la tua intera ~/.emacs.ddirectory, quindi usa il metodo che preferisci per sincronizzarlo tra le macchine. (ad esempio un repository Github, una cartella Dropbox o qualunque cosa funzioni meglio per te).
phils,

Risposte:


9

La soluzione corretta è usare straight.elun gestore di pacchetti che ho scritto per risolvere questo problema. Puoi trovare maggiori dettagli a riguardo in un'altra risposta a questa domanda .

Questa risposta, che è stata scritta mesi prima che iniziassi a lavorare straight.el, descriveva in precedenza un modo strettamente inferiore di ottenere una soluzione parziale. Questo approccio è brevemente descritto di seguito; Non lo consiglio più.

Anche se non vuoi usarlo straight.el, dovresti almeno adottare use-package. (Non che i due si escludano a vicenda: credo che la configurazione più pulita provenga dall'uso di entrambi.)


Inizia definendo un elenco di pacchetti nel tuo file init:

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

Quindi installali automaticamente:

(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))))

Se si mantiene il init.elfile sotto il controllo della versione, la sincronizzazione con un altro computer comporterà l'installazione automatica dei pacchetti. Naturalmente, le versioni installate saranno completamente diverse e, di conseguenza, non ci si può aspettare che la configurazione funzioni immediatamente. Questo è un difetto fondamentale di package.el, ed è uno dei motivi per cui questo approccio è negativo. Vedere di nuovo straight.el. Si noti inoltre che il codice descritto sopra separa l'elenco dei pacchetti dalla propria configurazione per tali pacchetti, rendendo più difficile tenere traccia delle cose nel file init. Questo è un altro grande svantaggio. Vedere di nuovo use-package.


Grazie per il commento! Se scelgo di ospitare tutto su Github, compresi i pacchetti che ho scaricato da MELPA, manterrà la capacità di MELPA di aggiornare automaticamente i pacchetti sul nuovo computer?
space_voyager,

1
@space_voyager Sì, tutto accadrà comunque allo stesso modo. Tuttavia: (1) quando cloni su un nuovo computer, Emacs non dovrà scaricare pacchetti da MELPA, perché sono già nel repository che hai appena clonato; e (2) ogni volta che si utilizza package.elper aggiornare i pacchetti, si avranno modifiche non messe in scena nel proprio repository e sarà necessario impegnarsi per includere gli aggiornamenti dei pacchetti.
Radon Rosborough,

Grazie mille. Ancora una cosa: ho pensato che MELPA eseguisse automaticamente gli aggiornamenti dei pacchetti. Non è così?
space_voyager,

1
@space_voyager: Beh, ovviamente il repository dei pacchetti remoti verrà aggiornato, ma le versioni aggiornate dei pacchetti non vengono scaricate e installate automaticamente sul tuo computer locale. Per questo è necessario M-x list-packages RET U.
Radon Rosborough,

1
@Lassi Risposta breve: usa quello che vuoi installare Emacs; usare straight.elsolo per installare i pacchetti Emacs. Nix è un'ottima idea, ma non è ben ottimizzato per lo sviluppo del pacchetto Emacs, per quanto ne so (per favore correggimi se sbaglio) . Se usi un gestore di pacchetti di sistema per installare i pacchetti Emacs, non sarai in grado di modificare il loro codice sorgente e quindi eseguire il commit e il push delle modifiche a monte. L'ultima volta che ho esaminato una configurazione Nix per i pacchetti Emacs, mi è sembrato eccessivamente complesso e generalmente inferiore straight.elall'esperienza di sviluppo. Ma qualunque cosa galleggi la tua barca.
Radon Rosborough,

11

Se usi use-package , puoi spostare quel file da un computer all'altro e all'avvio di Emacs, finché avrai accesso a internet, tirerà dentro i pacchetti e li configurerà.

Innanzitutto, imposta la libreria dei pacchetti:

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

E poi bootstrap use-package:

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

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

Ora, invece di configurare Emacs e supporre che i pacchetti siano installati, utilizzare use-packagesia per installarli che per configurarli. Ad esempio, per alcune delle mie impostazioni del timone:

(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))

Intendiamoci, questo ottiene la configurazione (in init.el) attraverso, ma c'è molto di più. Ad esempio, questo non porta i file dabbrev, i tuoi frammenti personalizzati o una tonnellata di altre cose.
Omair Majid,

Sì. Se hai altri file che fanno parte della tua configurazione, dovrai spostarli anche insieme al tuo file init.
zck,

a quel punto, diventa di nuovo un gioco di "quale file fa effettivamente parte della mia configurazione e come posso mantenerlo sincronizzato tra le mie macchine" :(
Omair Majid,

è necessario aggiungere :ensure talla use-packagedichiarazione o impostare use-package-always-ensuresu t. Altrimenti non verrebbe installato automaticamente su un altro sistema quando copiato la configurazione.
Chakravarthy Raghunandan,

6

Gestione dei pacchetti di prossima generazione con straight.el

Dopo una lunga e frustrante lotta per usare package.el+ Quelpa per gestire i miei pacchetti, ho morso il proiettile e ho scritto il mio gestore di pacchetti . È destinato a sostituire completamente package.elfornendo un'esperienza di gestione dei pacchetti che è superiore in quasi tutti i modi.

Puoi leggere la documentazione molto estesa per conoscere tutte le sue funzionalità, ma la più rilevante per questa domanda è che si straight.elconcentra sulla perfetta riproducibilità . Ciò significa che non dovrebbe importare se si avvia normalmente Emacs o se lo si avvia su una nuova macchina e se eventuali modifiche locali sono controllate dalla versione e possono essere ripristinate a uno stato canonico. In pratica, ciò si ottiene (1) clonando pacchetti come repository Git e fornendo strumenti automatizzati per la gestione del loro stato; (2) usare il file init come unica fonte di verità per lo stato di gestione dei pacchetti, senza dati mutabili memorizzati altrove; e (3) l'utilizzo di lockfile versione opzionali per specificare le revisioni Git esatte di ogni pacchetto, oltre a tutti i repository di ricette estraight.el si.

Per iniziare, inserisci lo snippet di bootstrap , che verrà installato e attivato straight.el. Quindi, per assicurarsi che sia installato un pacchetto, è sufficiente effettuare una chiamata straight-use-packagenel file init:

(straight-use-package 'projectile)

Sì, è così semplice. Non avere a che fare con package-refresh-contentsnessuno di quei rifiuti. Se rimuovi questo modulo dal tuo file init e riavvii Emacs, Projectile non verrà più caricato (diversamente da in package.el). Questo significa che non devi preoccuparti che la tua configurazione in qualche modo non funzioni su una nuova macchina perché dipendevi accidentalmente da pacchetti non dichiarati.

Puoi installare i pacchetti dove e quando vuoi, attraverso il tuo file init (non è necessario dichiararne un elenco in un unico punto). Ovviamente puoi anche solo fare

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

se preferisci la lista. Vi consiglio comunque di utilizzare use-packageper gestire la configurazione del pacchetto. Per prima cosa devi installarlo:

(straight-use-package 'use-package)

Quindi, poiché straight.elha un'integrazione integrata con use-package, il seguente "funziona":

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

Dopo aver scritto il file init per installare i pacchetti necessari, esegui M-x straight-freeze-versionsper salvare un file di blocco versione ~/.emacs.d/straight/versions/default.el. Dovresti tenere questo file sotto controllo di versione, poiché consentirà straight.eldi verificare le versioni corrette di tutti i tuoi pacchetti, quando avvii Emacs per la prima volta su un nuovo computer. (È possibile ripristinare manualmente le versioni specificate nel file di blocco utilizzando M-x straight-thaw-versions.)

A supporto dell'idea dei dotfile locale-macchina che ho citato nella mia altra risposta , straight.eloffre un sistema di profili . Consiglio ancora di usare i symlink per i tuoi dotfile (in questo caso, il init.eltuo file init locale, se applicabile, e il file lock della versione se vuoi usarne uno).

Se ti stai chiedendo come si straight.elconfronta con altri gestori di pacchetti, dai un'occhiata alla sezione dei confronti approfonditi . Ma c'è anche molta più documentazione su tutto il resto .


4

Puoi usare cask per gestire i tuoi pacchetti. Usa git / github per controllare il codice sorgente e sincronizzare i tuoi dotfile emacs.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.