Quero adicionar uma ligação de chave específica ao modo látex:
(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)
Ao mesmo tempo, desejo defini-lo apenas quando o modo específico estiver carregado. Então, eu gostaria de saber se há uma preferência (melhor prática) entre usar o hook apropriado ( latex-mode-hook
) para fazer isso ou usar a cláusula (with-eval-after-load "tex-mode" ...
para quebrar a definição de ligação de chave. Eu testei os dois e eles funcionam bem, mas me pergunto qual é o caminho certo para fazê-lo.
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).Respostas:
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)
ememacs -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 paralocal-set-key
em ganchos.Finalmente, observe que o
with-eval-after-load
GNU Emacs 24.4 é um wrapper de 2 linhas em torno doeval-after-load
qualbody
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
ouhl-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:Por que adicionar ao gancho depois
org-agenda
? Como sempre,C-h v org-agenda-mode-hook C-j
entrega. O gancho é definidoorg-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")
. Comoorg-inlinetasks.el
diretamente(require 'org)
, todo o bomautoload
que seus amigáveis mantenedores do Emacs tomaram muito cuidado para fornecer será "ignorado" e todosorg.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 osdefun
s em outro arquivo no seuload-path
e adicionarautoload
cookies, ou pode dizer ao Emacs onde encontrar a função com aautoload
função. Então algo assim funcionaria: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 é
(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).
fonte
with-eval-after-load
sem perder vantagens de inicialização lenta?Além de suas sugestões
eval-after-load
e uso de um gancho, deixe-me sugeriruse-package.el
. Você pode fazer o que precisar comLaTeX não será carregado até depois de você solicitar.
Apenas como uma observação lateral: o uso cuidadoso de
use-package
reduziu meus tempos de inicialização para menos de um segundo. (Demorava cerca de quatro segundos.)fonte
use-package
está programado para ser lançado com o Emacs 25. #