package-autoremove 如何配合 use-package 使用 ?

最近使用 use-package 来配置 Emacs,但发现配置第一次安装的包会自动加入到 custom.el 中。但是,当在配置中添加新的包后,重启 Emacs,这时新的包会正常安装,但是执行 package-autoremove 会删除这个新的包。 。

以前用 Purcell 的配置是这样设置是可以正常使用 package-autoremovehttps://github.com/purcell/emacs.d/blob/master/lisp/init-elpa.el#L67

如果也给 use-package 加一个 advice 是可以实现的,不知道使用 use-packge 的用户是否有其他方法?

1赞

原来这里已经有一个issue:

我现在用 straight.el 管理包。虽然很占空间,还有时“便秘”,但安装、升级、删除等都几乎不用操心。配合 use-package 或者 leaf 一起用,目前感觉还行。

美中不足的是目前只能删除repos的文件,build的文件还不能通过命令删除。有人提了issue,代码也写出来了,作者说后续会考虑添加进去。

1赞

build好像能删吧,我用的是straight的master分支,好像有一个 M-x straight-prune-build之类的

以前用过 submodule 的方案,我现在是尽量不用 submodule,主要是因为我的网络问题,没法成功设置 ssh 也走代理。

哦哦,原来还有这function,我之前google的时候看到相关的issue,以为还不能删除build。谢谢提醒~

我觉得用use-package + straight蛮好的,统一通过git安装,管理起来也方便。

主要是我网络不给力,本来也是打算这个方案。因为有一些猫哥写的包(比如 auto-save等)都是不在 melpa上的,用 straight 就很不错。

对呀 我就是看重这点,强迫症患者表示很受用 :rofl:

我是和同学在某宝买了gcp的帐号,200三个月,自己搭stair。自己管理的,比较有保障,速度稳定性都很好。

低调 低调 :smile:

:joy: :joy: :joy:低调低调

临时解决方案:新加包到 use-package 后,手动 C-x C-e ,然后这个包就会自动添加到 custom.elpackage-selected-packages 列表了,这时 package-autoremove 就正常工作了。

在 .gitconfig 里面设置:

[url "https://github.com.cnpmjs.org/"]
        insteadOf = https://github.com/

还能勉强对付。

2赞

我记的gcp的账号有免费3个月,这也能用来挣钱啊

通过下面的代码片段,现在这个问题可以完美解决了,只要是 ensure: t 的包都不会删除,并且会在启动完成后自动把 use-package 安装的包都添加到 custom.el 中。

注意:这个代码片段要放在第一次使用 use-package 之前。

;; package.el updates the saved version of package-selected-packages correctly only
;; after custom-file has been loaded, which is a bug. We work around this by adding
;; the required packages to package-selected-packages after startup is complete.
;; Make `package-autoremove' work with `use-package'

(defvar use-package-selected-packages '(use-package)
  "Packages pulled in by use-package.")

(eval-and-compile
  (define-advice use-package-handler/:ensure (:around (fn name-symbol keyword args rest state) select)
    (let ((items (funcall fn name-symbol keyword args rest state)))
      (dolist (ensure args items)
        (let ((package
               (or (and (eq ensure t) (use-package-as-symbol name-symbol))
                   ensure)))
          (when package
            (when (consp package)
              (setq package (car package)))
            (push `(add-to-list 'use-package-selected-packages ',package) items)))))))

(when (fboundp 'package--save-selected-packages)
  (add-hook 'after-init-hook
            (lambda ()
              (package--save-selected-packages
               (seq-uniq (append use-package-selected-packages package-selected-packages))))))