Respostas:
Existe alguma regra pela qual o usuário possa determinar se a configuração do pacote exige
:init
ou:config
?
Não há regra geral que se aplique a todas as configurações e pacotes; você só precisa se familiarizar com o significado dessas palavras-chave lendo o arquivo README de use-package
.
Em resumo, o :init
bloco é executado na inicialização, como se você tivesse colocado seus formulários constituintes no nível superior (isto é, fora de uma chamada típica para use-package
) do seu user-init-file
. Isso significa que eles sempre são executados, independentemente de o pacote correspondente ter sido carregado ou não.
O :config
bloco, por outro lado, é executado após o carregamento do pacote correspondente, por meio do eval-after-load
mecanismo.
Dessa forma, você pode melhorar o tempo de inicialização movendo as configurações de execução longa aplicáveis de :init
para :config
. Se você precisar modificar uma variável que é definida apenas após o carregamento de um pacote específico, da mesma forma, será necessário colocá-la no :config
bloco. Algumas variáveis, como gnus-home-directory
, precisam ser definidas antes do carregamento do pacote correspondente, para que sejam colocadas :init
. Eu recomendo fortemente colocar todas as chamadas add-hook
/ aplicáveis remove-hook
no :init
bloco, pois os ganchos podem ser modificados mesmo quando desconectados, e isso oferece mais modularidade à sua configuração.
Muitas vezes, você pode evitar ter que descobrir onde colocar uma configuração específica usando a nova :custom
palavra-chave ou a interface de Personalização Fácil diretamente.
Não tenho certeza se existe uma regra geral (além de "usar :init
para pré-configuração antes do carregamento real do pacote e usar :config
para outras configurações bem").
Mas eu mesmo uso :init
quando, por exemplo, quero adicionar outras combinações de teclas de mapa de modo para usar funções do pacote "this". E ainda deseja que "este" pacote seja carregado preguiçosamente.
Aqui está o exemplo do carregamento lento 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))))
PS: Se não houver :defer
, :commands
, :mode
e outros que faz pacote de carregamento lento, em seguida, :init
e :config
deve ser mais ou menos o mesmo (mas :init
será avaliado antes :))
:config
é tarde demais - o carregamento lento não aplicará minhas ligações. E :bind
com :map
não liga realmente.
:config
não é tarde demais - é exatamente quando dired-mode-map
é definido pela primeira vez. Você provavelmente está apenas colocando-o na use-package
forma errada de em dired-ranger
vez de dired
, onde dired-mode-map
é definido. Isso também pode explicar por que o seu :bind
não funciona. Basicamente, você está fazendo algo errado ou use-package
tem um bug. Não confunda as combinações de teclas locais e eval-after-load
as combinações globais de comandos / mapas de teclas carregados automaticamente.
use-package-always-ensure
e quando tento usar o pacote dired ele falha ao buscá-lo no elpa. Mas ter :ensure nil
lá resolve o problema e posso configurar o carregamento de pacotes encadeados dired
-> dired-ranger
usando :after
.
:bind
palavra - chave para isso ou modificar as combinações de teclas no:config
bloco.