¿Cómo obtener el mismo entorno Emacs en una computadora diferente?

16

Soy un principiante en Emacs (lo uso desde hace aproximadamente 2 semanas y me encanta). A medida que actualizo y expando mi ~/.emacs.d/init.elarchivo, las cosas que escribo allí dependen de ciertos paquetes que instalé desde MELPA M-x package-install, en .elarchivos que yo mismo he escrito, etc.

Mi pregunta es, ¿debería en el futuro cambiar de computadora, por ejemplo, cuál es la mejor manera de obtener sin problemas el mismo entorno exacto de Emacs en la nueva computadora que tengo ahora?

space_voyager
fuente
3
Siempre que pueda moverse init.el(usando git por ejemplo), este enfoque también funciona (basado en use-package): lunaryorn.com/posts/…
VanLaser
Un enfoque es poner su directorio .emacs.d en Dropbox. Solo lo he usado en computadoras con el mismo sistema operativo. Los diferentes tipos de * nix deberían estar bien, pero podría tener problemas si intenta compartir entre máquinas que ejecutan sistemas operativos que son muy diferentes.
Qudit
Esta pregunta está muy cerca de emacs.stackexchange.com/q/408/2710 . ¿Puedes resaltar las diferencias?
Andrew Swann
Para el no programador como yo, sincronizar la configuración y los paquetes de emacs en tres máquinas (dos ventanas, una OSX) usando Google Drive ha sido efectivo y confiable. Esto funciona porque emacs y la mayoría de sus paquetes son en gran medida independientes de la plataforma. La reproducción multiplataforma de una experiencia emacs idéntica requiere solo unas pocas líneas en el archivo init.el para resolver las rutas específicas del sistema operativo al directorio del paquete sincronizado de emacs.
Snelephant
Su configuración es todo su ~/.emacs.ddirectorio, así que use el método que prefiera para sincronizarlo entre las máquinas. (por ejemplo, un repositorio de Github, o una carpeta de Dropbox, o lo que sea mejor para usted).
phils

Respuestas:

9

La solución correcta es usar straight.elun administrador de paquetes que escribí para resolver este problema. Puede encontrar más detalles sobre esto en otra respuesta a esta pregunta .

Esta respuesta, que fue escrita meses antes de comenzar a trabajar straight.el, describió previamente una forma estrictamente inferior de lograr una solución parcial. Este enfoque se describe brevemente a continuación; Ya no lo recomiendo.

Incluso si no quieres usar straight.el, al menos debes adoptar use-package. (No es que los dos sean mutuamente excluyentes; creo que la configuración más limpia proviene del uso de ambos).


Comience definiendo una lista de paquetes en su archivo init:

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

Luego instálelos automáticamente:

