Bagaimana paket-autoremove memutuskan paket mana yang akan dihapus?

11

Saya sering diminta ketika memperbarui paket saya saat ini untuk menjalankan paket-autoremove yang mengklaim untuk menghapus paket yang sudah ketinggalan zaman atau tidak perlu. Namun sepertinya selalu menghapus (bersama dengan paket-paket yang sudah ketinggalan zaman) dua paket yang saya gunakan (yaitu aurora-theme, tema pilihan saya saat ini dan dired +).

Saya khawatir saya seorang pemula ketika datang ke Emacs-Lisp dan saya hanya ingin tahu apakah ada cara saya bisa menghentikan paket autoremove menghapus paket-paket ini sehingga saya tidak perlu terus menginstal ulang mereka.

tannart
sumber

Jawaban:

7

Sumbernya ada di sini: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Ini menghapus semua paket yang tidak ada dalam paket-paket yang dipilih atau ketergantungan.

(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)))
jiegec
sumber
1
Jadi kode ini berarti jika nama paket ditambahkan package-selected-packages, itu tidak akan dihapus secara otomatis.
zck
@ Ya Ya. Paket - paket yang dapat dilepas melakukan itu.
jiegec
Juga patut dicatat bahwa package-selected-packagesdiperbarui secara otomatis ketika Anda menginstal dan menghapus paket. Anda biasanya tidak perlu memodifikasinya secara langsung. Jika Anda melihat hal-hal yang dihapus secara otomatis mereka kemungkinan paket yang ditarik sebagai dependensi dari sesuatu yang Anda instal dan kemudian dihapus. Selain mendukung penghapusan otomatis, variabel ini dapat digunakan ketika Anda menyalin konfigurasi emacs Anda ke mesin baru dan ingin menginstal semuanya dalam daftar paket yang dipilih, menggunakan package-install-selected-packages.
glucas
1
@jiegec Maksud saya, ditulis dengan buruk, adalah bahwa solusi untuk masalah pengguna ("bagaimana cara mencegah paket dari autoremoved") adalah "tambahkan paket ke package-selected-packages.
zck
@ Ya Ya. Anda benar
jiegec