Respuestas:
¿Existe alguna regla por la cual el usuario pueda determinar si la configuración del paquete requiere
:init
o no:config
?
No existe una regla general que se aplique a todas las configuraciones y paquetes; solo necesita familiarizarse con el significado de estas palabras clave leyendo el archivo README de use-package
.
En resumen, el :init
bloque se ejecuta al inicio, como si hubiera colocado sus formas constituyentes en el nivel superior (es decir, fuera de una llamada típica a use-package
) de su user-init-file
. Esto significa que siempre se ejecutan, independientemente de si el paquete correspondiente se ha cargado o no.
El :config
bloque, por otro lado, se ejecuta después de que se haya cargado el paquete correspondiente, por medio del eval-after-load
mecanismo.
Como tal, puede mejorar su tiempo de inicio moviendo la configuración aplicable de larga duración de :init
a :config
. Si necesita modificar una variable que solo se define después de cargar un paquete en particular, también debe colocar esto en el :config
bloque. Algunas variables, como gnus-home-directory
, deben establecerse antes de cargar su paquete correspondiente, por lo que deben colocarse en :init
. Recomiendo encarecidamente que coloque todas las llamadas add-hook
/ aplicables remove-hook
en el :init
bloque, ya que los ganchos se pueden modificar incluso cuando no están vinculados, y esto brinda más modularidad a su configuración.
A menudo, puede evitar tener que averiguar dónde colocar una configuración particular mediante el uso de la nueva :custom
palabra clave o directamente mediante la interfaz de Personalización fácil .
No estoy seguro de si existe una regla general (aparte de "usar :init
para la preconfiguración antes de cargar el paquete real y usar :config
para otra, bueno, configuración").
Pero yo mismo lo uso :init
cuando, por ejemplo, quiero agregar algunas otras combinaciones de teclas del mapa de modo para usar funciones de "este" paquete. Y todavía quiere que "este" paquete tenga una carga diferida.
Aquí está el ejemplo de carga diferida de 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))))
PD: Si no hay :defer
, :commands
, :mode
y otros que hace que la carga del paquete perezoso, a continuación, :init
y :config
debe ser más o menos lo mismo (pero :init
serán evaluados antes :))
:config
es demasiado tarde: la carga diferida no aplicará mis enlaces. Y :bind
con en :map
realidad no lo une.
:config
no es demasiado tarde, eso es exactamente cuando dired-mode-map
se define por primera vez. Probablemente solo lo esté poniendo en la use-package
forma incorrecta en dired-ranger
lugar de dired
, donde dired-mode-map
está definido. Esto también podría explicar por qué su :bind
no funciona. Básicamente, o estás haciendo algo mal o tienes use-package
un error. No confunda las combinaciones de teclas locales y eval-after-load
las combinaciones de teclas globales de comandos / mapas de teclas con carga automática.
use-package-always-ensure
y cuando trato de usar package-dird, falla al recuperarlo de elpa. Pero tener :ensure nil
allí resuelve el problema y puedo configurar la carga de paquetes encadenados dired
-> dired-ranger
usando :after
.
:bind
palabra clave para esto, o modificar las asociaciones de teclas en el:config
bloque.