Câu trả lời:
Có bất kỳ quy tắc nào mà người dùng có thể xác định xem cấu hình gói yêu cầu
:init
hay:config
không?
Không có quy tắc chung áp dụng cho tất cả các cài đặt và gói; bạn chỉ cần làm quen với ý nghĩa của các từ khóa này bằng cách đọc tệp README của use-package
.
Tóm lại, :init
khối được chạy khi khởi động, như thể bạn đã đặt các hình thức cấu thành của nó ở cấp cao nhất (tức là bên ngoài một cuộc gọi thông thường đến use-package
) của bạn user-init-file
. Điều này có nghĩa là chúng luôn được chạy, bất kể gói tương ứng đã được tải hay chưa.
Mặt :config
khác, khối được chạy sau khi gói tương ứng đã được tải, theo eval-after-load
cơ chế.
Như vậy, bạn có thể cải thiện thời gian khởi động của mình bằng cách di chuyển các cài đặt chạy dài có thể áp dụng từ :init
sang :config
. Nếu bạn cần sửa đổi một biến chỉ được xác định sau khi tải một gói cụ thể, thì bạn cũng cần phải đặt nó trong :config
khối. Một số biến, chẳng hạn như gnus-home-directory
, cần được đặt trước khi gói tương ứng của chúng được tải, vì vậy chúng nên được đặt vào :init
. Tôi thực sự khuyên bạn nên đặt tất cả các cuộc gọi add-hook
/ remove-hook
cuộc gọi có thể áp dụng trong :init
khối, vì các móc nối có thể được sửa đổi ngay cả khi không bị ràng buộc và điều này mang lại nhiều tính mô đun hơn cho thiết lập của bạn.
Bạn thường có thể tránh phải tìm ra nơi đặt một cài đặt cụ thể bằng cách sử dụng :custom
từ khóa mới hoặc bằng cách sử dụng trực tiếp giao diện Tùy chỉnh dễ dàng .
Tôi không chắc chắn nếu có một quy tắc chung (ngoài "sử dụng :init
cho cấu hình sẵn trước khi tải gói thực tế và sử dụng :config
cho cấu hình khác, tốt,").
Nhưng bản thân tôi sử dụng :init
khi, ví dụ, tôi muốn thêm một số phím bấm bản đồ chế độ khác để sử dụng các chức năng từ gói "này". Và vẫn muốn gói "này" được tải lười biếng.
Dưới đây là ví dụ về tải lười biếng của dired-ranger
:
(use-package dired-ranger
:commands (dired-ranger-copy dired-ranger-paste dired-ranger-move)
:init
(add-hook 'dired-mode-hook
(lambda ()
(define-key dired-mode-map (kbd "M-w") 'dired-ranger-copy)
(define-key dired-mode-map (kbd "C-y") 'dired-ranger-paste)
(define-key dired-mode-map (kbd "C-c C-y") 'dired-ranger-move))))
PS: Nếu không có :defer
, :commands
, :mode
và những người khác mà làm cho gói tải lười biếng, sau đó :init
và :config
nên được nhiều hơn hoặc ít hơn như nhau (nhưng :init
sẽ được đánh giá trước đó :))
:config
quá muộn - tải lười biếng sẽ không áp dụng các ràng buộc của tôi. Và :bind
với :map
không thực sự ràng buộc nó.
:config
không quá muộn - đó chính xác dired-mode-map
là lần đầu tiên được xác định. Có lẽ bạn chỉ đặt nó ở use-package
dạng sai dired-ranger
thay vì dired
, dired-mode-map
được xác định ở đâu . Điều này cũng có thể giải thích tại sao bạn :bind
không làm việc. Về cơ bản, hoặc bạn đang làm gì đó sai hoặc use-package
có lỗi. Không nhầm lẫn giữa các keybindings cục bộ và eval-after-load
với các keybindings toàn cầu của các lệnh / keymap được tải tự động.
use-package-always-ensure
và khi tôi cố gắng sử dụng gói-dired, nó không thể tải nó từ elpa. Nhưng có :ensure nil
ở đó giải quyết vấn đề và tôi có thể thiết lập tải gói chuỗi dired
-> dired-ranger
bằng cách sử dụng :after
.
:bind
từ khóa cho việc này hoặc sửa đổi các ràng buộc chính trong:config
khối.