Sử dụng gói.el để cài đặt và cập nhật nhưng sử dụng gói để tải và định cấu hình


15

Sau khi tìm hiểu gần đây, use-packagetôi quyết định chuyển cấu hình của mình sang nó nhưng thấy mình không muốn từ bỏ sự tiện lợi của việc sử dụng package.elđể cài đặt các gói và giữ cho chúng được cập nhật. Tôi đã tìm thấy một chút khó khăn để kết hợp use-packagepackage.el.

Tôi thường quan tâm đến việc tìm hiểu cách mọi người kết hợp use-packagevới package.elhệ thống, nhưng đối với một câu hỏi cụ thể hơn, hãy tiếp tục đọc.

Đây là những gì tôi muốn:

  1. Để có các gói được cài đặt bởi trình quản lý gói để tôi có thể dễ dàng duyệt các gói và cập nhật chúng qua list-packages.
  2. Để cấu hình và tải các gói độc quyền thông qua use-package, vì vậy tôi có thể dễ dàng nhìn thấy trong tệp init của mình chính xác những gì tôi đang tải và cách nó được cấu hình.
  3. Tùy chọn, tôi muốn cũng có thể cài đặt các gói thông qua use-package's :ensuretừ khóa.

Nếu tôi hiểu chính xác tôi muốn rất ít về những gì package-initializenó làm, về cơ bản chỉ là cách nó thiết lập load-path. Hiện tại tôi có cái này trong cấu hình của mình:

;(package-initialize)
(setq package-enable-at-startup nil)
(let ((default-directory "~/.emacs.d/elpa"))
  (normal-top-level-add-subdirs-to-load-path))
(require 'use-package)

Dòng đầu tiên, được nhận xét, vì vậy Emacs 25 không hữu ích khi thêm (package-initialize)tệp init của tôi. Bit với normal-top-level-add-subdirs-to-load-pathlà một xấp xỉ với những gì package-initializesẽ làm cho load-path, một xấp xỉ có vẻ đủ tốt.

Điều này dường như đạt được mong muốn của tôi 1 và 2, nhưng không phải 3. Nếu tôi cố gắng sử dụng :ensure, tôi nhận được một thông báo lỗi nói rằng package.elkhông được khởi tạo. Gọi điện package-initializesẽ khắc phục điều đó, nhưng tôi muốn tránh điều đó vì a) Tôi không muốn tất cả vô số tải tự động được tải (tôi thích sử dụng use-packageđể tạo chính xác các tải tự động tôi cần) và b) Tôi muốn có thể dễ dàng tránh tải một số gói được cài đặt bất cứ khi nào tôi muốn (dễ thực hiện use-package).

Có ai có một đề nghị cho làm thế nào để làm điều này?

Câu trả lời:


11

IIUC những gì bạn muốn làm là:

(package-initialize t)

Lưu ý tđối số, đó là chìa khóa cho hạnh phúc của bạn ở đây vì nó sẽ (hoặc ít nhất là) khởi tạo gói.el mà không kích hoạt tất cả các gói đã cài đặt.


1
Điều này trả lời câu hỏi của tôi, mặc dù bây giờ tôi đang nghiêng về việc sử dụng package-initializenó để trả lời câu hỏi của tôi.
Omar

15

Với cấu hình hiện tại của bạn, bạn đã hiệu hóa gói.el một cách hiệu quả , vì bạn không khởi chạy trình quản lý gói và ngăn Emacs tự động khởi chạy nó. Tất cả những gì bạn làm để đáp lại là thêm ELPA vào load-path, nhưng đó chỉ là một tập hợp con nhỏ của gói.el làm gì. Tôi không chắc tại sao bạn làm vậy, nhưng đó không phải là thiết lập mà tôi khuyên dùng.

Cụ thể, bạn sẽ không nhận được gói tự động tải theo cách tiếp cận của mình, điều đó có nghĩa là ban đầu sẽ không có lệnh nào từ gói nào có sẵn.

Nói cách khác, M-xsẽ chỉ cung cấp cho bạn các lệnh tích hợp. Để thêm các lệnh từ các gói của bạn, bạn phải thêm các :commandsđịnh nghĩa rõ ràng vào tất cả các use-packagekhai báo của mình , điều này gây ra rất nhiều nỗ lực bảo trì. .


