非交互式升级所有软件包


Answers:


9

我不确定这是否是您想要的(我不知道“在某些情况下”是什么意思),但是这是一个我用来升级所有软件包而不显示*Packages*缓冲区的函数,当我只想要它时我会感到烦恼升级软件包。

(defun package-upgrade-all ()
  "Upgrade all packages automatically without showing *Packages* buffer."
  (interactive)
  (package-refresh-contents)
  (let (upgrades)
    (cl-flet ((get-version (name where)
                (let ((pkg (cadr (assq name where))))
                  (when pkg
                    (package-desc-version pkg)))))
      (dolist (package (mapcar #'car package-alist))
        (let ((in-archive (get-version package package-archive-contents)))
          (when (and in-archive
                     (version-list-< (get-version package package-alist)
                                     in-archive))
            (push (cadr (assq package package-archive-contents))
                  upgrades)))))
    (if upgrades
        (when (yes-or-no-p
               (message "Upgrade %d package%s (%s)? "
                        (length upgrades)
                        (if (= (length upgrades) 1) "" "s")
                        (mapconcat #'package-desc-full-name upgrades ", ")))
          (save-window-excursion
            (dolist (package-desc upgrades)
              (let ((old-package (cadr (assq (package-desc-name package-desc)
                                             package-alist))))
                (package-install package-desc)
                (package-delete  old-package)))))
      (message "All packages are up to date"))))

这是很好的尝试。它还可以防止弹出编译缓冲区。


真好 我将使用此版本,并在升级软件包之前不进行提示。
PythonNut

有什么特别的原因(y-or-n-p (message ..))而不是你这样做(y-or-n-p ...)吗?
PythonNut

@PythonNut,嗯,我需要构造提示消息,现在我不记得为什么要使用message它了,似乎也可以做到format
Mark Karpov

是啊。我的意思是使用format。显然,没有任何类型的字符串插值就无法做到。
PythonNut

8

您可以使用auto-package-update

通过安装M-x package-install auto-update-package。它提供了一个名为的功能auto-package-update-now。您可以编写一个简单的if条件,并将其添加到您的中.emacs

(if your-condition
   (auto-package-update-now))

嗯...我会牢记这一点,但我们的想法是尝试自动修复已损坏的打包文件。依靠包装来做到这一点有点荒谬。:-)
PythonNut 2015年

1

现在,该程序包称为自动程序包更新。(声誉太低,无法将其写为上述Chillar帖子的评论)。

(从他的帖子复制并与此答案合并):

通过安装M-x package-install auto-package-update。它提供了一个名为的功能auto-package-update-now。您可以编写一个简单的if条件并将其添加到您的中~/.emacs

(if your-condition
   (auto-package-update-now))

我已经修改了Chillar的答案以更正软件包名称,我认为我们现在可以删除此软件包。
joelittlejohn
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.