Mutakhirkan semua paket secara tidak interaktif

13

Saya ingin emacs saya memutakhirkan semua paket secara otomatis dalam kondisi tertentu.

Apa cara terbaik untuk melakukan ini?

PythonNut
sumber
Ini adalah perintah untuk memutakhirkan semua paket yang sudah usang: github.com/Malabarba/paradox/blob/2.3.5/paradox.el#L165-L181 (ganti semua paradoxdengan package).
xuchunyang
@xuchunyang Ah. Saya melihat itu tidak terlihat terlalu buruk. Jika Anda menjawabnya, saya akan menerimanya.
PythonNut

Jawaban:

9

Saya tidak yakin ini yang Anda inginkan (saya tidak tahu apa yang Anda maksud dengan “dalam kondisi tertentu”), tetapi di sini adalah fungsi yang saya gunakan untuk memutakhirkan semua paket tanpa menunjukkan *Packages*buffer, yang menurut saya menjengkelkan ketika saya hanya ingin untuk meningkatkan paket.

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

Ini sudah dicoba dengan baik. Itu juga mencegah kompilasi buffer muncul.

Mark Karpov
sumber
Bagus. Saya akan menggunakan ini dengan sedikit variasi yang tidak meminta sebelum meningkatkan paket.
PythonNut
Apakah ada alasan khusus mengapa Anda melakukannya, (y-or-n-p (message ..))bukan hanya (y-or-n-p ...)?
PythonNut
@ PhythonNut, Yah saya perlu membangun pesan cepat, saya tidak ingat sekarang mengapa saya menggunakan message, sepertinya itu bisa dilakukan dengan formatbaik juga.
Mark Karpov
Ah iya. Maksud saya menggunakan format. Jelas Anda tidak dapat melakukannya tanpa interpolasi string apa pun.
PythonNut
8

Anda dapat menggunakan pembaruan paket otomatis .

Instal dengan M-x package-install auto-update-package. Ini menyediakan fungsi yang disebut auto-package-update-now. Anda dapat menulis ifkondisi sederhana dan menambahkannya ke .emacs.

(if your-condition
   (auto-package-update-now))
ChillarAnand
sumber
Hm ... Saya akan mengingat hal ini, tetapi idenya adalah mencoba memperbaiki secara otomatis paket jika mereka rusak. Tergantung pada paket untuk melakukannya agak tidak masuk akal. :-)
PythonNut
1

Paket ini sekarang disebut pembaruan paket otomatis. (Reputasi terlalu rendah untuk menuliskannya sebagai komentar pada posting Chillar di atas).

(Disalin dari jabatannya dan bergabung dengan jawaban ini):

Instal dengan M-x package-install auto-package-update. Ini menyediakan fungsi yang disebut auto-package-update-now. Anda dapat menulis kondisi jika sederhana dan menambahkannya ke ~/.emacs.

(if your-condition
   (auto-package-update-now))
Richard
sumber
Saya telah mengedit jawaban Chillar untuk memperbaiki nama paket, kami dapat menghapus yang ini sekarang.
joelittlejohn