Risposte:
Esiste una regola in base alla quale l'utente può determinare se la configurazione del pacchetto richiede
:init
o:config
?
Non esiste una regola generale che si applica a tutte le impostazioni e pacchetti; devi solo familiarizzare con il significato di queste parole chiave leggendo il file README di use-package
.
In sintesi, il :init
blocco viene eseguito all'avvio, come se avessi collocato le sue forme costitutive al livello più alto (cioè al di fuori di una tipica chiamata a use-package
) del tuo user-init-file
. Ciò significa che vengono sempre eseguiti, indipendentemente dal fatto che il pacchetto corrispondente sia stato caricato o meno.
Il :config
blocco, invece, viene eseguito dopo che il pacchetto corrispondente è stato caricato, tramite il eval-after-load
meccanismo.
Pertanto, è possibile migliorare i tempi di avvio spostando le impostazioni di lunga durata applicabili da :init
a :config
. Se è necessario modificare una variabile definita solo dopo aver caricato un determinato pacchetto, è necessario allo stesso modo inserirla nel :config
blocco. Alcune variabili, come ad esempio gnus-home-directory
, devono essere impostate prima di caricare il pacchetto corrispondente, quindi devono essere inserite :init
. Consiglio vivamente di inserire tutte le chiamate add-hook
/ applicabili remove-hook
nel :init
blocco, poiché gli hook possono essere modificati anche quando non sono associati e ciò offre una maggiore modularità alla configurazione.
Spesso puoi evitare di dover capire dove posizionare una determinata impostazione utilizzando la nuova :custom
parola chiave o utilizzando direttamente l'interfaccia di personalizzazione semplice.
Non sono sicuro che esista una regola generale (a parte "usare :init
per la preconfigurazione prima dell'effettivo caricamento del pacchetto e usare :config
per un'altra, beh, configurazione").
Ma io stesso uso :init
quando, ad esempio, voglio aggiungere altri collegamenti di tasti di modalità mappa per usare le funzioni di questo "pacchetto". E voglio ancora che questo pacchetto sia caricato in modo pigro.
Ecco l'esempio del caricamento lento di dired-ranger
:
(use-package dired-ranger
:commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
:init
(add-hook 'dired-mode-hook
(lambda ()
(define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
(define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
(define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))
PS: Se non c'è :defer
, :commands
, :mode
e altri che rende pacchetto caricamento lazy, quindi :init
e :config
dovrebbe essere più o meno lo stesso (ma :init
saranno valutati prima :))
:config
è troppo tardi - il caricamento lento non applicherà i miei binding. E :bind
con :map
non lo lega davvero.
:config
non è troppo tardi - è esattamente quando dired-mode-map
viene definito per la prima volta. Probabilmente lo stai semplicemente mettendo nella use-package
forma sbagliata di dired-ranger
invece di dired
, dove dired-mode-map
è definito. Questo potrebbe anche spiegare perché il tuo :bind
non funziona. Fondamentalmente, o stai facendo qualcosa di sbagliato o hai use-package
un bug. Non confondere le combinazioni di tasti locali e eval-after-load
con le combinazioni di tasti globali di comandi / mappe di tasti caricati automaticamente.
use-package-always-ensure
e quando provo a usare il pacchetto diretto non riesce a recuperarlo da elpa. Ma avere :ensure nil
lì risolve il problema e posso impostare il caricamento del pacchetto incatenato dired
-> dired-ranger
usando :after
.
:bind
parola chiave per questo, o modificare i collegamenti chiave nel:config
blocco.