Nhưng đối với một số gói không hoạt động. Chẳng hạn như auctex
.
Lý do (use-package tex :ensure t)
không hoạt động auctex
là vì auctex
đặt tên cho gói GNU ELPA (xem (emacs) Packages
), trong khi tex
đặt tên cho một tính năng (xem (elisp) Named Features
) do auctex
gói cung cấp .
Nói cách khác, tex
đặt tên cho một tệp duy nhất tex.el
được phân phối như một phần của auctex
gói. Hãy xem xét các ví dụ sau:
Gõ M-xpp-macroexpand-last-sexp
RETvới điểm sau
(use-package tex
:ensure t)
đưa ra một hình thức mà sôi lên
(progn
(use-package-ensure-elpa 'tex '(t) 'nil)
(require 'tex nil t))
trong khi làm tương tự với
(use-package tex
:ensure auctex)
mở rộng hiệu quả đến
(progn
(use-package-ensure-elpa 'tex '(auctex) 'nil)
(require 'tex nil t))
Điều này minh họa sự khác biệt về mục đích giữa NAME
đối số use-package
và :ensure
từ khóa của nó . Các tuyên bố trước đây có tên là phần còn lại của khổ thơ liên quan / mặc định, với ý nghĩa chính xác như trong with-eval-after-load
; thấy (elisp) Hooks for Loading
.
Cái sau chỉ yêu cầu (các) gói đã cho được cài đặt thông qua đối số thứ hai cho hàm use-package-ensure-elpa
, trong đó t
chỉ có nghĩa là gói được đặt tên bởi dòng điện NAME
. use-package-ensure-elpa
, lần lượt, các cuộc gọi package-install
; để biết chi tiết về điều này xem (emacs) Package Installation
.
Theo blog / hướng dẫn / trang web này lý do là
bởi vì, sau khi cài đặt, auctex sẽ ghi đè gói tex.
Điều đó nghĩa là gì
Thật không may, điều này là sai và sai. "Ghi đè" thường đề cập đến việc thay thế hoặc vá khỉ chức năng hiện có, ví dụ như thông qua lời khuyên . Khi một gói cung cấp tính năng được đặt tên giống như gói khác, do đó ẩn gói thứ hai khỏi các hàm tải Emacs, đây được gọi là "đổ bóng".
Phân phối AocateeX ghi đè và mở rộng các chức năng liên quan đến TeX tích hợp khác nhau, nhưng nó không che khuất bất kỳ thư viện tích hợp nào. Bạn có thể xác nhận điều này bằng cách kiểm tra kết quả của M-xlist-load-path-shadows
RET.
Một cơ quan tốt hơn là use-package
tài liệu chính: https://github.com/jwiegley/use-package/#package-installation .
Làm thế nào tôi có thể biết khi nào để làm điều đó cho các gói khác?
Nó phụ thuộc cả vào cách bạn muốn nhóm các use-package
khổ thơ của mình và tên của gói tương ứng. Ví dụ: nếu bạn muốn đặt tất cả hoặc hầu hết các cài đặt liên quan đến Org của mình trong một (use-package org ...)
, nhưng muốn sử dụng org-plus-contrib
phân phối Org thay vì cài đặt sẵn, thì bạn sẽ viết
(use-package org
:ensure org-plus-contrib
...)
Bạn sẽ không viết
(use-package org-plus-contrib
:ensure t
...)
bởi vì không có tệp nào được đặt tên org-plus-contrib.el
, ngay cả khi có một gói có tên org-plus-contrib
. Bạn tương tự sẽ không viết
(use-package auctex
:ensure t
...)
vì lý do tương tự - có được không tên tính năng auctex
(có là một tập tin auctex.el
, nhưng nó không gọi (provide 'auctex)
).
Lưu ý rằng không có sự khác biệt / ngữ nghĩa nào là cụ thể use-package
; đây là tất cả các tính năng Emacs (mạnh mẽ và hữu ích) use-package
chỉ có thể đi xa trong việc trừu tượng hóa.