Неінтерактивне оновлення всіх пакетів


13

Я хочу, щоб мої emacs автоматично оновлювали всі пакети за певних умов.

Який найкращий спосіб зробити це?


Ось команда для оновлення всіх застарілих пакетів: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (замінити всі paradoxна package).
xuchunyang

@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))

Хм ... Я маю це на увазі, але ідея полягає в тому, щоб спробувати автоматично виправити упаковані, якщо вони зламані. Залежно від упаковки це зробити, нібито безглуздо. :-)
PythonNut

1

Тепер пакет називається автоматичним оновленням пакунків. (Занадто низька репутація, щоб написати це як коментар до публікації Chillar вище).

(Скопійовано зі свого допису та з’єдналось із цією відповіддю):

Встановіть його M-x package-install auto-package-update. Він забезпечує функцію, що називається auto-package-update-now. Ви можете написати просту умову і додати її до своєї ~/.emacs.

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

Я відредагував відповідь Чіллара, щоб виправити назву пакета, ми можемо видалити цю тепер, я думаю.
joelittlejohn
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.