Một init lười biếng là một init tốt.
(IMO)
Khi nào sử dụng with-eval-after-load
with-eval-after-load
được tải một lần khi một tính năng hoặc tệp nhất định được tải lần đầu tiên , do đó, thay đổi sơ đồ bàn phím rõ ràng nằm trong một trong những tính năng này. Không phải là ít nhất bởi vì sơ đồ bàn phím có thể không được biết vào lúc bắt đầu [thử một cái gì đó như (define-key message-mode-map (kbd "C-c f") 'Footnote-add-footnote)
trong emacs -q
]. Một móc chưa là thoải mái giải pháp ở đây vì nó liên kết với các chức năng để một chìa khóa mỗi lần móc được bắt đầu. Như tarsius ghi chú, bạn có thể đọc thêm về việc tại sao không để local-set-key
trong móc.
Cuối cùng, lưu ý rằng with-eval-after-load
GNU Emacs 24.4 là trình bao bọc 2 dòng xung quanh eval-after-load
nơi body
không cần trích dẫn.
Khi nào sử dụng móc
Móc là danh sách các chức năng được tải mỗi khi một tiêu chí được đáp ứng, ví dụ: một chế độ nhất định được bắt đầu. Một cách sử dụng phổ biến của hook là để tải các chế độ nhỏ, chẳng hạn như flyspell-mode
hoặc hl-line-mode
. Ví dụ (add-hook 'org-agenda-mode-hook 'hl-line-mode)
. Như Rémi chỉ ra, add-hooks
là thông minh và sẽ làm đúng ngay cả khi biến hook chưa được tải. Tuy nhiên, tôi có nhiều mệnh đề như sau, có thể không đáng kể để tăng tốc, nhưng lại mang lại ý nghĩa về tổ chức và cấu trúc phụ thuộc:
(with-eval-after-load 'org-agenda
(add-hook 'org-agenda-mode-hook 'hl-line-mode))
Tại sao thêm vào hook sau org-agenda
? Như mọi khi, C-h v org-agenda-mode-hook C-j
cung cấp. Các hook được định nghĩa org-agenda.el
như thể hiện trong *help*
.
Đang tải các tính năng bổ sung with-eval-after-load
with-eval-after-load
cũng quan trọng để tải các tính năng bổ sung. Bạn có thể muốn một cái gì đó như (with-eval-after-load 'org (require 'org-inlinetask))
tải org inlinet Nhiệm vụ. Để xem tại sao (find-library "org-inlinetask")
. Vì org-inlinetasks.el
trực tiếp (require 'org)
, tất cả những điều tốt đẹp autoload
mà những người bảo trì Emacs thân thiện của bạn rất quan tâm để cung cấp sẽ bị "bỏ qua" và tất cả org.el(c)
sẽ được tải.
Nhưng nếu (cá nhân) của bạn defun
được yêu cầu một vài nơi thì sao? Nếu bạn thực sự kén chọn, bạn có thể đặt defun
s vào một tệp khác trong tệp của mình load-path
và thêm autoload
cookie hoặc bạn có thể cho Emacs biết nơi tìm hàm với autoload
hàm. Sau đó, một cái gì đó như thế này sẽ làm việc:
(autoload 'org-cdlatex-mode "org" "cdlatex mode from org.")
(with-eval-after-load "latex"
(add-hook 'TeX-mode-hook 'org-cdlatex-mode))
Hoặc bạn có thể require
org
lần lượt kéo nócdlatex
Và, thành thật mà nói, việc giải tán cá nhân sẽ không còn quan trọng đối với thời gian khởi đầu. 1150 dòng defun cá nhân (84 defun) trong tôi init.el
thêm 0,02s so với vanilla Emacs.
Đo thời gian khởi tạo
Một cách dễ dàng để ước tính thời gian xác định là
time emacs --eval "(kill-emacs)"
(điểm chuẩn so với emacs -q
.
Nhưng để có được một xấp xỉ chi tiết hơn về nơi mà các nút thắt khởi tạo được kiểm tra của Joe Schafer esup
.
Cuối cùng, thời gian tải không biến mất một cách kỳ diệu. Bạn chỉ đẩy nó về phía trước (đến phần mở rộng mà bạn sử dụng tất cả các tính năng trong mỗi phiên).
with-eval-after-load
được tải một lần , do đó, một thay đổi sơ đồ sẽ xuất hiện ở đó. Móc tải mỗi khi chế độ được chạy , ví dụ như khi tải một tệp mới được liên kết với chế độ, hoặc tuy nhiên móc được xác định. Bạn sẽ tải ví dụflyspell-mode
hoặchl-line-mode
trong một cái móc. Trong tôiinit.el
sử dụngwith-eval-after-load
khoảng 160 lần vàadd-hook
110 lần. Một init lười biếng là một init tốt (IMO).