Chcę dodać określone powiązanie klucza do trybu lateksowego:
(define-key latex-mode-map (kbd "<f6>") 'my-latex-defun)
Jednocześnie chcę to ustawić tylko po załadowaniu określonego trybu. Chciałbym więc wiedzieć, czy istnieje preferencja (najlepsza praktyka) między użyciem odpowiedniego hook ( latex-mode-hook
) w celu osiągnięcia tego, a użyciem klauzuli (with-eval-after-load "tex-mode" ...
do zawijania definicji powiązania klucza. Przetestowałem oba i działają dobrze, ale zastanawiam się, który z nich jest właściwy.
with-eval-after-load
jest ładowany jeden raz , więc następuje zmiana mapy klawiszy. Haki ładują się przy każdym uruchomieniu trybu , np. Przy ładowaniu nowego pliku związanego z trybem lub niezależnie od tego, jak hak jest zdefiniowany. Załadowałbyś np.flyspell-mode
Lubhl-line-mode
hak. W moiminit.el
używamwith-eval-after-load
około 160 razy iadd-hook
110 razy. Leniwy init jest dobrym inicjatorem (IMO).Odpowiedzi:
Leniwy inicjator jest dobrym inicjatorem.
(IMO)
Kiedy użyć
with-eval-after-load
with-eval-after-load
jest ładowany raz, gdy pewna funkcja lub plik jest ładowany po raz pierwszy , więc zmiana mapy klawiszy wyraźnie wchodzi w jeden z nich. Nie tylko dlatego, że mapa klawiszy może nie być znana podczas inicjalizacji [spróbuj czegoś takiego jak(define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
wemacs -q
]. Hak nie jest tutaj dobrym rozwiązaniem, ponieważ wiąże funkcję z klawiszem przy każdym uruchomieniu haka. Jak Tarsius notatek, można dowiedzieć się więcej o tym, dlaczego nie dolocal-set-key
w haki.Na koniec zauważ, że
with-eval-after-load
GNU Emacs 24.4 jest 2-liniowym opakowaniem, weval-after-load
którymbody
nie trzeba cytować.Kiedy stosować haki
Haki to lista funkcji ładowanych za każdym razem, gdy spełnione jest kryterium, np. Uruchamiany jest określony tryb. Powszechnym zastosowaniem haków jest ładowanie mniejszych trybów, takich jak
flyspell-mode
lubhl-line-mode
. Np(add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Jak podkreśla Rémi ,add-hooks
jest sprytny i zrobi właściwą rzecz, nawet jeśli zmienna haka nie została jeszcze załadowana. Niemniej jednak mam wiele klauzul, takich jak następujące, które mogą być nieistotne dla przyspieszenia, ale dają poczucie organizacji i struktury zależności:Po co dodawać do haka po
org-agenda
? Jak zawszeC-h v org-agenda-mode-hook C-j
dostarcza. Hak jest zdefiniowanyorg-agenda.el
jak pokazano w*help*
.Ładowanie dodatkowych funkcji
with-eval-after-load
with-eval-after-load
jest również ważne przy ładowaniu dodatkowych funkcji. Prawdopodobnie chcesz coś takiego jak(with-eval-after-load 'org (require 'org-inlinetask))
ładowanie orglinaskasks. Aby zobaczyć dlaczego(find-library "org-inlinetask")
. Ponieważorg-inlinetasks.el
bezpośrednio(require 'org)
wszystkie miłeautoload
rzeczy, o które dbali Twoi przyjaźni opiekunowie Emacsa, zostaną „zignorowane” i wszystkieorg.el(c)
zostaną załadowane.Ale co jeśli twoje (osobiste)
defun
jest wymagane kilka miejsc? Jeśli jesteś naprawdę wybredny, możesz umieścićdefun
s w innym pliku w swoim plikuload-path
i dodaćautoload
pliki cookie lub możesz powiedzieć Emacsowi, gdzie znaleźć funkcję za pomocą tejautoload
funkcji. Wtedy coś takiego działałoby:Lub możesz tak,
require
org
jak to z kolei pociągniecdlatex
I, szczerze mówiąc, osobisty defun nie będzie miał większego znaczenia dla czasu inicjacji przez większość czasu. 1150 linii osobistej porażki (84 porażek) u mnie
init.el
dodaje 0,02s w stosunku do waniliowego Emacsa.Pomiar czasu inicjalizacji
Prostym sposobem na przybliżenie czasu inicjalizacji jest
(punkt odniesienia przeciwko
emacs -q
.Ale aby uzyskać bardziej szczegółowe przybliżenie, gdzie są wąskie gardła podczas inicjalizacji, sprawdź Joe Schafer
esup
.Wreszcie czas ładowania nie znika magicznie. Popychasz go tylko do przodu (do tego stopnia, że używasz wszystkich funkcji w każdej sesji).
źródło
with-eval-after-load
nie tracąc leniwych zalet inicjalizacji?Oprócz twoich sugestii
eval-after-load
i używania haka, pozwól, że zasugerujęuse-package.el
. Możesz robić, co potrzebujeszLaTeX nie zostanie załadowany aż po poprosić go.
Na marginesie: ostrożne użycie
use-package
skróciło moje czasy uruchamiania do mniej niż sekundy. (Zwykle zajmowało to około czterech sekund.)źródło
use-package
ma zostać wysłany z Emacsem 25.