Khi nào chỉ định tên gói trong gói sử dụng: đảm bảo thẻ?


7

use-packagecho phép bạn tự động cài đặt các gói bằng cách sử dụng :ensurethẻ. Bạn có thể làm như sau

(use-package <package>
  :ensure t)

Nhưng đối với một số gói không hoạt động, chẳng hạn như auctex. Trong những trường hợp đó, bạn có thể chỉ định gói ensurenhư sau

(use-package tex
  :ensure auctex)

Theo blog / hướng dẫn / trang web này , lý do là

bởi vì, sau khi cài đặt, auctexghi đè texgói.

Điều đó có nghĩa là gì và làm thế nào tôi có thể biết khi nào nên làm điều đó cho các gói khác?

Câu trả lời:


11

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 auctexlà 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 auctexgó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 auctexgói. Hãy xem xét các ví dụ sau:

M-xpp-macroexpand-last-sexpRETvớ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:ensuretừ 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 đó tchỉ 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-shadowsRET.

Một cơ quan tốt hơn là use-packagetà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-packagekhổ 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-contribphâ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ó 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-packagechỉ có thể đi xa trong việc trừu tượng hóa.

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.