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 đó :initsẽ đượ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 :configsẽ đượ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 modengầ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-packagecá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-modekhô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, :configbiểu thức không bao giờ được đánh giá vì một gói có tên html-modekhông bao giờ được tải. Di chuyển cùng một biểu thức để :inithoạt động vì mã init luôn được đánh giá, bất kể gói có được tải hay không.