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?

PythonNut
quelle
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.

Mark Karpov
quelle
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))
ChillarAnand
quelle
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))
Richard
quelle
Ich habe Chillars Antwort bearbeitet, um den Paketnamen zu korrigieren. Ich denke, wir können diese Antwort jetzt löschen.
Joelittlejohn