TL; DR:
Thêm dòng sau vào đầu tệp init của bạn ( .emacs.d/init.el
hoặc .emacs
):
(package-initialize)
Lời giải thích
Tạo thêm các tệp mà Emacs có thể sử dụng vì user-init-file
đây chắc chắn không phải là phương pháp phù hợp. Bởi vì hướng dẫn không nói cái nào được ưu tiên trong trường hợp có xung đột, ít nhất không phải ở phần bạn đã trích dẫn, tất cả điều này là để thêm sự nhầm lẫn - bây giờ chúng tôi không biết đó thực sự là gì user-init-file
(giá trị mà bạn có thể muốn để kiểm tra để tìm hiểu).
Vì vậy, hãy bắt đầu bằng cách xóa tất cả các ứng cử viên ngoại trừ ~/.emacs.d/init.el
thường được ưa thích (bởi người dùng) bởi vì nó không góp phần vào mớ hỗn độn đó $HOME
và nó cho phép giữ tất cả các tệp cấu hình Emacs, kể cả tệp quan trọng nhất, dưới sự kiểm soát phiên bản chỉ sử dụng kho lưu trữ Emacs.
Theo mặc định, các cuộc gọi Emacs package-initialize
sau khi tệp init của người dùng đã được tải. Tất cả đều như vậy , vì ngày nay hầu hết người dùng đều cài đặt các gói của họ bằng cách sử dụng package.el
- vì vậy họ không cần phải làm bất cứ điều gì để các gói này được cung cấp.
Mặt khác, không phải ai cũng làm như vậy, nên không thể gọi package-initialize
. Ngăn chặn chức năng đó được gọi được thực hiện bằng cách thêm (setq package-enable-at-startup nil)
vào tệp init của người dùng (bạn có thể đặt nó ở đâu khác?).
package-initialize
không thể được gọi trước khi người dùng có thay đổi để bảo Emacs không làm điều đó và vì vậy nó phải được thực hiện sau khi tải tệp init. Miễn là người dùng chỉ cài đặt các gói và sau đó sử dụng chúng theo nguyên trạng hoặc tùy chỉnh chúng bằng giao diện Tùy chỉnh hoạt động tốt. Nhưng nếu bạn muốn tùy chỉnh các gói của mình bằng elisp thì bạn phải chắc chắn rằng chúng thực sự nằm trên load-path
trước khi sử dụng các chức năng mà chúng xác định.
Điều đó khá dễ thực hiện và được ghi lại đúng cách (nếu tôi đã tìm hiểu trước, tôi sẽ không phải viết hầu hết những điều trên: - /
Lý do tải gói tự động xảy ra sau khi tải tệp init là tùy chọn người dùng chỉ nhận giá trị tùy chỉnh của họ sau khi tải tệp init, bao gồm các tùy chọn người dùng ảnh hưởng đến hệ thống đóng gói. Trong một số trường hợp, bạn có thể muốn tải các gói rõ ràng trong tệp init của mình (thường là do một số mã khác trong tệp init của bạn phụ thuộc vào một gói). Trong trường hợp đó, tệp init của bạn sẽ gọi hàm package-initialize
. Tùy thuộc vào bạn để đảm bảo rằng các tùy chọn người dùng có liên quan, chẳng hạn như package-load-list
(xem bên dưới), được thiết lập trước package-initialize
cuộc gọi. Bạn cũng nên đặt
package-enable-at-startup
thànhnil
, để tránh tải lại các gói sau khi xử lý tệp init. Ngoài ra, bạn có thể chọn hoàn toàn ức chế tải gói khi khởi động và gọi lệnh 'Mx khởi tạo gói' để tải các gói của bạn theo cách thủ công.
Vì thế:
;;; .emacs.d/init.el -- the `user-init-file'
(package-initialize)
(setq package-enable-at-startup nil)
(require 'use-package)
(use-package some-package
:init (setq some-package-variable "foobar")
...
;;; .emacs.d/init.el ends here
Tất nhiên, vấn đề (hoặc một vấn đề khác) cũng có thể là lỗi đánh máy Symbol's function definition is void: use-packge
nằm trong tệp init của bạn và không xảy ra cho đến khi bạn nhập nó vào emacs.se.