Làm cách nào để tự động cài đặt các gói với tệp .emacs?


9

Tệp của tôi ~/.emacs(mà bạn có thể tìm thấy trên GitHub ) tải một số gói Emacs khác nhau và tôi muốn chúng được cài đặt tự động ngay khi Emacs khởi động, nếu chúng chưa được cài đặt. Bằng cách này, nếu tôi phải cài đặt lại hệ điều hành Ubuntu 16.04 của mình, tôi sẽ không phải tự cài đặt từng gói bằng cách sử dụng M-x package-install. Có cách nào để viết một ~/.emacstập tin để nó sẽ tự động cài đặt tất cả các gói được tải khi khởi động không? Tôi muốn điều này được thực hiện với tối thiểu các dòng vì tôi đã tải hơn mười gói khác nhau vì vậy nếu tôi phải thêm các dòng bổ sung cho mỗi gói riêng lẻ thì nó sẽ làm cho tôi ~/.emacskhá dài.


3
Có một số cách, nhưng bạn nên sử dụng github.com/jwiegley/use-package
bertfred

Có thể tải nhiều gói trong một dòng với use-package, giống như tôi làm trên dòng 61 của tệp .emacs không?
BH2017

Xem package-install-selected-packages(yêu cầu Emacs 25.1).
Politza

Vì tò mò, tại sao nó là một tài sản mong muốn như vậy để có tất cả các gói của bạn được liệt kê trên một dòng duy nhất? Lý do duy nhất mà bạn đưa ra là để giữ cho ~/.emacstệp của bạn không bị "dài". Nhưng nếu bạn chỉ tải một tá gói, bạn có thực sự lo lắng về 11 dòng bổ sung trong cấu hình của mình không?
nispio

Vâng, đây là một vài tháng trước, vì vậy tôi không nhớ suy nghĩ cụ thể của mình nhưng tôi nghi ngờ đó là cố gắng giảm thiểu số lượng công việc cần thiết khi tôi thêm hoặc trừ một gói khỏi danh sách được cài đặt tự động. Không muốn nhiều dòng được thêm vào tệp cho mỗi gói riêng biệt được cài đặt.
BH2017

Câu trả lời:


11

Cách dễ nhất là cài đặt use-package.

(package-initialize)
(require 'package)
(add-to-list 'package-archives
    '("melpa" . "http://melpa.milkbox.net/packages/") t)

(dolist (package '(use-package))
   (unless (package-installed-p package)
       (package-install package)))

Sau đó

 (use-package paredit
   :ensure t)

Đây :ensure tlà những gì đảm bảo rằng gói được cài đặt.

Để chỉ tải, đảm bảo nhiều gói được cài đặt

(dolist (package '(package-a package-b package-c))
 (unless (package-installed-p package)
   (package-install package))
   (require package))))

Bạn có thể chỉ định nhiều gói cho nó tải trên một dòng không?
BH2017

Nếu bạn có nghĩa là gói sử dụng thì không, nhưng biểu thức ở trên, có thể là
njdan5691

Vâng, câu hỏi của tôi là về nhiều gói, vì vậy hãy chỉnh sửa câu trả lời của bạn để nó thực hiện điều đó, tải và nếu không có, tự động cài đặt, nhiều gói.
BH2017

người chơi cá heo có thể được thay đổi thành '(gói sử dụng' một số gói khác), nhưng không thể thực hiện cấu hình nào khác. Tôi khuyên bạn nên có một dòng cho mỗi gói với gói sử dụng.
njdan5691

Tôi có hơn mười gói khác nhau được tải nên một giải pháp nhỏ gọn hơn sẽ được mong muốn.
BH2017

4

package.eltheo dõi các gói bạn yêu cầu cài đặt (trái ngược với các gói được cài đặt tự động dưới dạng phụ thuộc) trong biến tùy chỉnh package-selected-packages.

Vì vậy, nếu bạn sao chép ~/.emacs(trong đó Tùy chỉnh thường ghi các cài đặt như của package-selected-packages) sang hệ thống khác, tất cả những gì bạn cần làm là M-x package-install-selected-packages.

Tất nhiên, điều này không tự động cài đặt các gói nếu chúng vắng mặt, nhưng tôi coi đó là một tính năng (tôi nghĩ đó là một sai lầm đối với một chương trình như Emacs để thực hiện kết nối mạng mà không có yêu cầu rõ ràng để làm như vậy). Và nó giúp bạn tiết kiệm những rắc rối khi cài đặt từng gói một.


Cảm ơn. Tôi chỉ muốn chia sẻ trường hợp sử dụng của mình, khác với trường hợp của OP: Tôi thường chuyển các dotfiles của mình giữa các máy (đặc biệt là đám mây, nơi chúng được tạo ra và bị giết mọi lúc). Thư mục gói khá nặng, với elpy v-env và bồn rửa nhà bếp, đặc biệt là các phiên bản cũ không được tự động cắt, AFAIK. Dễ dàng thả một vài tệp nhỏ và cài đặt lại các gói hơn là mang chúng đi khắp nơi.
kkm

Tôi đã quên đề cập đến một điều: (package-refresh-contents)cần phải được gọi một lần trước (package-install-selected-packages)khi thư mục gói cục bộ bị thiếu hoàn toàn, để các thư mục lưu trữ phân phối gói được lưu trước trong thư mục con của thư mục archive/.
kkm
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.