Как package-autoremove решает, какие пакеты удалить?

11

Меня часто просят обновить мои текущие пакеты для запуска package-autoremove, который утверждает, что удаляет устаревшие или ненужные пакеты. Однако, кажется, он всегда удаляет (вместе с этими устаревшими пакетами) два пакета, которые я использую (а именно aurora-theme, мою текущую тему по выбору и dired +).

Боюсь, что я новичок, когда дело доходит до Emacs-Lisp, и мне было просто интересно, можно ли как-нибудь остановить автоматическое удаление пакетов, удалив эти пакеты, поэтому мне не нужно было их переустанавливать.

tannart
источник

Ответы:

7

Источник находится здесь: https://github.com/emacs-mirror/emacs/blob/master/lisp/emacs-lisp/package.el#L2113 .

Он удаляет все пакеты, которых нет ни в package-selected-packages, ни в зависимости.

(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
источник
1
Таким образом, этот код означает, что если имя пакета будет добавлено package-selected-packages, оно не будет удалено автоматически.
zck
@zck Да. Пакет - съемные пакеты сделали это.
Jiegec
Также стоит отметить, что package-selected-packagesобновляется автоматически при установке и удалении пакетов. Как правило, вам не нужно изменять его напрямую. Если вы видите, что объекты автоматически удаляются, это скорее всего пакеты, которые были извлечены как зависимости от того, что вы установили, а затем удалили. В дополнение к поддержке автоматического удаления, эта переменная может использоваться, когда вы копируете конфигурацию emacs на новый компьютер и хотите установить все из списка выбранных пакетов, используя package-install-selected-packages.
glucas
1
@jiegec Моя точка зрения, плохо написанная, заключалась в том, что решение проблемы пользователя («как я могу предотвратить package-selected-packages
автоматическое удаление
@zck Да. Вы правы
jiegec