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.elpara instalar paquetes y mantenerlos actualizados. Me ha resultado un poco complicado combinar use-packagey package.el.
En general, estoy interesado en aprender cómo las personas se combinan use-packagecon el package.elsistema, 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-packagede la:ensurepalabra clave.
Si estoy entendiendo correctamente, quiero muy poco de lo que package-initializehace, 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-pathes una aproximación a lo package-initializeque 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.elno está inicializado. Llamar package-initializesolucionaría eso, pero deseo evitar eso ya que a) no quiero que se carguen todas las innumerables cargas automáticas (prefiero usarlas use-packagepara 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-initializeque 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-xsolo le ofrecerá comandos integrados. Para agregar comandos desde sus paquetes, tendría que agregar:commandsdefiniciones explícitas a todas sususe-packagedeclaraciones, 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-packagecon 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-packagepara instalar y configurar paquetes:Cuando Emacs ahora evalúa este formulario durante el inicio,
use-packageverificará si Magit ya está instalado y lo instalará automáticamente si es necesario.fuente
package-initializetoma 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-packageestrofas en lugar de confiar en ellospackage.el.load-pathy añadir autoloads en cualquiera de los casos, ya sea a travésuse-packageo por mediopackage.el. Dudo que haya una diferencia medible, particularmente si tienes un sistema moderno con un disco rápido.package-initializeuna lista personalizadaload-path. Atribuyo esto a la "exploración" del sistema de archivos que lopackage.elhace. Sin embargo, nunca medí ninguna diferencia significativa en el rendimiento entre cargarautoloaddefiniciones de archivos y tenerlas enuse-packageestrofas.package.elsistema, ¡diría que solo lo he desactivadopackage-initialize! La razón es que, si bien me gustalist-packagesbuscar 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!