在Emacs中更新包

Ame*_*ina 136 emacs elpa

我有以下设置包(不确定是否有更好的推荐):

(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)
Run Code Online (Sandbox Code Playgroud)

我有三个与安装和更新包有关的问题.

Q1.有没有办法更新可用包列表(和最新版本)并更新特定包?

Q.2以下包源有什么区别?:

  • ELPA,
  • GNU
  • 果酱
  • melpa

Q.3它们的添加顺序是否重要package-archives

jpk*_*tta 155

  1. 为了自动更新软件包列表,仅当没有软件包列表时,请使用以下命令:

    (when (not package-archive-contents)
        (package-refresh-contents))
    
    Run Code Online (Sandbox Code Playgroud)

    要更新所有已安装的软件包,请键入package-list-packages,这将转到*Packages*缓冲区(并更新软件包列表),然后键入U x.

    package-refresh-contents无条件地尝试从您添加到的所有存储库中下载包列表package-archives; package-archive-contents如果您已下载包列表,则为非零.

  2. ELPA是原创的.我认为它不再维持,但我不确定.我不使用它.

    GNU是"官方的".它与Emacs一起维护,这意味着事情应该始终有效,但更新和新包装不会经常出现.

    Marmalade基本上是一个网站,你可以上传一个完整的包,它将被添加到橘子酱回购.您不仅要提交包的上游链接,而且还不能完全自动创建包.我认为这是正确的事情,因为你不一定想跟踪上游.不幸的是,它已经有一段时间没有维护了,但是有人最近接受了它,所以它应该在某些时候恢复并且更好.

    Melpa将URL作为例如EmacsWiki lisp区域或github repo,并从中自动构建包.因此,通常最多只追踪它追踪的一天.虽然它跟踪上游,但我在实践中从未遇到过问题,而这正是我的大多数软件包所在的地方.还有Melpa Stable,就像Melpa一样,但是抓住了上游回购的标记版本,而不是最新版本.Melpa稳定包装比Melpa少.

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

    所有的包repos都是一样的,你只需将它们添加到你的package-archives.

    这是一篇关于这个主题的更深入的博客文章,我大多同意这一点.

  3. 我不确定,但我认为如果一个包在不同的回购中重复,那么repos出现的顺序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))))
Run Code Online (Sandbox Code Playgroud)

  • 每次启动emacs时,条件都会阻止刷新(我通常只希望它在我告诉它时检查).它仅检查是否没有包存档,这应该是我第一次将配置克隆到新计算机时的情况. (3认同)
  • 谢谢!`什么时候(不是包 - 档案内容)`检查? (2认同)

lun*_*orn 96

在Emacs中,用于M-x list-packages列出将自动刷新存档内容的所有包.然后使用U标记要升级的所有可升级包,并x实际执行新更新.然后,Emacs将获取并安装所有升级,并询问您之后是否删除旧的,过时的版本.

您可能还想看一下Carton,它通过在专用文件中声明它们来提供更方便的方法来管理您的包,并且包括一个方便的命令行客户端来自动安装和升级以这种方式声明的包.


的顺序package-archives没有关系.Emacs将所有存档的内容聚合到一个连贯的可用包及其版本列表中,并存储在其中package-archive-contents.

package-install此之后,无论原始档案如何,Emacs都会选择最新版本的软件包.为了更好地控制包装原产地,MELPA提供了melpa包,允许从指定的档案中包装黑名单或白名单.

  • @mcb嗯,这就是为什么我写了一个大写的U. (6认同)
  • 更确切地说是Su。 (2认同)
  • 我的意思是"Shift-u". (2认同)

rez*_*its 20

在终端:

emacs

M-x list-packages
Run Code Online (Sandbox Code Playgroud)

这会让你进入*packages*缓冲区

shift-u x
Run Code Online (Sandbox Code Playgroud)

emacs会问你(是/否),等待更新

C-x k <ret>
Run Code Online (Sandbox Code Playgroud)

这将杀死*packages*缓冲区并返回*scratch*

C-x-C-c
Run Code Online (Sandbox Code Playgroud)

这将退出emacs,让你重新启动,但你可能要调试:(

emacs
Run Code Online (Sandbox Code Playgroud)

我2¢