Jak pakiet-autorove decyduje, które pakiety usunąć?

11

Często aktualizuje się moje aktualne pakiety, aby uruchomić pakiet-autorove, który twierdzi, że usuwa nieaktualne lub niepotrzebne pakiety. Jednak zawsze wydaje się, że usuwam (wraz z tymi nieaktualnymi pakietami) dwa pakiety, których używam (mianowicie motyw aurora, mój obecny motyw wyboru i dired +).

Obawiam się, że jestem nowicjuszem, jeśli chodzi o Emacsa-Lispa i zastanawiałem się, czy istnieje sposób, aby zatrzymać autora, który usunął te pakiety, więc nie musiałem ich ponownie instalować.

garbarnia
źródło

Odpowiedzi:

7

Źródło znajduje się tutaj: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Usuwa wszystkie pakiety, których nie ma w pakietach wybranych przez pakiet ani zależności.

(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
źródło
1
Zatem ten kod oznacza, że ​​jeśli nazwa pakietu zostanie dodana package-selected-packages, nie zostanie ona zapisana.
zck
@zck Tak. Zrobił to pakiet - pakiety wymienne.
jiegec
Warto również zauważyć, że package-selected-packagesjest aktualizowany automatycznie podczas instalowania i usuwania pakietów. Zasadniczo nie trzeba go modyfikować bezpośrednio. Jeśli widzisz, że rzeczy są automatycznie usuwane, prawdopodobnie są to pakiety, które zostały pobrane jako zależności czegoś, co zainstalowałeś, a następnie usunąłeś. Oprócz obsługi automatycznego usuwania, tej zmiennej można użyć, gdy kopiujesz konfigurację emacs na nową maszynę i chcesz zainstalować wszystko z listy wybranych pakietów, używając package-install-selected-packages.
glucas
1
@jiegec Moją słabą uwagą było to, że rozwiązaniem problemu użytkownika („jak mogę zapobiec tworzeniu się pakietów”) jest „dodaj pakiety do package-selected-packages.
zck
@zck Tak. Masz rację
jiegec