Atualizar de maneira não interativa todos os pacotes

13

Quero que o meu emacs atualize automaticamente todos os pacotes sob certas condições.

Qual é a melhor maneira de fazer isso?

PythonNut
fonte
Aqui está um comando para atualizar todos os pacotes desatualizados: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (substitua todos paradoxpor package).
xuchunyang
@xuchunyang Ah. Vejo que não parece tão ruim. Se você der uma resposta, eu aceitaria.
precisa saber é o seguinte

Respostas:

9

Não tenho certeza de que é isso que você deseja (não sei o que você quer dizer com "sob certas condições"), mas aqui está uma função que eu uso para atualizar todos os pacotes sem mostrar *Packages*buffer, o que acho irritante quando eu só quero para atualizar pacotes.

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

Isso é bem experimentado. Também impede que os buffers de compilação sejam exibidos.

Mark Karpov
fonte
Agradável. Vou usar isso com uma ligeira variação que não avisa antes de atualizar os pacotes.
precisa saber é o seguinte
Existe alguma razão específica para você fazer, em (y-or-n-p (message ..))vez de apenas (y-or-n-p ...)?
precisa saber é o seguinte
@ PythonNut, bem, eu preciso construir uma mensagem rápida, não me lembro agora porque eu uso message, parece que isso pode ser feito formattambém.
22815 Mark-Karpov
Ah sim. Eu quis dizer usando format. Obviamente, você não pode fazer isso sem nenhum tipo de interpolação de string.
precisa saber é o seguinte
8

Você pode usar a atualização automática de pacotes .

Instale-o por M-x package-install auto-update-package. Ele fornece uma função chamada auto-package-update-now. Você pode escrever uma ifcondição simples e adicioná-la ao seu .emacs.

(if your-condition
   (auto-package-update-now))
ChillarAnand
fonte
Hum ... Vou lembrar disso, mas a idéia é tentar corrigir automaticamente o pacote se eles estiverem quebrados. Dependendo de um pacote para fazer isso é meio absurdo. :-)
PythonNov
1

O pacote agora é chamado de atualização automática de pacotes. (Reputação muito baixa para escrevê-la como um comentário no post de Chillar acima).

(Copiado de seu post e mesclado com esta resposta):

Instale-o por M-x package-install auto-package-update. Ele fornece uma função chamada auto-package-update-now. Você pode escrever uma condição if simples e adicioná-la ao seu ~/.emacs.

(if your-condition
   (auto-package-update-now))
Richard
fonte
Eu editei a resposta de Chillar para corrigir o nome do pacote, podemos excluir este agora, eu acho.
joelittlejohn