Chúng khác nhau nếu gói bị hoãn, tức là không được tải cho đến khi cần. Trong trường hợp đó :init
sẽ được thực thi tại thời điểm tệp emacs của bạn được đọc lần đầu tiên, nhưng :config
sẽ được thực thi tại thời điểm gói thực sự được tải.
Trong ví dụ của bạn, việc sử dụng mode
ngầm định tải gói. Bạn đã cấu hình gói được tải lần đầu tiên khi truy cập tệp html.
Bạn có thể sử dụng :demand
để đảm bảo gói luôn được tải khi khởi động, nhưng nhiều khả năng những gì bạn muốn làm ở đây là đưa hook của bạn vào :init
.
Từ chuỗi tài liệu:
:init Code to run when `use-package' form evals.
Vì bạn đang đặt tệp này vào tệp người dùng của bạn, điều đó có nghĩa là nó sẽ chạy khi khởi động.
:config Runs if and when package loads.
Vì vậy, không chạy cho đến khi gói thực sự được tải ..
:defer Defer loading of package -- automatic if :commands, :bind, :bind*, :mode or :interpreter are used.
Lưu ý danh sách những thứ tự động làm cho một gói bị hoãn lại. Về cơ bản nếu bạn cho biết use-package
các điều kiện mà bạn cần gói này, thì nó giả định rằng bạn không muốn tải nó cho đến khi những điều kiện đó phát sinh.
:demand Prevent deferred loading in all cases.
Đảm bảo gói được tải khi khởi động, bất kể các tùy chọn khác bạn đã chỉ định.
Cập nhật
Xem lại điều này dựa trên những nhận xét gần đây ... Những gì tôi nói ở trên hoàn toàn đúng, nhưng tôi không nghĩ nó trả lời đúng câu hỏi. Vấn đề gốc ở đây thực sự html-mode
không phải là một gói, mà là một chế độ được xác định bởi gói sgml-mode
. Điều này hoạt động như mong đợi đối với tôi:
(use-package sgml-mode
:mode ("\\.html\\'" . html-mode)
:config (add-hook 'html-mode-hook 'turn-off-auto-fill))
Trong ví dụ ban đầu, :config
biểu thức không bao giờ được đánh giá vì một gói có tên html-mode
không bao giờ được tải. Di chuyển cùng một biểu thức để :init
hoạt động vì mã init luôn được đánh giá, bất kể gói có được tải hay không.