use-package -: init ou: config

13

Existe alguma regra pela qual o usuário possa determinar se a configuração do pacote exige :initou :config?

rchar01
fonte

Respostas:

13

Existe alguma regra pela qual o usuário possa determinar se a configuração do pacote exige :initou :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 :initbloco é 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 :configbloco, por outro lado, é executado após o carregamento do pacote correspondente, por meio do eval-after-loadmecanismo.

Dessa forma, você pode melhorar o tempo de inicialização movendo as configurações de execução longa aplicáveis ​​de :initpara :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 :configbloco. 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-hookno :initbloco, 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 :custompalavra-chave ou a interface de Personalização Fácil diretamente.

Manjericão
fonte
2

Não tenho certeza se existe uma regra geral (além de "usar :initpara pré-configuração antes do carregamento real do pacote e usar :configpara outras configurações bem").

Mas eu mesmo uso :initquando, 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, :modee outros que faz pacote de carregamento lento, em seguida, :inite :configdeve ser mais ou menos o mesmo (mas :initserá avaliado antes :))

Maxim Kim
fonte
4
Modificar ligações de teclas em um gancho de modo significa que elas são executadas toda vez que você abre um buffer nesse modo. Você só precisa modificar as ligações de teclas uma vez, após o carregamento do pacote. Você pode usar a :bindpalavra - chave para isso ou modificar as combinações de teclas no :configbloco.
Basil
Na verdade, nunca pensei nisso. Mas :configé tarde demais - o carregamento lento não aplicará minhas ligações. E :bindcom :mapnão liga realmente.
Maxim Kim
3
:confignão é tarde demais - é exatamente quando dired-mode-mapé definido pela primeira vez. Você provavelmente está apenas colocando-o na use-packageforma errada de em dired-rangervez de dired, onde dired-mode-mapé definido. Isso também pode explicar por que o seu :bindnão funciona. Basicamente, você está fazendo algo errado ou use-packagetem um bug. Não confunda as combinações de teclas locais e eval-after-loadas combinações globais de comandos / mapas de teclas carregados automaticamente.
Basil
@ Basil, thx, você está certo. Meu problema foi que eu configurei use-package-always-ensuree quando tento usar o pacote dired ele falha ao buscá-lo no elpa. Mas ter :ensure nillá resolve o problema e posso configurar o carregamento de pacotes encadeados dired-> dired-rangerusando :after.
Maxim Kim