Utilizzo di package.el per installare e aggiornare ma use-package per il caricamento e la configurazione


15

Dopo aver appreso di recente use-packageho deciso di eseguire il porting della mia configurazione, ma mi sono trovato riluttante a rinunciare alla comodità di utilizzare package.elper installare i pacchetti e mantenerli aggiornati. Ho trovato un po 'complicato combinare use-packagee package.el.

Sono generalmente interessato a imparare come le persone si combinano use-packagecon il package.elsistema, ma per una domanda più specifica, continua a leggere.

Ecco cosa voglio:

  1. Avere i pacchetti installati dal gestore dei pacchetti in modo da poter facilmente cercare i pacchetti e mantenerli aggiornati list-packages.
  2. Per configurare e caricare i pacchetti esclusivamente tramite use-package, così posso facilmente vedere nel mio file init esattamente cosa sto caricando e come è configurato.
  3. Opzionalmente, vorrei anche essere in grado di installare i pacchetti tramite use-packagela :ensureparola chiave.

Se sto capendo correttamente, voglio ben poco di ciò che package-initializefa, fondamentalmente solo il modo in cui imposta load-path. Attualmente ho questo nella mia configurazione:

;(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 prima riga, commentata, è che Emacs 25 non aggiunge utilmente una (package-initialize)al mio file init. Il bit with normal-top-level-add-subdirs-to-load-pathè un'approssimazione di ciò package-initializeche renderebbe il load-path, un'approssimazione che sembra abbastanza buona.

Questo sembra raggiungere i miei desideri 1 e 2, ma non 3. Se provo ad usare :ensure, ricevo un messaggio di errore che dice che package.elnon è inizializzato. La chiamata package-initializerisolverebbe questo problema, ma desidero evitare che poiché a) non voglio caricare tutte le miriadi di caricamenti automatici (preferisco utilizzare use-packageper creare esattamente i caricamenti automatici di cui ho bisogno) eb), voglio essere in grado di farlo facilmente evitare di caricare determinati pacchetti installati ogni volta che voglio (il che è facile da fare con use-package).

Qualcuno ha una raccomandazione su come farlo?

Risposte:


11

IIUC quello che vuoi fare è:

(package-initialize t)

Nota l' targomento, che è la chiave della tua felicità qui poiché (o dovrebbe almeno) inizializzare package.el senza attivare tutti i pacchetti installati.


1
Questo risponde alla mia domanda, anche se ora mi sto orientando verso l'uso package-initializeche rende discutibile la mia domanda.
Omar,

15

Con la tua configurazione attuale, hai effettivamente disabilitato package.el, poiché non inizializzi il gestore pacchetti e impedisci a Emacs di inizializzarlo automaticamente. Tutto ciò che fai in cambio è aggiungere ELPA a load-path, ma questo è solo un piccolo sottoinsieme di ciò che fa package.el. Non sono sicuro del motivo per cui lo fai, ma non è una configurazione che consiglierei.

In particolare, non otterrai i caricamenti automatici dei pacchetti con il tuo approccio, il che significa che inizialmente non saranno disponibili comandi da nessun pacchetto.

In altre parole, M-xti offrirà solo comandi integrati. Per aggiungere comandi dai tuoi pacchetti dovresti aggiungere :commandsdefinizioni esplicite a tutte le tue use-packagedichiarazioni, il che equivale a un grande sforzo di manutenzione, in particolare per i pacchetti di grandi dimensioni come Magit, per un guadagno sostanzialmente nullo: package.el ti dà i caricamenti automatici gratuitamente .


La combinazione use-packagecon package.el è in realtà molto semplice — l'intera configurazione si basa su questa combinazione — ma è molto meglio lasciare che package.el funzioni effettivamente. Basta inizializzare package.el all'inizio del file init:

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

Per comodità, potresti successivamente voler avviare bootstrap use-package, se non è già installato:

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

Questo ti consente di avviare una sessione Emacs su un nuovo sistema e init.el verrà installato automaticamente use-package.

Alla fine devi caricare use-package:

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

Ora puoi usare use-packageper installare e configurare i pacchetti:

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

Quando Emacs ora valuta questo modulo durante l'avvio, use-packageverificherà se Magit è già installato e, se necessario, lo installerà automaticamente.


3
"Non sono sicuro del motivo per cui lo fai": l'unica ragione che posso vedere riguarda i tempi di avvio: package-initializerichiede del tempo per popolare il percorso, definire i caricamenti automatici e fare il resto. Penso di aver letto da qualche parte che lo stesso Jon Wiegley (l'autore di use-package) preferisce dichiarare tutti i comandi caricati automaticamente nelle use-packagestanze piuttosto che fare affidamento package.el.
François Févotte,

L'ultima volta che ho visto non ha usato affatto package.el, e in ogni caso, non credo che guadagnerai molto. È necessario popolare load-pathe aggiungere i caricamenti automatici in entrambi i casi, tramite use-packageo via package.el. Dubito che ci sia una differenza misurabile, in particolare se hai un sistema moderno con un disco veloce.
lunaryorn,

3
Concordato. Ho fatto i tempi da solo. Con un disco veloce, effettivamente non si vede molta differenza. Con un disco lento, l'avvio può essere notevolmente più lento (qualcosa come 0,2 secondi) con package-initializeun elenco personalizzato in load-path. Attribuisco questo alla "esplorazione" del filesystem che lo package.elfa. Tuttavia, non ho mai misurato alcuna differenza significativa nelle prestazioni tra il caricamento delle autoloaddefinizioni dai file e la loro presenza nelle use-packagestanze.
François Févotte,

Beh, non direi che ho disabilitato il package.elsistema, direi che ho disabilitato solo package-initialize! Il motivo è che mentre mi piace list-packagescercare nuovi pacchetti e specialmente aggiornare tutti i miei pacchetti attualmente installati, penso di preferire il caricamento mirato di use-package. Per me avere i caricamenti automatici solo per i comandi che uso suona come una cosa buona!
Omar,

1
@ OmarAntolín-Camarena Perché no? I caricamenti automatici sono essenzialmente l'interfaccia pubblica di un pacchetto rivolto all'utente, e poiché package.el è diventato il modo standard di distribuire i pacchetti, possiamo contare sulla loro presenza.
lunaryorn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.