Estoy usando packagepara administrar mis extensiones de Emacs. Para sincronizar mi configuración de Emacs en diferentes computadoras, me gustaría una forma de especificar una lista de nombres de paquetes en el .emacsarchivo y luego packagepodría buscar e instalar automáticamente los paquetes, de modo que no necesite instalarlos manualmente llamando M-x package-list-packages. ¿Como hacer eso?
123

Respuestas:
fuente
package.package-refresh-contentsque solo se ejecutará si el paquete no está instalado? ¿Cómo es(or (file-exists-p package-user-dir))mejor / cómo incluso verifica si los paquetes están instalados?package-refresh-contents. Esto probablemente solo se ejecutará la primera vez que abra emacs en una computadora nueva, y estoy de acuerdo con eso. Si un paquete necesita una actualización, puede hacerlo manualmente.use-package, puede usar la:ensurepalabra clave para instalar paquetes automáticamente. Esto también se configurapackage-selected-packagessi necesita acceder a la lista de paquetes a través de personalizar o mediante programación.Basado en los comentarios de Profpatsch y las respuestas a continuación:
fuente
or? Oh wow.mapces por efectos secundarios. ¿Pero por qué no usarunless?(package-initialize)antes de la referencia apackage-user-dirEmacs 25.1+ realizará un seguimiento automático de los paquetes instalados por el usuario en la
package-selected-packagesvariable personalizable .package-installactualizará la variable de personalización, y puede instalar todos los paquetes seleccionados con lapackage-install-selected-packagesfunción.Otra ventaja conveniente de este enfoque es que puede usar
package-autoremovepara eliminar automáticamente los paquetes que no están incluidospackage-selected-packages(aunque preservará las dependencias).Fuente: http://endlessparentheses.com/new-in-package-el-in-emacs-25-1-user-selected-packages.html
fuente
Aquí está el código que uso para Emacs Prelude :
Si no está utilizando MELPA, no es necesario que lo requiera (y si
melpa.eltiene que estar en suload-path(o instalado a través de MELPA). El paquete db no se actualiza cada vez (ya que esto retrasaría significativamente el inicio) ) - solo donde hay paquetes desinstalados presentes.fuente
Nadie ha mencionado Cask todavía, pero es bastante adecuado para esta tarea.
Básicamente, crea una
~/.emacs.d/Casklista de los paquetes que desea instalar. Por ejemplo:Ejecutar
caskdesde la línea de comandos instalará estos paquetes por usted y cualquier dependencia que necesiten.Además, puede actualizar automáticamente los paquetes instalados usando
cask update.fuente
/path/to/emacs -Q --script /path/to/cask/cask-cli.el -- [args]Llame
package-installcon el nombre del paquete como símbolo. Puede encontrar los nombres de paquete para sus paquetes llamando de formapackage-installinteractiva y completando el nombre. La funciónpackage-installed-ple informará si ya está instalada.Por ejemplo:
fuente
error: Packagedired + 'no está disponible para la instalación'. dired + es un paquete que probé con su código.dired+Aparece cuando correspackage-list-packages? Creo que necesitarás agregar mermelada o melpa a tupackage-archives. Si es así, ¿puedes correr(package-install 'dired+)?(package-installed-p 'dired+)debería regresarty se omitirá en el código anterior.package-installed-psolo funciona bien, pero todo el bloque de código no. He probado varios paquetes.fuente
Me gusta comprobar si el usuario quiere instalar los paquetes primero como se hace en esta respuesta . También estoy actualizando el contenido de mi paquete una vez antes de instalar cualquier cosa. No estoy seguro de si esta es la mejor manera, pero no creo que las mejores respuestas lo estuvieran haciendo por mí.
fuente
Me encontré con un problema que no pasó nada después de añadir
(package-install 'org)en.emacs. Quería instalar la versión actualizada deorg-modey el incorporadoorg-modees bastante antiguo.package-installExtraje el código fuente de Emacs 25.3.1. La función self ya comprueba si un paquete está instalado o no y se niega a instalarlo si el paquete ya está instalado. Por lo tanto, la comprobación(unless (package-installed-p package) ...)de la respuesta 10093312 de hecho no es necesaria.El incorporado
org-modetambién cuenta como instalado y sepackage-installniega a instalar la versión más nueva de ELPA. Después de pasar algún tiempo leyendo package.el, se me ocurrió la siguiente solución.La razón por la que funciona es que las
package-*funciones familiares manejan los argumentos de manera diferente en función de si es un símbolo o unpackage-descobjeto. Solo puede especificar información de versión apackage-installtravés de unpackage-descobjeto.fuente
Aquí está el mío, es más corto :)
fuente
Aquí hay otra forma.
fuente