Aktualisieren Sie nicht interaktiv alle Pakete


13

Ich möchte, dass mein Emacs unter bestimmten Bedingungen alle Pakete automatisch aktualisiert.

Wie geht das am besten?


Hier ist ein Befehl zum Upgrade aller veralteten Pakete: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (alle ersetzen paradoxdurch package).
Xuchunyang

@ Xuchunyang Ah. Ich sehe, das sieht nicht schlecht aus. Wenn Sie das beantworten, würde ich es akzeptieren.
PythonNut

Antworten:


9

Ich bin nicht sicher, ob Sie dies möchten (ich weiß nicht, was Sie unter „bestimmten Bedingungen“ verstehen), aber hier ist eine Funktion, mit der ich alle Pakete aktualisiere, ohne den *Packages*Puffer anzuzeigen, was ich ärgerlich finde, wenn ich nur möchte Pakete zu aktualisieren.

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

Das ist gut erprobt. Außerdem wird verhindert, dass Kompilierungspuffer angezeigt werden.


Nett. Ich werde dies mit einer kleinen Variation verwenden, die vor dem Upgrade der Pakete nicht abgefragt wird.
PythonNut

Gibt es einen bestimmten Grund, warum Sie das tun, (y-or-n-p (message ..))anstatt nur (y-or-n-p ...)?
PythonNut

@PythonNut, Nun, ich muss eine Aufforderungsnachricht erstellen, ich erinnere mich jetzt nicht, warum ich sie verwende message, es scheint, als ob es formatgenauso gut geht.
Mark Karpov

Ah ja. Ich meinte mit format. Natürlich können Sie dies nicht ohne eine Art String-Interpolation tun.
PythonNut

8

Sie können die automatische Paketaktualisierung verwenden .

Installieren Sie es durch M-x package-install auto-update-package. Es bietet eine Funktion namens auto-package-update-now. Sie können eine einfache ifBedingung schreiben und diese Ihrer hinzufügen .emacs.

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

Hm ... ich werde das im Hinterkopf behalten, aber die Idee ist, automatisch zu reparieren, wenn sie kaputt sind. Abhängig von einem Paket ist das irgendwie unsinnig. :-)
PythonNut

1

Das Paket wird jetzt als automatische Paketaktualisierung bezeichnet. (Zu geringes Ansehen, um es als Kommentar zum obigen Beitrag von Chillar zu schreiben.)

(Von seinem Beitrag kopiert und mit dieser Antwort zusammengeführt):

Installieren Sie es durch M-x package-install auto-package-update. Es bietet eine Funktion namens auto-package-update-now. Sie können eine einfache if-Bedingung schreiben und diese Ihrer hinzufügen ~/.emacs.

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

Ich habe Chillars Antwort bearbeitet, um den Paketnamen zu korrigieren. Ich denke, wir können diese Antwort jetzt löschen.
Joelittlejohn
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.