怎样快速找到 elpa 目录下那些重复的包

旧的包放在一块,都在列表尾部,~标记删除,然后x就行了。

还是说。。有什么神奇的需求?

2 个赞

要同时删除旧的和新的,或者至少要删除新的,因为问题的前提是新的包解压出来有问题,而不是更新以后怎么删除旧包。

这不是我说的重点啊。重复的包名已经列出来了,怎么操作方法就随意了。你也可以选中区域,执行 shell 命令之类的。package.el 已经有这部分的功能了,只依赖于 Emacs,可移植性也好啊。

没想到我的贴居然把大神给炸出来了 :laughing: 。确实不知道 package.el 还有这样的用法,多谢提醒。package.el 虽然好,但是国内的网络环境下,我每次 list-packages 都得等至少半分钟,所以我只在必须的时候才 list-packages,上面勾选答案的 shell 命令也算是一种折衷的办法。

选择几个不连续的行有什么方便快的办法吗。


用脚本还可以做定时任务,不用每次都打开 list-package 删。

我也从来没注意到 list-packages 会列出重复的包。

list-packages 确实很慢,即便加上 no-fetch 依然很慢。因为它做了太多工作,查找重复只是其中很小的一部分,并且最后输出结果未必是你想要的形式

如果只想找出重复的包,自己迭代 package-alist 或许是更好的选择:

(car package-alist)
;; => 
;; (youdao-dictionary
;;  #s(package-desc
;;     youdao-dictionary
;;     (20170226 49)
;;     "Youdao Dictionary interface for Emacs"
;;     ((popup (0 5 0))
;;      (pos-tip (0 4 6))
;;      (chinese-word-at-point (0 2))
;;      (names (0 5))
;;      (emacs (24))) nil nil "~/.emacs.d/elpa-26.0.50/youdao-dictionary-20170226.49" ((:keywords "convenience" "chinese" "dictionary")
;;      (:url . "https://github.com/xuchunyang/youdao-dictionary.el")
;;      (:commit . "44548f56a1c736e6a7fae4546657bff0a94bf3cb")) nil))

Update:

我不确定 package-alist 是否包含所有必要的信息,更多可以参考 package-menu--refresh 函数,里边还用到其它跟包相关的 list。

前面(查找 emacs package)的方法不完善,只能打印出一项重复(过时)的条目:

#+BEGIN_SRC sh
# packages=$(/bin/ls ~/.emacs.d/elpa-26.0.50)
packages="s-20171102.225
s-20171102.226
s-20171102.227"
echo "$packages" | \
    sort | \
    gsed -E 's/^(.*)(-20[0-9]*\.[0-9]*)$/\2,\1/' | \
    column -t -s ',' | \
    uniq -d -f 1 | \
    awk '{print $2$1}'
#+END_SRC

#+RESULTS:
: s-20171102.225

改进后的脚本:

#+BEGIN_SRC bash :results output
# packages=$(/bin/ls ~/.emacs.d/elpa-26.0.50)
packages="s-20171102.225
s-20171102.226
s-20171102.227"

join -v 1 <(printf "$packages" | sort) <(printf "$packages" | \
    sort -r | \
    gsed -E 's/^(.*)(-20[0-9]*\.[0-9]*)$/\2,\1/' | \
    column -t -s ',' | \
    uniq -d -f 1 | \
    awk '{print $2$1}' | sort)
#+END_SRC

#+RESULTS:
: s-20171102.225
: s-20171102.226
2 个赞

装package-utils, 执行package-utils-upgrade-all, 会自动删除所有旧版本