我有包以下设置(不知道是否有更好的建议之一):
(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什么是以下包源之间的区别?:
Q.3不要紧,它们被添加到订单package-archives
?
为了自动更新包的列表, 只有当没有包列表已经 ,使用以下命令:
(when (not package-archive-contents) (package-refresh-contents))
为了更新所有已安装的软件包,型package-list-packages
,这将带你到*Packages*
缓冲液(也更新包的列表),然后U型X。
package-refresh-contents
无条件地试图从已经添加到所有回购下载一个软件包列表package-archives
; package-archive-contents
是不为零,如果你已经下载的软件包列表。
ELPA是原来的。 我不认为这是真正维护了,但我不知道。 我不使用它。
GNU是“官”。 它使用Emacs,这意味着事情应该总是工作,但更新和新的包不来经常一起维护。
果酱基本上是一个网站,你可以上传一个完整的包,它会被添加到果酱回购。 你不只是提交一个链接到包的上游,它并不太完全自动化包的创建。 我认为这是正确的事情,因为你不一定要跟踪上游。 不幸的是,它已经没有维护了一段时间,但最近有人接手所以应该回来,更好地在某一点。
Melpa需要一个URL到例如EmacsWiki口齿不清区域或GitHub库,并从它自动构建一个包。 因此,它通常是在最重要的是,每天不管背后是跟踪。 虽然它跟踪上游,我从来没有在实践中的问题,而这正是我的大部分包是从哪里来的。 还有Melpa稳定 ,这就好比Melpa但争夺标签上游回购,而不是最新版本的修订版。 Melpa稳定具有比Melpa包少。
组织模式都有自己package.el
回购( http://orgmode.org/elpa/ )。
所有包回购的工作原理相同,你只需将它们添加到您的package-archives
。
这里有一个更深入的博客文章关于这个问题上,我大多同意。
我不知道,但我想,如果一个软件被不同的回购复制,回购中出现的顺序package-archives
决定优先顺序。 我不知道,如果更高的优先级是在列表的开头或结尾。
更新:在Emacs的25,有一个变量package-archive-priorities
,你可以用你的包优先回购(如喜欢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就会获取并安装所有的升级,并询问你是否在事后删除旧的,过时的版本。
你也可能想看看纸箱它提供了在一个专用的文件,宣布他们来管理你的包一个更便捷的方式,并配有方便的命令行客户端自动安装和升级这种方式声明的包。
顺序package-archives
并不重要。 Emacs的聚合所有档案的内容转换成可用的软件包及其版本,存储在一个单一的连贯列表package-archive-contents
。
在package-install
,Emacs会简单地选择一个软件包的最新版本,无论原始档案。 有关程序包原点更多的控制,MELPA提供melpa包 ,其允许黑-或从指定的存档白名单包。
在终端:
emacs
M-x list-packages
这使您在*包*缓冲区
shift-u x
Emacs会问你(Y / N),等待更新
C-x k <ret>
这将杀死*包*缓冲区并返回回*从头*
C-x-C-c
这将退出Emacs,让您通过重新启动,但您可能需要调试:(
emacs
我的2¢
这更多的是对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
(取代(when (not package-archive-contents) (package-refresh-contents))
该软件包列表没有刷新足够频繁足够我用例。
如果有一个更有效的解决我的问题我还没有考虑; 第一,我已经看问题是否废除这一调整。