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-keyem ganchos.
Finalmente, observe que o with-eval-after-loadGNU Emacs 24.4 é um wrapper de 2 linhas em torno do eval-after-loadqual bodynã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-modeou 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-jentrega. O gancho é definido org-agenda.elcomo mostrado em *help*.
Carregando recursos extras with-eval-after-load
with-eval-after-loadtambé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.eldiretamente (require 'org), todo o bom autoloadque 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) defunfor necessário em vários lugares? Se você é realmente exigente, pode colocar os defuns em outro arquivo no seu load-pathe adicionar autoloadcookies, ou pode dizer ao Emacs onde encontrar a função com a autoloadfunçã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.eladicionam 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-modeouhl-line-modeem um gancho. No meuinit.eleu usowith-eval-after-loadaproximadamente 160 vezes eadd-hook110 vezes. Um init lento é um bom init (IMO).