Wie entscheidet package-autoremove, welche Pakete entfernt werden sollen?

10

Ich werde häufig aufgefordert, meine aktuellen Pakete zu aktualisieren, um package-autoremove auszuführen, das behauptet, veraltete oder unnötige Pakete zu entfernen. Es scheint jedoch immer (zusammen mit diesen veralteten Paketen) zwei Pakete zu entfernen, die ich verwende (nämlich Aurora-Theme, mein aktuelles Thema der Wahl und dired +).

Ich fürchte, ich bin ein Neuling, wenn es um Emacs-Lisp geht, und ich habe mich nur gefragt, ob es eine Möglichkeit gibt, das Löschen dieser Pakete durch das automatische Entfernen von Paketen zu stoppen, damit ich sie nicht ständig neu installieren muss.

Tannart
quelle

Antworten:

6

Die Quelle ist hier: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Es werden alle Pakete gelöscht, die sich weder in paketausgewählten Paketen noch in einer Abhängigkeit befinden.

(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
quelle
1
Dieser Code bedeutet also, dass ein Paketname, der hinzugefügt package-selected-packageswird, nicht automatisch entfernt wird.
zck
@zck Ja. Das Paket - Wechselpakete hat das getan.
Jiegec
Beachten Sie auch, dass dies package-selected-packagesautomatisch aktualisiert wird, wenn Sie Pakete installieren und entfernen. Sie müssen es im Allgemeinen nicht direkt ändern. Wenn Sie sehen, dass Dinge automatisch entfernt werden, handelt es sich wahrscheinlich um Pakete, die als Abhängigkeiten von etwas, das Sie installiert und später entfernt haben, abgerufen wurden. Diese Variable unterstützt nicht nur das automatische Entfernen, sondern kann auch verwendet werden, wenn Sie Ihre Emacs-Konfiguration auf einen neuen Computer kopieren und alles in der Liste der ausgewählten Pakete mithilfe von installieren möchten package-install-selected-packages.
Glucas
1
@jiegec Mein schlecht geschriebener Punkt war, dass die Lösung für das Problem des Benutzers ("Wie verhindere ich, dass Pakete automatisch entfernt werden") "Hinzufügen der Pakete zu package-selected-packages.
zck
@zck Ja. Sie haben Recht
Jiegec