Làm thế nào để gói tự động quyết định loại bỏ các gói?


11

Tôi thường xuyên được nhắc nhở khi cập nhật các gói hiện tại của mình để chạy gói tự động, yêu cầu xóa các gói lỗi thời hoặc không cần thiết. Tuy nhiên, nó dường như luôn loại bỏ (cùng với các gói lỗi thời đó) hai gói mà tôi sử dụng (cụ thể là aurora-theme, chủ đề hiện tại của tôi về sự lựa chọn và được chuyển hướng +).

Tôi sợ tôi là một người mới khi nói đến Emacs-Lisp và tôi chỉ tự hỏi liệu có cách nào để tôi có thể dừng gói tự động xóa các gói này không nên tôi không cần phải cài đặt lại chúng.

Câu trả lời:


7

Nguồn ở đây: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Nó xóa tất cả các gói không nằm trong gói được chọn-gói cũng không phụ thuộc.

(defun package-autoremove ()
"Remove packages that are no more needed.
        Packages that are no more needed by other packages in
        `package-selected-packages' and their dependencies
        will be deleted."
(interactive)
;; If `package-selected-packages' is nil, it would make no sense to
;; try to populate it here, because then `package-autoremove' will
;; do absolutely nothing.
(when (or package-selected-packages
            (yes-or-no-p
            (format-message
            "`package-selected-packages' is empty! Really remove ALL packages? ")))
    (let ((removable (package--removable-packages)))
    (if removable
        (when (y-or-n-p
                (format "%s packages will be deleted:\n%s, proceed? "
                        (length removable)
                        (mapconcat #'symbol-name removable ", ")))
            (mapc (lambda (p)
                    (package-delete (cadr (assq p package-alist)) t))
                removable))
        (message "Nothing to autoremove")))))

(defun package--removable-packages ()
  "Return a list of names of packages no longer needed.
These are packages which are neither contained in
`package-selected-packages' nor a dependency of one that is."
  (let ((needed (cl-loop for p in package-selected-packages
                         if (assq p package-alist)
                         ;; `p' and its dependencies are needed.
                         append (cons p (package--get-deps p)))))
    (cl-loop for p in (mapcar #'car package-alist)
             unless (memq p needed)
             collect p)))

1
Vì vậy, mã này có nghĩa là nếu một tên gói được thêm vào package-selected-packages, nó sẽ không được tự động ghi.
zck

@zck Vâng. Gói - gói có thể tháo rời đã làm điều đó.
jiegec

Cũng đáng lưu ý rằng package-selected-packagesđược cập nhật tự động khi bạn cài đặt và gỡ bỏ các gói. Bạn thường không cần phải sửa đổi nó trực tiếp. Nếu bạn thấy mọi thứ đang được tự động xóa, chúng có khả năng là các gói được kéo vào như phần phụ thuộc của thứ bạn đã cài đặt và sau đó được gỡ bỏ. Ngoài việc hỗ trợ tự động xóa, biến này có thể được sử dụng khi bạn sao chép cấu hình emacs của mình sang một máy mới và muốn cài đặt mọi thứ trong danh sách gói đã chọn, sử dụng package-install-selected-packages.
glucas

1
@jiegec Quan điểm của tôi, được viết kém, đó là giải pháp cho vấn đề của người dùng ("làm cách nào để ngăn các gói không bị tự động") là "thêm các gói vào package-selected-packages.
zck

@zck Vâng. Bạn đã đúng
jiegec
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.