Comment obtenir le même environnement Emacs sur un autre ordinateur?

16

Je suis un débutant dans Emacs (je l'utilise depuis environ 2 semaines maintenant et je l'adore). Au fur et à mesure que je mets à jour et développe mon ~/.emacs.d/init.elfichier, les choses que j'y écris dépendent de certains packages que j'ai installés à partir de MELPA M-x package-install, de .elfichiers que j'ai écrits moi-même, etc.

Ma question est la suivante: devrais-je à l'avenir changer d'ordinateurs par exemple, quelle est la meilleure façon d'obtenir de manière transparente le même environnement Emacs exact sur le nouvel ordinateur que je l'ai maintenant?

space_voyager
la source
3
Tant que vous pouvez vous déplacer init.el(en utilisant git par exemple), cette approche fonctionne également (basée sur use-package): lunaryorn.com/posts/…
VanLaser
Une approche consiste à placer votre répertoire .emacs.d dans Dropbox. Je ne l'ai utilisé que sur des ordinateurs avec le même système d'exploitation. Différentes versions de * nix devraient être correctes, mais vous pourriez avoir des problèmes si vous essayez de partager sur des machines exécutant des systèmes d'exploitation trop différents.
Qudit
Cette question est très proche de emacs.stackexchange.com/q/408/2710 . Pouvez-vous mettre en évidence les différences?
Andrew Swann
Pour les non-programmeurs comme moi, la synchronisation de la configuration et des packages emacs sur trois machines (deux fenêtres, un OSX) à l'aide de Google Drive a été efficace et fiable. Cela fonctionne car emacs et la plupart de ses packages sont largement indépendants de la plateforme. La reproduction multiplateforme d'une expérience emacs identique ne nécessite que quelques lignes dans le fichier init.el pour résoudre les chemins spécifiques au système d'exploitation vers le répertoire du package emacs synchronisé.
Snelephant
Votre configuration est votre ~/.emacs.drépertoire entier , utilisez donc la méthode que vous préférez pour synchroniser cela entre les machines. (par exemple, un référentiel Github, ou un dossier Dropbox, ou tout ce qui vous convient le mieux).
Phils

Réponses:

9

La bonne solution consiste à utiliser straight.elun gestionnaire de packages que j'ai écrit pour résoudre ce problème. Vous pouvez trouver plus de détails à ce sujet dans une autre réponse à cette question .

Cette réponse, qui a été écrite des mois avant le début de mon travail straight.el, décrivait précédemment une manière strictement inférieure de parvenir à une solution partielle. Cette approche est décrite brièvement ci-dessous; Je ne le recommande plus.

Même si vous ne voulez pas utiliser straight.el, vous devez au moins adopter use-package. (Non pas que les deux s'excluent mutuellement - je pense que la configuration la plus propre vient de l'utilisation des deux.)


Commencez par définir une liste de packages dans votre fichier init:

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

Installez-les ensuite automatiquement:

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

Si vous gardez votre init.elfichier sous contrôle de version, sa synchronisation avec une autre machine entraînera l'installation automatique de vos packages. Bien sûr, les versions installées seront complètement différentes, et votre configuration ne devrait pas fonctionner par défaut. Il s'agit d'un défaut fondamental de package.el, et c'est l'une des raisons pour lesquelles cette approche est mauvaise. À revoir straight.el. Notez également que le code décrit ci-dessus sépare votre liste de packages de votre configuration pour ces packages, ce qui rend plus difficile le suivi des éléments dans votre fichier init. Ceci est un autre inconvénient majeur. À revoir use-package.

Radon Rosborough
la source
Merci pour le compte rendu! Si je choisis d'héberger tout sur Github, y compris les packages que j'ai téléchargés depuis MELPA, cela conservera-t-il la capacité de MELPA de mettre à jour automatiquement les packages sur le nouvel ordinateur?
space_voyager
1
@space_voyager Oui, tout se passera toujours de la même manière. Cependant: (1) lorsque vous clonez vers un nouvel ordinateur, Emacs n'a pas besoin de télécharger les packages de MELPA, car ils sont déjà dans le référentiel que vous venez de cloner; et (2) chaque fois que vous utilisez package.elpour mettre à jour des packages, vous aurez des modifications non programmées dans votre référentiel, et vous devrez faire un commit pour inclure les mises à jour des packages.
Radon Rosborough
Grand merci. Encore une chose: je pensais que MELPA effectuait automatiquement les mises à jour des packages. Ce n'est pas le cas?
space_voyager
1
@space_voyager: Eh bien, bien sûr, le référentiel de packages distant sera mis à jour, mais les versions mises à jour des packages ne sont pas téléchargées et installées automatiquement sur votre machine locale. Pour cela, vous devez M-x list-packages RET U.
Radon Rosborough
1
@Lassi Réponse courte: utilisez ce que vous voulez pour installer Emacs; utilisez straight.eluniquement pour installer les packages Emacs. Nix est une excellente idée, mais il n'est pas bien optimisé pour le développement de paquets Emacs, pour autant que je sache (veuillez me corriger si je me trompe) . Si vous utilisez un gestionnaire de packages système pour installer les packages Emacs, vous ne pourrez pas simplement modifier leur code source, puis valider et pousser vos modifications en amont. La dernière fois que j'ai examiné une configuration Nix pour les packages Emacs, elle semblait trop complexe et généralement inférieure à l' straight.elexpérience de développement. Mais, quoi que flotte votre bateau.
Radon Rosborough
11

