在Emacs中更新包
我有以下安装程序包(不知道是否有更好的build议):
(require 'package) (setq package-archives '(("ELPA" . "http://tromey.com/elpa/") ("gnu" . "http://elpa.gnu.org/packages/") ("marmalade" . "http://marmalade-repo.org/packages/"))) ; Apparently needed for the package auto-complete (why?) (add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t) (package-initialize) (setq url-http-attempt-keepalives nil)
我有三个与安装和更新软件包有关的问题。
Q1。 有没有更新可用软件包列表(和最新版本)并更新特定软件包的方法?
Q.2以下包装来源之间有什么区别?
- ELPA,
- GNU
- 果酱
- melpa
Q.3它们被添加到package-archives
的顺序是否重要?
-
我使用以下内容:
(when (not package-archive-contents) (package-refresh-contents))
做
package-list-packages
也会更新软件包列表。
您可以使用*Packages*
缓冲区中的U x来更新所有已安装的软件包。
-
ELPA是原创的。 我不认为这是真的保持了,但我不知道。 我不使用它。
GNU是“官方”的。 它与Emacs一起维护,这意味着事物应该始终工作,但更新和新包不会经常出现。
果酱基本上是一个网站,你可以上传一个完整的包,它会被添加到果酱回购。 你不只是提交一个链接到包的上游,它不完全自动完成包的创build。 我认为这是正确的,因为你不一定要跟踪上游。 不幸的是,它一直没有得到维护,但是最近有人接pipe了它,所以在某个时候它应该会恢复得更好。
Melpa需要一个URL,例如EmacsWiki lisp区域或github库,并从中自动构build一个包。 因此,通常最多不pipe它跟踪的是哪一天。 虽然它跟踪上游,但我从来没有在实践中遇到过问题,这是我的包大部分来自于。 也有Melpa稳定 ,这就像Melpa,但抓住了上游回购标签修订,而不是最新修订。 Melpa稳定比Melpa包装更less。
组织模式有它自己的
package.el
回购( http://orgmode.org/elpa/ )。所有的软件包回购工作都是一样的,你只要将它们添加到你的
package-archives
。这是一个更深入的关于这个问题的博客文章 ,我大多数人都同意。
-
我不确定,但是我认为,如果一个软件包在不同的仓库中被复制,那么仓库中软件仓库的顺序决定了优先级。 我不知道更高的优先级是在列表的开始还是结束。
更新:在Emacs 25中,可以使用一个variables
package-archive-priorities
priority来优先考虑你的软件包仓库(例如,比ELPA更喜欢MELPA)。
这里是我的init.el
的相关部分,如果你感兴趣的话:
(setq jpk-packages '( ac-dabbrev ... yasnippet )) (package-initialize) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) (add-to-list 'package-archives '("org" . "http://orgmode.org/elpa/")) ;; install any packages in jpk-packages, if they are not installed already (let ((refreshed nil)) (when (not package-archive-contents) (package-refresh-contents) (setq refreshed t)) (dolist (pkg jpk-packages) (when (and (not (package-installed-p pkg)) (assoc pkg package-archive-contents)) (unless refreshed (package-refresh-contents) (setq refreshed t)) (package-install pkg)))) (defun package-list-unaccounted-packages () "Like `package-list-packages', but shows only the packages that are installed and are not in `jpk-packages'. Useful for cleaning out unwanted packages." (interactive) (package-show-package-list (remove-if-not (lambda (x) (and (not (memq x jpk-packages)) (not (package-built-in-p x)) (package-installed-p x))) (mapcar 'car package-archive-contents))))
在Emacs中,使用Mx list-packages
列出将自动刷新存档内容的所有软件包。 之后使用U
来标记所有可升级的软件包进行升级, x
实际执行新的更新。 然后Emacs将获取并安装所有的升级,然后询问是否删除旧的,过时的版本。
你也可以看看Carton ,它提供了一个更方便的方式来pipe理你的包,通过在一个专门的文件中声明它们,并且包含一个方便的命令行客户端来自动安装和升级以这种方式声明的包。
package-archives
的顺序并不重要。 Emacs将所有归档的内容汇总到一个统一的可用包列表及其版本中,并存储在package-archive-contents
。
在package-install
,Emacs只需select最新版本的软件包,而不pipe源文件是什么。 为了更好地控制包裹来源,MELPA提供了melpa包裹 ,允许从指定的档案文件中黑名单或白名单包裹。
这更多是对jpkotta答案的一个扩展评论。
这是我正在为jpkotta上面的答案进行的一项调整:
(setq n 0) ; set n as 0 (dolist (pkg pkgs-2b-present) ; for each pkg in list (unless (or ; unless (package-installed-p pkg) ; pkg is installed or (assoc pkg ; pkg is in the archive list package-archive-contents)) (setq n (+ n 1)))) ; add one to n (when (> n 0) ; if n > 0, (package-refresh-contents)) ; refresh packages
(replace(when (not package-archive-contents) (package-refresh-contents))
)时。
软件包列表对于我的使用情况来说不够清爽。
我还没有考虑是否有更有效的解决办法来解决我的问题。 首先,我要看看这个调整是否会消失。
在docker:
emacs Mx list-packages
这将把你放在* packages *缓冲区中
shift-u x
emacs会问你(y / n),等待更新
Cx k <ret>
这将杀死*包*缓冲区,并返回到* scratch *
CxCc
这将退出emacs,并让你重新启动,但你可能需要debugging:(
emacs
我的2¢