Неинтерактивно обновлять все пакеты

13

Я хочу, чтобы мои emacs автоматически обновляли все пакеты при определенных условиях.

Какой лучший способ сделать это?

PythonNut
источник
Вот команда для обновления всех устаревших пакетов: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (заменить все paradoxна package).
Сюйчунян
@xuchunyang Ах. Я вижу, это выглядит не так уж плохо. Если вы сделаете это ответ, я бы принял это.
PythonNut

Ответы:

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также.
Марк Карпов
О да. Я имел в виду использование format. Очевидно, что вы не можете сделать это без какой-либо интерполяции строк.
PythonNut
8

Вы можете использовать автоматическое обновление пакета .

Установите это M-x package-install auto-update-package. Он предоставляет функцию под названием auto-package-update-now. Вы можете написать простое ifусловие и добавить его к своему .emacs.

(if your-condition
   (auto-package-update-now))
ChillarAnand
источник
Хм ... я учту это, но идея состоит в том, чтобы попытаться автоматически исправить упакованные пакеты, если они сломаны. В зависимости от пакета сделать это немного бессмысленно. :-)
PythonNut
1

Пакет теперь называется автоматическим обновлением пакета. (Слишком низкая репутация, чтобы написать это как комментарий к посту Chillar выше).

(Скопировано из его поста и объединено с этим ответом):

Установите это M-x package-install auto-package-update. Он предоставляет функцию под названием auto-package-update-now. Вы можете написать простое условие if и добавить его к своему ~/.emacs.

(if your-condition
   (auto-package-update-now))
Ричард
источник
Я отредактировал ответ Чиллара, чтобы исправить имя пакета, я думаю, что теперь мы можем удалить этот.
Joelittlejohn