Actualizar de forma no interactiva todos los paquetes

13

Quiero que mis emacs actualicen automáticamente todos los paquetes bajo ciertas condiciones.

¿Cuál es la mejor manera de hacer esto?

PythonNut
fuente
Aquí hay un comando para actualizar todos los paquetes obsoletos: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (reemplace todos paradoxcon package).
xuchunyang
@xuchunyang Ah. Veo que no se ve tan mal. Si respondes eso, lo aceptaría.
PythonNut

Respuestas:

9

No estoy seguro de que esto sea lo que quieres (no sé a qué te refieres con "bajo ciertas condiciones"), pero aquí hay una función que uso para actualizar todos los paquetes sin mostrar el *Packages*búfer, lo que me molesta cuando solo quiero para actualizar paquetes.

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

Esto está bien probado. También evita que aparezcan buffers de compilación.

Mark Karpov
fuente
Agradable. Voy a usar esto con una ligera variación que no aparece antes de actualizar los paquetes.
PythonNut
¿Hay alguna razón particular por la que lo hagas en (y-or-n-p (message ..))lugar de solo (y-or-n-p ...)?
PythonNut
@PythonNut, Bueno, necesito construir un mensaje rápido, no recuerdo por qué lo uso message, parece que también se puede hacer format.
Mark Karpov
Ah, sí. Me refería a usar format. Obviamente no puedes hacerlo sin ningún tipo de interpolación de cadenas.
PythonNut
8

Puede usar la actualización automática de paquetes .

Instalarlo por M-x package-install auto-update-package. Proporciona una función llamada auto-package-update-now. Puede escribir una ifcondición simple y agregarla a su .emacs.

(if your-condition
   (auto-package-update-now))
ChillarAnand
fuente
Hm ... lo tendré en cuenta, pero la idea es intentar reparar automáticamente los paquetes si están rotos. Dependiendo de un paquete, hacerlo es un poco absurdo. :-)
PythonNut
1

El paquete ahora se llama actualización automática del paquete. (Demasiada baja reputación para escribirlo como un comentario en la publicación de Chillar anterior).

(Copiado de su publicación y fusionado con esta respuesta):

Instalarlo por M-x package-install auto-package-update. Proporciona una función llamada auto-package-update-now. Puede escribir una condición if simple y agregarla a su ~/.emacs.

(if your-condition
   (auto-package-update-now))
Ricardo
fuente
He editado la respuesta de Chillar para corregir el nombre del paquete, creo que podemos eliminar este.
joelittlejohn