Um init preguiçoso é um bom init.
(IMO)
Quando usar with-eval-after-load
with-eval-after-load
é carregado uma vez quando um determinado recurso ou arquivo é carregado pela primeira vez, portanto, uma alteração no mapa de teclas entra claramente em um deles. Não menos importante, porque o mapa de teclas pode não ser conhecido no momento do início [tente algo como (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
em emacs -q
]. Um gancho não é uma solução agradável aqui, pois vincula a função a uma chave toda vez que o gancho é iniciado. Como tarsius notas, você pode ler mais sobre por que não para local-set-key
em ganchos.
Finalmente, observe que o with-eval-after-load
GNU Emacs 24.4 é um wrapper de 2 linhas em torno do eval-after-load
qual body
não precisa ser citado.
Quando usar ganchos
Ganchos são uma lista de funções carregadas toda vez que um critério é atendido, por exemplo, um determinado modo é iniciado. Um uso comum de ganchos é carregar modos menores, como flyspell-mode
ou hl-line-mode
. Por exemplo (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Como Rémi aponta, add-hooks
é inteligente e fará a coisa certa, mesmo que a variável hook ainda não tenha sido carregada. No entanto, tenho muitas cláusulas como as seguintes, que podem ser insignificantes para ganhos de velocidade, mas fornecem um senso de organização e estrutura de dependência:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
Por que adicionar ao gancho depois org-agenda
? Como sempre, C-h v org-agenda-mode-hook C-j
entrega. O gancho é definido org-agenda.el
como mostrado em *help*
.
Carregando recursos extras with-eval-after-load
with-eval-after-load
também é importante para carregar recursos extras. Você provavelmente desejaria algo como (with-eval-after-load 'org (require 'org-inlinetask))
carregar inlinetasks org. Para ver o porquê (find-library "org-inlinetask")
. Como org-inlinetasks.el
diretamente (require 'org)
, todo o bom autoload
que seus amigáveis mantenedores do Emacs tomaram muito cuidado para fornecer será "ignorado" e todos org.el(c)
serão carregados.
Mas e se o seu (pessoal) defun
for necessário em vários lugares? Se você é realmente exigente, pode colocar os defun
s em outro arquivo no seu load-path
e adicionar autoload
cookies, ou pode dizer ao Emacs onde encontrar a função com a autoload
função. Então algo assim funcionaria:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
Ou você poderia require
org
, por sua vez, puxarcdlatex
E, honestamente, o desânimo pessoal não importa muito para o tempo de inicialização na maioria das vezes. As 1150 linhas de desajustes pessoais (84 desajustados) nos meus init.el
adicionam 0,02s sobre o Emacs de baunilha.
Medindo o tempo de inicialização
Uma maneira fácil de aproximar o tempo de inicialização é
time emacs --eval "(kill-emacs)"
(referência contra emacs -q
.
Mas, para obter uma aproximação mais detalhada de onde estão os gargalos de inicialização, consulte Joe Schafer esup
.
Finalmente, o tempo de carregamento não desaparece magicamente. Você está apenas avançando (na medida em que você usa todos os recursos em cada sessão).
with-eval-after-load
é carregado uma vez , portanto, uma alteração no mapa de teclas é executada lá. Os ganchos são carregados toda vez que o modo é executado , por exemplo, ao carregar um novo arquivo associado ao modo ou, no entanto, o gancho é definido. Você carregaria, por exemplo,flyspell-mode
ouhl-line-mode
em um gancho. No meuinit.el
eu usowith-eval-after-load
aproximadamente 160 vezes eadd-hook
110 vezes. Um init lento é um bom init (IMO).