Depois de aprender recentemente, use-package
decidi portar minha configuração, mas me senti relutante em desistir da conveniência de usar package.el
para instalar pacotes e mantê-los atualizados. Eu achei um pouco complicado de combinar use-package
e package.el
.
Geralmente, estou interessado em aprender como as pessoas se combinam use-package
com o package.el
sistema, mas para uma pergunta mais específica, continue lendo.
Aqui está o que eu quero:
- Ter pacotes instalados pelo gerenciador de pacotes para que eu possa navegar facilmente por pacotes e mantê-los atualizados
list-packages
. - Para configurar e carregar pacotes exclusivamente
use-package
, para que eu possa ver facilmente no meu arquivo init exatamente o que estou carregando e como está configurado. - Opcionalmente, eu também gostaria de poder instalar pacotes através
use-package
da:ensure
palavra-chave.
Se estou entendendo corretamente, quero muito pouco do que package-initialize
faz, basicamente apenas da maneira como configura o load-path
. Atualmente eu tenho isso na minha configuração:
;(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)
A primeira linha comentada é para que o Emacs 25 não adicione uma útil (package-initialize)
ao meu arquivo de inicialização. A parte com normal-top-level-add-subdirs-to-load-path
é uma aproximação do que package-initialize
faria a load-path
, uma aproximação que parece boa o suficiente.
Isso parece alcançar meus desejos 1 e 2, mas não 3. Se eu tentar usar :ensure
, recebo uma mensagem de erro dizendo que package.el
não foi inicializado. A chamada package-initialize
resolveria isso, mas desejo evitar isso, já que a) não quero que todas as inúmeras cargas automáticas sejam carregadas (prefiro usar use-package
para criar com precisão as cargas automáticas necessárias) eb) desejo poder facilmente evite carregar certos pacotes instalados sempre que eu quiser (o que é fácil de fazer use-package
).
Alguém tem uma recomendação de como fazer isso?
fonte
package-initialize
que torna minha pergunta discutível.Com sua configuração atual, você desabilitou efetivamente o package.el, pois não inicializa o gerenciador de pacotes e impede que o Emacs o inicialize automaticamente. Tudo o que você faz em troca é adicionar o ELPA ao
load-path
, mas isso é apenas um pequeno subconjunto do que o package.el faz. Não sei por que você faz isso, mas não é uma configuração que eu recomendo.Especificamente, você não receberá carregamentos automáticos de pacotes com sua abordagem, o que significa que, inicialmente, nenhum comando de nenhum pacote estará disponível.
Em outras palavras,
M-x
oferecerá apenas comandos internos. Para adicionar comandos de seus pacotes, você teria que adicionar:commands
definições explícitas a todas as suasuse-package
declarações, o que equivale a muito esforço de manutenção - principalmente para pacotes grandes como o Magit - para ganho praticamente zero - package.el oferece carregamentos automáticos gratuitamente .Combinar
use-package
com o package.el é realmente muito simples - toda a configuração é baseada nessa combinação - mas é muito melhor deixar o package.el realmente funcionar. Apenas inicialize o package.el no início do seu arquivo init:Por conveniência, você pode querer inicializar
use-package
, se ainda não estiver instalado:Isso permite que você inicie uma sessão do Emacs em um sistema novo, e o init.el será instalado automaticamente
use-package
.Por fim, você precisa carregar
use-package
:Agora você pode usar
use-package
para instalar e configurar pacotes:Quando o Emacs agora avaliar esse formulário durante a inicialização,
use-package
verificará se o Magit já está instalado e o instalará automaticamente, se necessário.fonte
package-initialize
leva algum tempo para preencher o caminho, definir carregamentos automáticos e fazer o resto. Acho que li em algum lugar que o próprio Jon Wiegley (o autor deuse-package
) prefere declarar todos os comandos carregados automaticamente emuse-package
estrofes, em vez de confiarpackage.el
.load-path
e adicionar carregamentos automáticos nos dois casos, seja viause-package
ou viapackage.el
. Duvido que exista uma diferença mensurável, principalmente se você tiver um sistema moderno com um disco rápido.package-initialize
uma lista personalizadaload-path
. Atribuo isso à "exploração" do sistema de arquivos quepackage.el
faz. No entanto, nunca medi nenhuma diferença significativa no desempenho entre carregarautoload
definições de arquivos e colocá-las emuse-package
estrofes.package.el
sistema, diria que apenas desabiliteipackage-initialize
! O motivo é que, embora eu gostelist-packages
de procurar novos pacotes e principalmente atualizar todos os meus pacotes atualmente instalados, acho que prefiro o carregamento direcionado deuse-package
. Para mim, tendo autoloads apenas para comandos, uso sons como uma coisa boa!