Un init perezoso es un buen init.
(IMO)
Cuándo usar with-eval-after-load
with-eval-after-load
se carga una vez cuando una determinada característica o archivo se carga por primera vez, por lo que un cambio de mapa de teclas va claramente dentro de uno de estos. No menos importante porque el mapa de teclas puede no ser conocido en el tiempo de inicio [intente algo como (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
en emacs -q
]. Un gancho no es una buena solución aquí ya que vincula la función a una tecla cada vez que se inicia el gancho. Como notas de tarsius , puedes leer más sobre por qué no hacerlo local-set-key
en ganchos.
Finalmente, tenga en cuenta que with-eval-after-load
de GNU Emacs 24.4 es un envoltorio de 2 líneas eval-after-load
donde body
no es necesario citarlo.
Cuando usar ganchos
Los ganchos son una lista de funciones cargadas cada vez que se cumple un criterio, por ejemplo, se inicia un modo determinado. Un uso común de los ganchos es cargar modos menores, como flyspell-mode
o hl-line-mode
. Por ej (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Como señala Rémi , add-hooks
es inteligente y hará lo correcto incluso si la variable de gancho aún no se ha cargado. No obstante, tengo muchas cláusulas como las siguientes, que pueden ser insignificantes para aumentar la velocidad, pero da un sentido de organización y estructura de dependencia:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
¿Por qué agregar al gancho después org-agenda
? Como siempre, C-h v org-agenda-mode-hook C-j
entrega. El gancho se define org-agenda.el
como se muestra en *help*
.
Cargando funciones adicionales with-eval-after-load
with-eval-after-load
También es importante para cargar funciones adicionales. Probablemente desee algo como (with-eval-after-load 'org (require 'org-inlinetask))
cargar las tareas en línea de la organización. A ver por qué (find-library "org-inlinetask")
. Dado que org-inlinetasks.el
directamente (require 'org)
, todo lo bueno autoload
que sus amables encargados del mantenimiento de Emacs tuvieron mucho cuidado en proporcionar será "ignorado" y todo org.el(c)
será cargado.
Pero, ¿qué defun
pasa si su (personal) se requiere varios lugares? Si es realmente quisquilloso, puede poner los defun
s en otro archivo load-path
y agregar autoload
cookies, o puede decirle a Emacs dónde encontrar la función con la autoload
función. Entonces algo como esto funcionaría:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
O podrías simplemente require
org
como a su vez tiraríacdlatex
Y, sinceramente, la defuncion personal no va a importar mucho para el tiempo de inicio la mayor parte del tiempo. Las 1150 líneas de defuns personales (84 defuns) en mi init.el
agrega 0.02s sobre Emacs de vainilla.
Medición del tiempo de inicialización
Una manera fácil de aproximar el tiempo de inicialización es
time emacs --eval "(kill-emacs)"
(punto de referencia contra emacs -q
.
Pero para obtener una aproximación más detallada de dónde se encuentran los cuellos de botella de inicialización, consulte Joe Schafer's esup
.
Finalmente, el tiempo de carga no desaparece mágicamente. Solo lo está empujando hacia adelante (en la medida en que usa todas las funciones en cada sesión).
with-eval-after-load
se carga una vez , por lo que un cambio de mapa de teclas va allí. Los ganchos se cargan cada vez que se ejecuta el modo , por ejemplo, al cargar un nuevo archivo asociado con el modo, o como se define el gancho. Cargaría, por ejemplo,flyspell-mode
ohl-line-mode
en un gancho. En miinit.el
usowith-eval-after-load
aproximadamente 160 veces yadd-hook
110 veces. Un init flojo es un buen init (IMO).