(Gói 'yêu cầu) có nghĩa gì đối với emacs và nó khác với tệp tải như thế nào?


10

Tôi mới bắt đầu sử dụng emacs vài ngày trước và tôi đã đọc ở đâu đó (require 'package-name)không cần thiết khi gói đã nói được cài đặt bằng gói cài đặt. Nhưng tại sao, những gì (require 'package-name)thực sự làm và làm thế nào nó khác với load-filehoặc loadthủ tục?


7
Một trong những điều đầu tiên mà tất cả chúng ta phải học trong Emacs là M-x describe-functionđọc chuỗi doc. aka C-h fM-x describe-function RET require RETvà đọc doc-string. Sau đó nhập M-x describe-function RET load-file RETvà đọc chuỗi doc. Sau đó nhập M-x describe-function RET load RETvà đọc chuỗi doc. Sau khi đọc tất cả ba chuỗi doc, vui lòng chỉnh sửa câu hỏi của bạn để so sánh và đối chiếu cả ba chức năng và làm rõ những gì bạn vẫn không hiểu trong mối quan hệ. Chúng tôi sử dụng cùng một quy trình cho các biến - tức là , M-x describe-variable.
luật

Câu trả lời:


13

Nếu bạn loadliên tục thư viện, tệp đó sẽ được đọc và mã của nó được đánh giá liên tục (mỗi lần bạn tải nó).

Nếu bạn requireliên tục thư viện, thư viện sẽ loadmột lần (nhiều nhất - và hoàn toàn không nếu thư viện đã được tải).

requirecung cấp hiệu quả này ngay cả khi requireban đầu không được sử dụng để tải thư viện, bởi vì (phần lớn) các thư viện chứa mã (provide 'FEATURE)cho FEATUREtên cụ thể của họ . Mã đó được đánh giá khi thư viện được tải, bất kể nó được tải như thế nào và tại thời điểm đó, nó cập nhật dữ liệu sẽ requirekiểm tra khi quyết định xem nó có cần phải làm gì không.

Chủ yếu là bạn muốn sử dụng requiretrong mã của riêng bạn, nếu bạn cần đảm bảo rằng một thư viện nhất định đã được tải.

Lý do bạn thường không cần phải làm điều này với các gói ELPA là vì trình quản lý gói tự động xử lý bất kỳ cookie tự động tải nào trong gói và tạo một tệp tự động tải cho gói đó. Khi hệ thống gói được khởi chạy khi bạn khởi động Emacs, tệp tự động tải cho mỗi gói được ước tính, xác định tất cả các chức năng được tải tự động. Khi một chức năng tự động tải được gọi, thư viện chứa định nghĩa thực sự của chức năng sẽ được tự động tải.

Các tác giả gói có thể thêm cookie tự động tải vào từng chức năng mà người dùng có thể sẽ gọi trực tiếp và do đó, với điều kiện là mong muốn của họ là chính xác, bạn sẽ không cần phải gọi requirehoặc tải một cách rõ ràng gói để sử dụng.

Lưu ý rằng bạn cũng có thể xác định tự động tải tùy chỉnh của riêng bạn. Xem C-hig (elisp) Autoload RETvà cũng (elisp) Hooks for Loadingnếu bạn muốn sử dụng cấu hình thư viện tải chậm và trì hoãn tùy chỉnh trong cấu hình của riêng bạn. (Phần sau nói "không đánh giá mã này cho đến khi thư viện này được tải", liên kết độc đáo với "không tải thư viện này cho đến khi cần" cơ chế tự động tải).


2
Vì bạn đã tham khảo hướng dẫn Elisp, tôi nghĩ rằng một nút thích hợp khác là (elisp) Named Features.
Basil
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.