Si vous utilisez use-package , vous pouvez déplacer ce fichier d'un ordinateur à l'autre, et quand Emacs démarre, tant que vous avez accès à Internet, il récupérera les packages et les configurera.

Tout d'abord, configurez la bibliothèque de packages:

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

Et puis bootstrap use-package:

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

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

Maintenant, au lieu de configurer Emacs et de supposer que les packages sont installés, utilisez-les use-packagepour les installer et les configurer. Par exemple, pour certains de mes paramètres de barre:

(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
la source
Rappelez-vous, cela obtient la configuration (en init.el), mais il y a beaucoup plus. Par exemple, cela ne portera pas les fichiers dabbrev, ni vos extraits de code personnalisés ou une tonne d'autres choses.
Omair Majid
Oui. Si vous avez d'autres fichiers qui font partie de votre configuration, vous devrez également les déplacer, à côté de votre fichier init.
zck
à ce stade, il redevient un jeu de "quel fichier fait réellement partie de ma configuration et comment le synchroniser sur mes machines" :(
Omair Majid
vous devez ajouter :ensure tà la use-packagedéclaration ou définir use-package-always-ensuresur t. Sinon, il ne serait pas installé automatiquement sur un autre système lors de la copie de la configuration.
Chakravarthy Raghunandan
6

Gestion des packages de nouvelle génération avec straight.el

Après une longue et frustrante lutte pour utiliser package.el+ Quelpa pour gérer mes packages, j'ai mordu la balle et écrit mon propre gestionnaire de packages . Il est destiné à remplacer complètement package.elen fournissant une expérience de gestion de package qui est supérieure à presque tous les égards.

Vous pouvez lire la documentation très complète pour en savoir plus sur toutes ses fonctionnalités, mais la plus pertinente à cette question est celle qui straight.else concentre sur une reproductibilité parfaite . Cela signifie que peu importe si vous démarrez Emacs normalement ou si vous le démarrez sur une nouvelle machine, et que toutes les modifications locales sont contrôlées par la version et peuvent être rétablies dans un état canonique. Concrètement, cela est réalisé en (1) clonant les packages en tant que référentiels Git et en fournissant des outils automatisés pour gérer leur état; (2) utiliser le fichier init comme seule source de vérité pour l'état de gestion des paquets, sans données mutables stockées ailleurs; et (3) en utilisant des fichiers de verrouillage de version facultatifs pour spécifier les révisions Git exactes de chaque paquet, ainsi que tous les référentiels de recettes etstraight.el lui-même.

Pour commencer, insérez l' extrait de démarrage , qui s'installera et s'activera straight.el. Ensuite, pour vous assurer qu'un package est installé, il vous suffit d'appeler straight-use-packagedans votre fichier init:

(straight-use-package 'projectile)

Oui, c'est aussi simple que cela. Aucun traitement package-refresh-contentsou aucune de ces ordures. Si vous supprimez ce formulaire de votre fichier init et redémarrez Emacs, Projectile ne sera plus chargé (contrairement à package.el). Cela signifie que vous n'avez pas à vous soucier que votre configuration ne fonctionne pas sur une nouvelle machine, car vous dépendiez accidentellement de packages non déclarés.

Vous pouvez installer des packages où et quand vous le souhaitez, tout au long de votre fichier init (pas besoin d'en déclarer la liste en un seul point). Bien sûr, vous pouvez aussi faire

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

si vous préférez la liste. Je vous recommande cependant d'utiliser use-packagepour gérer la configuration de votre package. Vous devez d'abord l'installer:

(straight-use-package 'use-package)

Puis, depuis qu'il straight.ela une intégration intégrée avec use-package, les éléments suivants "fonctionnent":

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

Une fois que vous avez écrit votre fichier init pour installer les packages dont il a besoin, exécutez M-x straight-freeze-versionspour enregistrer un fichier de verrouillage de version dans ~/.emacs.d/straight/versions/default.el. Vous devez garder ce fichier sous contrôle de version, car il permettra straight.elde vérifier les versions correctes de tous vos packages, lorsque vous lancerez Emacs pour la première fois sur une nouvelle machine. (Vous pouvez revenir manuellement aux versions spécifiées dans le fichier de verrouillage à l'aide de M-x straight-thaw-versions.)

Pour soutenir l'idée des fichiers dot-machine locaux que j'ai mentionnés dans mon autre réponse , straight.elpropose un système de profil . Je recommande toujours d'utiliser des liens symboliques pour vos fichiers dot (dans ce cas, init.elvotre fichier init local si applicable et le fichier de verrouillage de version si vous souhaitez en utiliser un).

Si vous vous demandez comment se straight.elcompare aux autres gestionnaires de packages, consultez la section de comparaisons détaillées . Mais il y a aussi beaucoup plus de documentation sur tout le reste .

Radon Rosborough
la source
4

Vous pouvez utiliser cask pour gérer vos packages. Utilisez git / github pour contrôler les sources et synchroniser vos fichiers dot emacs.

goromlagche
la source