Después de conocerlo recientemente use-package
, decidí transferir mi configuración a él, pero me encontré reacio a renunciar a la comodidad de usar package.el
para instalar paquetes y mantenerlos actualizados. Me ha resultado un poco complicado combinar use-package
y package.el
.
En general, estoy interesado en aprender cómo las personas se combinan use-package
con el package.el
sistema, pero para una pregunta más específica, sigue leyendo.
Esto es lo que quiero:
- Tener paquetes instalados por el administrador de paquetes para poder buscarlos fácilmente y mantenerlos actualizados
list-packages
. - Para configurar y cargar paquetes exclusivamente
use-package
, para que pueda ver fácilmente en mi archivo de inicio exactamente lo que estoy cargando y cómo está configurado. - Opcionalmente, también me gustaría poder instalar paquetes a través
use-package
de la:ensure
palabra clave.
Si estoy entendiendo correctamente, quiero muy poco de lo que package-initialize
hace, básicamente solo la forma en que configura el load-path
. Actualmente tengo esto en mi configuración:
;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
(normal-top-level-add-subdirs-to-load-path))
(require 'use-package)
La primera línea comentada es para que Emacs 25 no agregue una (package-initialize)
a mi archivo init. El bit con normal-top-level-add-subdirs-to-load-path
es una aproximación a lo package-initialize
que haría el load-path
, una aproximación que parece lo suficientemente buena.
Esto parece lograr mis deseos 1 y 2, pero no 3. Si trato de usar :ensure
, recibo un mensaje de error que dice que package.el
no está inicializado. Llamar package-initialize
solucionaría eso, pero deseo evitar eso ya que a) no quiero que se carguen todas las innumerables cargas automáticas (prefiero usarlas use-package
para crear con precisión las cargas automáticas que necesito), yb) quiero poder fácilmente evito cargar ciertos paquetes instalados cuando quiera (lo cual es fácil de hacer use-package
).
¿Alguien tiene una recomendación sobre cómo hacer esto?
fuente
package-initialize
que hace que mi pregunta sea discutible.Con su configuración actual, ha deshabilitado efectivamente package.el, ya que no inicializa el administrador de paquetes y evita que Emacs lo inicialice automáticamente. Todo lo que debe hacer a cambio es agregar ELPA al
load-path
, pero eso es solo un pequeño subconjunto de lo que hace package.el. No estoy seguro de por qué haces eso, pero no es una configuración que recomiendo.Específicamente, no obtendrá cargas automáticas de paquetes con su enfoque, lo que significa que inicialmente no habrá comandos de ningún paquete disponibles.
En otras palabras,
M-x
solo le ofrecerá comandos integrados. Para agregar comandos desde sus paquetes, tendría que agregar:commands
definiciones explícitas a todas sususe-package
declaraciones, lo que equivale a un gran esfuerzo de mantenimiento, particularmente para paquetes grandes como Magit, para obtener esencialmente cero ganancias. Package.el le proporciona cargas automáticas gratis .La combinación
use-package
con package.el es realmente muy simple: toda la configuración se basa en esta combinación, pero es mucho mejor dejar que package.el realmente haga su trabajo. Simplemente inicialice package.el al comienzo de su archivo init:Para mayor comodidad, es posible que posteriormente desee iniciar
use-package
, si aún no está instalado:Esto le permite iniciar una sesión de Emacs en un sistema nuevo, y su init.el se instalará automáticamente
use-package
.Finalmente necesitas cargar
use-package
:Ahora puede usar
use-package
para instalar y configurar paquetes:Cuando Emacs ahora evalúa este formulario durante el inicio,
use-package
verificará si Magit ya está instalado y lo instalará automáticamente si es necesario.fuente
package-initialize
toma un tiempo completar la ruta, definir las cargas automáticas y hacer el resto de sus cosas. Creo que leí en alguna parte que el propio Jon Wiegley (el autor deuse-package
) prefiere declarar todos los comandos cargados automáticamente enuse-package
estrofas en lugar de confiar en ellospackage.el
.load-path
y añadir autoloads en cualquiera de los casos, ya sea a travésuse-package
o por mediopackage.el
. Dudo que haya una diferencia medible, particularmente si tienes un sistema moderno con un disco rápido.package-initialize
una lista personalizadaload-path
. Atribuyo esto a la "exploración" del sistema de archivos que lopackage.el
hace. Sin embargo, nunca medí ninguna diferencia significativa en el rendimiento entre cargarautoload
definiciones de archivos y tenerlas enuse-package
estrofas.package.el
sistema, ¡diría que solo lo he desactivadopackage-initialize
! La razón es que, si bien me gustalist-packages
buscar nuevos paquetes y, especialmente, actualizar todos mis paquetes instalados actualmente, creo que prefiero la carga específica deuse-package
. ¡Para mí, tener cargas automáticas solo para comandos que uso suena como algo bueno!