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.