autoremove卸载很多有用的包……

今天升级包的时候,emacs提醒我有170多个没用的包可以用package-autoremove自动卸载,但是我发现那些包全是有用的…… 这个·autoremove到底以什么作为“可以卸载”或者说“没用”的标准?

(custom-set-variables package-selected-packages ;;这个变量 )

用户安装的包会放在 package-selected-packages 中,除此之外的包就属于“没用”的包。跟 apt-get autoremove 的意思类似。

这个变量的值是 Emacs 自动维护的,也就是说它的值会在你安装(如 package-install)和卸载(如 package-delete)时自动更新。这个变量的值使用 Custom File (custom-file) 存储。

我自己也有更你同样的问题,我猜测是因为我把 custom-file 的设置放在了 init.el 的末尾。正确的做法是把它放到开头。因为 package-install 之前 custom-file 必须已经设置好了,否则 package-selected-packages 的值就不能存储下了。另外之后需要把所有的包重新安装一遍,或者自己调整 package-selected-packages,注意不要忘记把它保存到 custom-file 里面,比如我用 use-package:ensure 来安装包,我可以执行下面的 Advice,然后把 init.el 重新执行一遍就好了。

(define-advice use-package-ensure-elpa (:before (&rest r) fill-selected)
  "Make sure :ensure fill `package-selected-packages'."
  (add-to-list 'package-selected-packages (car r))
  (customize-save-variable 'package-selected-packages package-selected-packages))

不清楚你的情况是否与我的相同?

刚刚发现还要放在 Package 初始化之后,不然用 Custom 设置的主题启动时不会应用

(setq package-archives
      '(("gnu"    . "http://elpa.emacs-china.org/gnu/")
        ("melpa"  . "http://elpa.emacs-china.org/melpa/")))

(package-initialize)

(setq custom-file (locate-user-emacs-file "custom.el"))
(load custom-file :no-error)

;; 其它设定 ...
1 个赞

所以定义和load custom-file 都要放到开头?

对这个问题没什么印象了,而且现在看起来我前面的理由也不靠谱,虽然 package-install 会用到 custom-file ,但应该不管位置在哪里 (package--save-selected-packages)

你自己关心的话,可以亲自试试。

也遇到了这个问题,可以用package--user-selected-p替换package-installed-p解决