(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 mantiene su init.elarchivo bajo control de versión, sincronizarlo con otra máquina hará que sus paquetes se instalen automáticamente. Por supuesto, las versiones que se instalen serán completamente diferentes y, como resultado, no se puede esperar que su configuración funcione de inmediato. Este es un defecto fundamental package.ely es una de las razones por las que este enfoque es malo. Ver de nuevo straight.el. Tenga en cuenta también que el código descrito anteriormente separa su lista de paquetes de su configuración para esos paquetes, lo que dificulta el seguimiento de las cosas en su archivo init. Esta es otra gran desventaja. Ver de nuevo use-package.

Radon Rosborough
fuente
Gracias por el reportaje! Si elijo alojar todo en Github, incluidos los paquetes que descargué de MELPA, ¿retendrá esto la capacidad de MELPA de actualizar automáticamente los paquetes en la nueva computadora?
space_voyager
1
@space_voyager Sí, todo seguirá sucediendo de la misma manera. Sin embargo: (1) cuando clona en una computadora nueva, Emacs no necesitará descargar paquetes de MELPA, porque ya están en el repositorio que acaba de clonar; y (2) cada vez que use package.elpara actualizar paquetes, tendrá cambios no escalonados en su repositorio, y tendrá que hacer un compromiso para incluir las actualizaciones de paquetes.
Radon Rosborough
Muchas gracias. Una cosa más: pensé que MELPA realiza actualizaciones de paquetes automáticamente. ¿No es este el caso?
space_voyager
1
@space_voyager: Bueno, por supuesto, el repositorio de paquetes remotos se actualizará, pero las versiones actualizadas de los paquetes no se descargan e instalan en su máquina local automáticamente. Para eso necesitas hacerlo M-x list-packages RET U.
Radon Rosborough
1
@Lassi Respuesta corta: usa lo que quieras para instalar Emacs; use straight.elsolo para instalar paquetes de Emacs. Nix es una gran idea, pero no está bien optimizado para el desarrollo de paquetes de Emacs, que yo sepa (corríjame si me equivoco) . Si usa un administrador de paquetes del sistema para instalar los paquetes de Emacs, no podrá editar su código fuente y luego confirmar e impulsar sus cambios en sentido ascendente. La última vez que miré una configuración de Nix para los paquetes de Emacs, parecía demasiado compleja y generalmente inferior a la straight.elexperiencia de desarrollo. Pero, lo que sea que haga flotar tu bote.
Radon Rosborough
11

Si usa use-package , puede mover ese archivo de una computadora a otra, y cuando Emacs se inicie, siempre que tenga acceso a Internet, extraerá los paquetes y los configurará.

Primero, configure la biblioteca de paquetes:

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

Y luego bootstrap use-package:

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

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

Ahora, en lugar de configurar Emacs y asumir que los paquetes están instalados, úselos use-packagepara instalarlos y configurarlos. Por ejemplo, para algunas de mis configuraciones de timón:

(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
fuente
Eso sí, eso hace que la configuración (in init.el) se transmita, pero hay mucho más. Por ejemplo, esto no portará los archivos dabbrev, ni sus fragmentos personalizados ni ninguna otra cosa.
Omair Majid
Si. Si tiene otros archivos que forman parte de su configuración, también deberá moverlos junto con su archivo de inicio.
zck
en ese punto, nuevamente se convierte en un juego de "qué archivo es realmente parte de mi configuración y cómo lo mantengo sincronizado en mis máquinas" :(
Omair Majid
debe agregar :ensure ta la use-packagedeclaración o establecer use-package-always-ensureen t. De lo contrario, no se instalaría automáticamente en otro sistema cuando se copiara la configuración.
Chakravarthy Raghunandan
6

Gestión de paquetes de próxima generación con straight.el

Después de una larga y frustrante lucha por usar package.el+ Quelpa para administrar mis paquetes, mordí la bala y escribí mi propio administrador de paquetes . Se pretende reemplazar package.elpor completo al proporcionar una experiencia de gestión de paquetes que es superior en casi todos los sentidos.

Puede leer la extensa documentación para conocer todas sus características, pero la más relevante para esta pregunta es que se straight.elcentra en la reproducibilidad perfecta . Esto significa que no debería importar si está iniciando Emacs normalmente, o si lo está iniciando en una nueva máquina, y que cualquier cambio local está controlado por la versión y puede revertirse a un estado canónico. En términos prácticos, esto se logra mediante (1) paquetes de clonación como repositorios de Git, y al proporcionar herramientas automatizadas para administrar su estado; (2) usar el archivo init como la única fuente de verdad para el estado de administración de paquetes, sin datos mutables almacenados en otro lugar; y (3) usar archivos de bloqueo de la versión opcional para especificar revisiones exactas de Git de cada paquete, más cualquier repositorio de recetas ystraight.el sí mismo.

Para comenzar, inserte el fragmento de arranque , que se instalará y activará straight.el. Luego, para asegurarse de que esté instalado un paquete, simplemente realice una llamada a straight-use-packagesu archivo init:

(straight-use-package 'projectile)

Sí, es así de simple. No tratar con package-refresh-contentsnada de esa basura. Si elimina este formulario de su archivo init y reinicia Emacs, Projectile ya no se cargará (a diferencia de package.el). Esto significa que no tiene que preocuparse de que su configuración de alguna manera no funcione en una nueva máquina porque dependía accidentalmente de paquetes no declarados.

Puede instalar paquetes donde quiera y cuando lo desee, a lo largo de su archivo de inicio (no es necesario declarar una lista de ellos en un solo punto). Por supuesto, también puedes hacer

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

si prefieres la lista Sin embargo, le recomiendo que utilice use-packagepara administrar la configuración de su paquete. Primero tienes que instalarlo:

(straight-use-package 'use-package)

Luego, como straight.eltiene una integración incorporada use-package, lo siguiente "simplemente funciona":

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

Una vez que haya escrito su archivo init para instalar los paquetes que necesita, ejecute M-x straight-freeze-versionspara guardar un archivo de bloqueo de versión ~/.emacs.d/straight/versions/default.el. Debe mantener este archivo bajo control de versión, ya que le permitirá straight.elverificar las versiones correctas de todos sus paquetes, cuando inicie Emacs por primera vez en una nueva máquina. (Puede volver manualmente a las versiones especificadas en el archivo de bloqueo usando M-x straight-thaw-versions).

Para apoyar la idea de archivos de puntos locales de máquina que mencioné en mi otra respuesta , straight.elofrece un sistema de perfil . Todavía recomiendo usar enlaces simbólicos para sus archivos de puntos (en este caso, init.elsu archivo de inicio local si corresponde, y el archivo de bloqueo de versión si desea usar uno).

Si se pregunta cómo se straight.elcompara con otros gestores de paquetes, consulte la extensa sección de comparaciones . Pero también hay mucha más documentación sobre todo lo demás .

Radon Rosborough
fuente
4

Puede usar barril para administrar sus paquetes. Use git / github para controlar la fuente y sincronizar sus archivos de puntos emacs.

goromlagche
fuente