Kết hợp use-packagevới pack.el thực sự rất đơn giản, toàn bộ thiết lập dựa trên sự kết hợp này, nhưng tốt hơn hết là hãy để pack.el thực sự làm việc của mình. Chỉ cần khởi tạo gói.el ngay từ đầu tệp init của bạn:

(require 'package)
(setq package-enable-at-startup nil)   ; To prevent initialising twice
(add-to-list 'package-archives '("melpa" . "https://stable.melpa.org/packages/"))

(package-initialize)

Để thuận tiện, sau đó bạn có thể muốn bootstrap use-package, nếu nó chưa được cài đặt:

(unless (package-installed-p 'use-package)
  (package-refresh-contents)
  (package-install 'use-package))

Điều này cho phép bạn bắt đầu một phiên Emacs trên một hệ thống mới và init.el của bạn sẽ tự động cài đặt use-package.

Cuối cùng, bạn cần tải use-package:

(eval-when-compile
  (require 'use-package))

Bây giờ bạn có thể sử dụng use-packageđể cài đặt và cấu hình các gói:

(use-package magit                      ; The one and only Git frontend
  :ensure t
  :bind (("C-c v c" . magit-clone)
         ("C-c v v" . magit-status)
         ("C-c v g" . magit-blame)
         ("C-c v l" . magit-log-buffer-file)
         ("C-c v p" . magit-pull))
   :config (setq magit-save-repository-buffers 'dontask))

Khi Emacs bây giờ đánh giá biểu mẫu này trong khi khởi động, use-packagesẽ kiểm tra xem Magit đã được cài đặt chưa, và tự động cài đặt nó nếu cần thiết.


3
"Tôi không chắc tại sao bạn lại làm như vậy": lý do duy nhất tôi có thể thấy là về thời gian khởi động: package-initializemất một thời gian để điền đường dẫn, xác định tự động tải và thực hiện phần còn lại của công cụ. Tôi nghĩ rằng tôi đã đọc ở đâu đó rằng chính Jon Wiegley (tác giả của use-package) thích tuyên bố tất cả các lệnh được tải tự động trong use-packagekhổ thơ hơn là dựa vào package.el.
ffevotte

Lần trước tôi trông anh ấy không sử dụng pack.el chút nào, và trong mọi trường hợp, tôi không nghĩ bạn sẽ đạt được nhiều. Bạn cần phải điền load-pathvà thêm tự động tải trong cả hai trường hợp, cho dù thông qua use-packagehoặc thông qua package.el. Tôi nghi ngờ rằng có một sự khác biệt có thể đo lường được, đặc biệt nếu bạn có một hệ thống hiện đại với đĩa nhanh.
lunaryorn

3
Đã đồng ý. Tôi đã tự mình tính thời gian. Với một đĩa nhanh, bạn thực sự không thấy nhiều sự khác biệt. Với một đĩa chậm, khởi động có thể chậm hơn đáng kể (tương tự 0,2 giây) với package-initializemột danh sách tùy chỉnh trong load-path. Tôi gán cái này cho "thăm dò" hệ thống tập tin package.el. Tuy nhiên, tôi không bao giờ đo bất kỳ sự khác biệt đáng kể nào về hiệu suất giữa việc tải các autoloadđịnh nghĩa từ các tệp và có chúng trong các use-packagekhổ thơ.
ffevotte

Vâng, tôi sẽ không nói rằng tôi đã bị vô hiệu hóa các package.elhệ thống, tôi muốn nói rằng tôi chỉ tàn tật package-initialize! Lý do là trong khi tôi muốn list-packagesduyệt các gói mới và đặc biệt để cập nhật tất cả các gói hiện đang cài đặt của mình, tôi nghĩ rằng tôi thích tải mục tiêu hơn use-package. Đối với tôi chỉ có tự động tải cho các lệnh tôi sử dụng âm thanh như một điều tốt!
Omar

1
@ OmarAntolín-Camarena Tại sao không? Tự động tải về cơ bản là giao diện chung của gói hướng tới người dùng và kể từ gói.el trở thành cách phân phối gói tiêu chuẩn mà chúng ta có thể dựa vào sự hiện diện của chúng.
lunaryorn
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.