在Emacs更新包(Updating packages in Emacs)

2019-07-19 18:55发布

我有包以下设置(不知道是否有更好的建议之一):

(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
  • 果酱
  • Melpo

Q.3不要紧,它们被添加到订单package-archives

Answer 1:

  1. 为了自动更新包的列表, 只有当没有包列表已经 ,使用以下命令:

     (when (not package-archive-contents) (package-refresh-contents)) 

    为了更新所有已安装的软件包,型package-list-packages ,这将带你到*Packages*缓冲液(也更新包的列表),然后UX。

    package-refresh-contents无条件地试图从已经添加到所有回购下载一个软件包列表package-archives ; package-archive-contents是不为零,如果你已经下载的软件包列表。

  2. ELPA是原来的。 我不认为这是真正维护了,但我不知道。 我不使用它。

    GNU是“官”。 它使用Emacs,这意味着事情应该总是工作,但更新和新的包不来经常一起维护。

    果酱基本上是一个网站,你可以上传一个完整的包,它会被添加到果酱回购。 你不只是提交一个链接到包的上游,它并不太完全自动化包的创建。 我认为这是正确的事情,因为你不一定要跟踪上游。 不幸的是,它已经没有维护了一段时间,但最近有人接手所以应该回来,更好地在某一点。

    Melpa需要一个URL到例如EmacsWiki口齿不清区域或GitHub库,并从它自动构建一个包。 因此,它通常是在最重要的是,每天不管背后是跟踪。 虽然它跟踪上游,我从来没有在实践中的问题,而这正是我的大部分包是从哪里来的。 还有Melpa稳定 ,这就好比Melpa但争夺标签上游回购,而不是最新版本的修订版。 Melpa稳定具有比Melpa包少。

    组织模式都有自己package.el回购( http://orgmode.org/elpa/ )。

    所有包回购的工作原理相同,你只需将它们添加到您的package-archives

    这里有一个更深入的博客文章关于这个问题上,我大多同意。

  3. 我不知道,但我想,如果一个软件被不同的回购复制,回购中出现的顺序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))))


Answer 2:

在Emacs中,使用Mx list-packages列出所有的包,它会自动刷新存档内容。 之后使用U ,以纪念所有升级包进行升级,而x实际执行新的更新。 Emacs就会获取并安装所有的升级,并询问你是否在事后删除旧的,过时的版本。

你也可能想看看纸箱它提供了在一个专用的文件,宣布他们来管理你的包一个更便捷的方式,并配有方便的命令行客户端自动安装和升级这种方式声明的包。


顺序package-archives 并不重要。 Emacs的聚合所有档案的内容转换成可用的软件包及其版本,存储在一个单一的连贯列表package-archive-contents

package-install ,Emacs会简单地选择一个软件包的最新版本,无论原始档案。 有关程序包原点更多的控制,MELPA提供melpa包 ,其允许黑-或从指定的存档白名单包。



Answer 3:

在终端:

emacs

M-x list-packages

这使您在*包*缓冲区

shift-u x

Emacs会问你(Y / N),等待更新

C-x k <ret>

这将杀死*包*缓冲区并返回回*从头*

C-x-C-c

这将退出Emacs,让您通过重新启动,但您可能需要调试:(

emacs

我的2¢



Answer 4:

这更多的是对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))

该软件包列表没有刷新足够频繁足够我用例。

如果有一个更有效的解决我的问题我还没有考虑; 第一,我已经看问题是否废除这一调整。



文章来源: Updating packages in Emacs
标签: emacs elpa