¿Cómo decide package-autoremove qué paquetes eliminar?


11

Frecuentemente se me solicita cuando actualizo mis paquetes actuales para ejecutar package-autoremove que dice eliminar paquetes obsoletos o innecesarios. Sin embargo, siempre parece eliminar (junto con esos paquetes obsoletos) dos paquetes que sí uso (a saber, aurora-theme, mi tema actual de elección y dired +).

Me temo que soy un poco novato cuando se trata de Emacs-Lisp y me preguntaba si había alguna forma de detener la eliminación automática de paquetes eliminando estos paquetes, por lo que no tuve que seguir reinstalando.

Respuestas:


7

La fuente está aquí: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Elimina todos los paquetes que no están en package-selected-packages ni una dependencia.

(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
Entonces, este código significa que si se agrega un nombre de paquete package-selected-packages, no se eliminará automáticamente.
zck

@zck Sí. El paquete - paquetes extraíbles hizo eso.
jiegec

También vale la pena señalar que package-selected-packagesse actualiza automáticamente cuando instala y elimina paquetes. Por lo general, no necesita modificarlo directamente. Si ve que las cosas se eliminan automáticamente, es probable que sean paquetes que se introdujeron como dependencias de algo que instaló y luego se eliminó. Además de admitir la eliminación automática, esta variable se puede usar cuando copia su configuración de emacs a una nueva máquina y desea instalar todo en la lista de paquetes seleccionados, utilizando package-install-selected-packages.
glucas

1
@jiegec Mi punto, mal escrito, fue que la solución al problema del usuario ("cómo evito que los paquetes se eliminen automáticamente") es "agregar los paquetes a package-selected-packages.
zck

@zck Sí. Tienes razón
jiegec
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.