Nieinteraktywnie zaktualizuj wszystkie pakiety

13

Chcę, aby emacs automatycznie aktualizował wszystkie pakiety pod pewnymi warunkami.

Jak najlepiej to zrobić?

PythonNut
źródło
Oto polecenie fo uaktualnić wszystkie przestarzałe pakiety: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (wymienić wszystkie paradoxz package).
xuchunyang
@xuchunyang Ah. Widzę, że to nie wygląda źle. Jeśli udzielisz tej odpowiedzi, zaakceptowałbym ją.
PythonNut

Odpowiedzi:

9

Nie jestem pewien, czy tego właśnie chcesz (nie wiem, co rozumiesz przez „pod pewnymi warunkami”), ale tutaj jest funkcja, której używam do aktualizacji wszystkich pakietów bez pokazywania *Packages*bufora, co wydaje mi się irytujące, kiedy chcę do aktualizacji pakietów.

(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"))))

To jest wypróbowane. Zapobiega również wyskakiwaniu buforów kompilacji.

Mark Karpov
źródło
Ładny. Użyję tego z niewielką odmianą, która nie wyświetla monitu przed aktualizacją pakietów.
PythonNut,
Czy jest jakiś konkretny powód, dla którego robisz to (y-or-n-p (message ..))zamiast po prostu (y-or-n-p ...)?
PythonNut,
@PythonNut, Cóż, muszę zbudować szybką wiadomość, nie pamiętam teraz, dlaczego używam message, wygląda na to, że można to zrobić formatrównie dobrze.
Mark Karpov,
O tak. Miałem na myśli używanie format. Oczywiście nie można tego zrobić bez interpolacji ciągów.
PythonNut
8

Możesz użyć automatycznej aktualizacji pakietu .

Zainstaluj przez M-x package-install auto-update-package. Zapewnia funkcję o nazwie auto-package-update-now. Możesz napisać prosty ifwarunek i dodać go do swojego .emacs.

(if your-condition
   (auto-package-update-now))
ChillarAnand
źródło
Hm ... Będę o tym pamiętać, ale chodzi o to, aby spróbować automatycznie naprawić pakiet, jeśli są zepsute. W zależności od pakietu jest to trochę nonsensowne. :-)
PythonNut
1

Pakiet nazywa się teraz automatyczną aktualizacją pakietu. (Zbyt niska reputacja, aby napisać to jako komentarz do powyższego postu w Chillar).

(Skopiowano z jego postu i scalono z tą odpowiedzią):

Zainstaluj przez M-x package-install auto-package-update. Zapewnia funkcję o nazwie auto-package-update-now. Możesz napisać prosty warunek if i dodać go do swojego ~/.emacs.

(if your-condition
   (auto-package-update-now))
Richard
źródło
Zedytowałem odpowiedź Chillar, aby poprawić nazwę pakietu, myślę, że możemy ją teraz usunąć.
joelittlejohn