¿Cómo automatizar la instalación de paquetes con el archivo .emacs?

9

Mi archivo ~/.emacs(que puede encontrar en GitHub ) carga varios paquetes diferentes de Emacs y me gustaría que se instalen automáticamente tan pronto como se inicie Emacs, si aún no están instalados. De esta manera, si tengo que reinstalar mi sistema operativo Ubuntu 16.04 nuevamente, no tendré que instalar cada paquete yo mismo manualmente M-x package-install. ¿Hay alguna manera de escribir un ~/.emacsarchivo para que instale automáticamente todos los paquetes cargados al inicio? Me gustaría que esto se haga con el mínimo de líneas, ya que tengo más de diez paquetes diferentes cargados, por lo que si tengo que agregar líneas adicionales para cada paquete individual, será ~/.emacsbastante largo.

BH2017
fuente
3
Hay varias formas, pero debe usar github.com/jwiegley/use-package
bertfred el
¿Es posible cargar varios paquetes en una sola línea use-package, como hago en la línea 61 de mi archivo .emacs?
BH2017
Ver package-install-selected-packages(requiere Emacs 25.1).
politza
Por curiosidad, ¿por qué es una propiedad tan deseable tener todos sus paquetes en una sola línea? La única razón que da es para evitar que su ~/.emacsarchivo se "alargue". Pero si solo está cargando una docena de paquetes, ¿está realmente preocupado por las 11 líneas adicionales en su configuración?
nispio
Bueno, esto fue hace unos meses, así que no recuerdo mi pensamiento específico, pero sospecho que fue en la línea de tratar de minimizar la cantidad de trabajo que se requiere cuando agrego o resta un paquete de la lista que se instala automáticamente. No quería que se agregaran varias líneas al archivo para cada paquete separado instalado.
BH2017

Respuestas:

11

La forma más fácil es instalar 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)))

Entonces

 (use-package paredit
   :ensure t)

Esto :ensure tes lo que asegura que el paquete esté instalado.

Para cargar solo, asegúrese de instalar varios paquetes

(dolist (package '(package-a package-b package-c))
 (unless (package-installed-p package)
   (package-install package))
   (require package))))
njdan5691
fuente
¿Puedes especificar varios paquetes para que se cargue en una sola línea?
BH2017
Si te refieres a use-package, entonces no, pero la expresión anterior puede ser
njdan5691
Bueno, mi pregunta es sobre múltiples paquetes, así que edite su respuesta para que haga exactamente eso, carga y, si no está presente, instala automáticamente, múltiples paquetes.
BH2017
el dolist se puede cambiar a '(use-package' some-other-package), pero no se puede hacer ninguna otra configuración. Recomendaría tener una línea para cada paquete con use-package.
njdan5691
Tengo más de diez paquetes diferentes cargados, por lo que sería deseable una solución más compacta.
BH2017
4

package.elrealiza un seguimiento de los paquetes que solicitó instalar (a diferencia de los que se instalan automáticamente como dependencias) en la variable personalizada package-selected-packages.

Entonces, si copia su ~/.emacs(en el que Custom normalmente escribe configuraciones como la de package-selected-packages) a otro sistema, todo lo que debe hacer es M-x package-install-selected-packages.

Por supuesto, esto no instala automáticamente los paquetes si están ausentes, pero lo considero una característica (creo que es un error que un programa como Emacs realice conexiones de red sin una solicitud explícita de hacerlo). Y le ahorra la molestia de instalar cada paquete uno por uno.

Stefan
fuente
Gracias. Solo quiero compartir mi caso de uso, que es diferente al del OP: a menudo transfiero mis archivos de puntos entre máquinas (especialmente en la nube, donde se crean y eliminan todo el tiempo). El directorio del paquete es bastante pesado, con elpy v-env y el fregadero de la cocina, especialmente teniendo en cuenta que las versiones antiguas no se recortan automáticamente, AFAIK. Es mucho más fácil colocar algunos archivos pequeños y reinstalar paquetes que transportarlos.
kkm
Olvidé mencionar una cosa: (package-refresh-contents)debe invocarse una vez antes (package-install-selected-packages)cuando falta por completo el directorio del paquete local, de modo que los directorios del archivo de distribución de paquetes se almacenen primero en los subdirectorios de su archive/directorio.
kkm