Aggiorna in modo non interattivo tutti i pacchetti


Risposte:


9

Non sono sicuro che questo sia quello che vuoi (non so cosa intendi per "in determinate condizioni"), ma ecco una funzione che uso per aggiornare tutti i pacchetti senza mostrare il *Packages*buffer, che trovo fastidioso quando voglio solo per aggiornare i pacchetti.

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

Questo è ben provato. Inoltre, impedisce ai buffer di compilazione di apparire.


Bello. Lo userò con una leggera variazione che non richiede prima di aggiornare i pacchetti.
PythonNut

C'è qualche motivo particolare per cui lo fai (y-or-n-p (message ..))invece di solo (y-or-n-p ...)?
PythonNut

@PythonNut, Beh, ho bisogno di costruire un messaggio rapido, non ricordo ora perché lo uso message, sembra che si possa fare formataltrettanto.
Mark Karpov,

Ah sì. Intendevo usare format. Ovviamente non puoi farlo senza alcun tipo di interpolazione di stringhe.
PythonNut

8

È possibile utilizzare l'aggiornamento automatico del pacchetto .

Installalo da M-x package-install auto-update-package. Fornisce una funzione chiamata auto-package-update-now. Puoi scrivere una ifcondizione semplice e aggiungerla alla tua .emacs.

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

Hm ... Lo terrò a mente, ma l'idea è di provare a riparare automaticamente i pacchetti se sono rotti. Dipendere da un pacchetto per farlo è un po 'insensato. :-)
PythonNut

1

Il pacchetto ora è chiamato aggiornamento automatico del pacchetto. (Reputazione troppo bassa per scriverlo come commento al post Chillar sopra).

(Copiato dal suo posto e unito a questa risposta):

Installalo da M-x package-install auto-package-update. Fornisce una funzione chiamata auto-package-update-now. Puoi scrivere una semplice condizione if e aggiungerla alla tua ~/.emacs.

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

Ho modificato la risposta di Chillar per correggere il nome del pacchetto, possiamo eliminarlo ora penso.
joelittlejohn,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.