TL; DR:
Adicione a seguinte linha ao topo do seu arquivo init ( .emacs.d/init.el
ou .emacs
):
(package-initialize)
A explicação
Criar mais arquivos que o Emacs pode usar como user-init-file
definitivamente não é a abordagem correta. Como o manual não diz qual é o preferido no caso de um conflito, pelo menos não na parte que você citou, tudo o que isso faz é adicionar confusão - agora não sabemos qual é realmente user-init-file
((cujo valor você pode querer inspecionar para descobrir).
Portanto, comece removendo todos os candidatos, exceto o ~/.emacs.d/init.el
que geralmente é preferido (pelos usuários), porque não contribui para a bagunça profana que é $HOME
e permite manter todos os arquivos de configuração do Emacs, incluindo o mais importante, sob controle de versão usando um repositório apenas para Emacs.
Por padrão, o Emacs chama package-initialize
após o carregamento do arquivo init do usuário. Fá-lo em tudo , porque hoje em dia a maioria dos usuários instalar seus pacotes usando package.el
- para que eles não deveriam ter que fazer qualquer coisa para estes pacotes a serem disponibilizados.
Por outro lado, nem todo mundo faz, por isso deve ser possível não ligar package-initialize
. Impedir que essa função seja chamada é feito adicionando (setq package-enable-at-startup nil)
ao arquivo init do usuário (onde mais você poderia colocá-lo?).
package-initialize
não pode ser chamado antes que o usuário tenha uma alteração para dizer ao Emacs para não fazê-lo, e isso deve ser feito após o carregamento do arquivo init. Desde que o usuário instale apenas pacotes e os use como estão ou os personalize, usando a interface Personalizada que funciona bem. Mas se você quiser personalizar seus pacotes usando o elisp, precisará certificar-se de que eles estejam realmente ativos load-path
antes de usar as funções que eles definem.
É muito fácil de fazer e documentado adequadamente (se eu tivesse pesquisado isso primeiro, não teria que escrever a maioria dos itens acima: - /
O motivo pelo qual o carregamento automático de pacotes ocorre após o carregamento do arquivo init é que as opções do usuário somente recebem seus valores customizados após o carregamento do arquivo init, incluindo as opções do usuário que afetam o sistema de empacotamento. Em algumas circunstâncias, convém carregar pacotes explicitamente no seu arquivo init (geralmente porque algum outro código no arquivo init depende de um pacote). Nesse caso, o arquivo de inicialização deve chamar a função package-initialize
. Cabe a você garantir que as opções relevantes do usuário, como package-load-list
(veja abaixo), sejam configuradas antes da package-initialize
chamada. Você também deve definir
package-enable-at-startup
comonil
, para evitar carregar os pacotes novamente após o processamento do arquivo init. Como alternativa, você pode optar por inibir completamente o carregamento de pacotes na inicialização e chamar o comando `Mx package-initialize 'para carregar seus pacotes manualmente.
Então:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
É claro que o problema (ou um problema adicional) também pode ser que o erro de digitação Symbol's function definition is void: use-packge
esteja no seu arquivo init e não aconteceu até que você o tenha digitado no emacs.se.
(require 'use-package)
antes(package-initialize)
?Eu acho que a
after-init-hook
solução mencionada nesta resposta de estouro de pilha deve ser mencionada:Eu pensei que era assim que deveria ser feito, mas as outras respostas fornecem informações sobre outras maneiras de fazê-lo.
fonte
A seguir, todos os diretórios são adicionados
~/.emacs.d/site-lisp
ao caminho de carregamento, para que você possa apenasrequire
o pacote e pronto:fonte