Package-autotoremove hangi paketlerin kaldırılacağına nasıl karar verir?


11

Güncel paketleri güncellerken veya gereksiz paketleri kaldırdığını iddia eden package-autotoremove komutunu çalıştırmak için sık sık sorulur. Ancak her zaman (bu eski paketlerle birlikte) kullandığım iki paketi kaldırıyor gibi görünüyor (aurora-teması, mevcut seçim temam ve dired +).

Korkarım Emacs-Lisp söz konusu olduğunda acemi bir şeyim ve sadece paket autoremove bu paketleri silmeyi durdurabilmenin bir yolu olup olmadığını merak ediyordum, bu yüzden onları yeniden yüklemeye devam etmedim.

Yanıtlar:


7

Kaynak burada: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Paket seçili paketlerde olmayan veya bağımlı olmayan tüm paketleri siler.

(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
Dolayısıyla bu kod, bir paket adı eklenirse otomatik package-selected-packagesolarak kaldırılmayacağı anlamına gelir.
zck

@zck Evet. Paket - çıkarılabilir paketler bunu yaptı.
jiegec

Ayrıca package-selected-packagespaketleri yükleyip kaldırdığınızda otomatik olarak güncellenen kayda değer . Genellikle doğrudan değiştirmenize gerek yoktur. Bir şeylerin otomatik olarak kaldırıldığını görürseniz, yüklediğiniz ve daha sonra kaldırdığınız bir şeyin bağımlılığı olarak alınan paketlerdir. Otomatik kaldırmayı desteklemeye ek olarak, bu değişken emacs yapılandırmanızı yeni bir makineye kopyaladığınızda ve kullanarak seçilen paketler listenizdeki her şeyi yüklemek istediğinizde kullanılabilir package-install-selected-packages.
glucas

1
@jiegec Kötü yazdığım nokta, kullanıcının sorununa çözümün ("paketlerin otomatik olarak kaldırılmasını nasıl önleyebilirim") "paketlerin eklenmesidir package-selected-packages.
zck

@zck Evet. Haklısın
jiegec
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.