Memperbarui paket di Emacs

144

Saya memiliki pengaturan berikut untuk paket (tidak yakin apakah ada yang disarankan lebih baik):

(require 'package)
(setq package-archives '(("ELPA" . "http://tromey.com/elpa/") 
                          ("gnu" . "http://elpa.gnu.org/packages/")
                          ("marmalade" . "http://marmalade-repo.org/packages/")))

; Apparently needed for the package auto-complete (why?)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.milkbox.net/packages/") t)

(package-initialize)
(setq url-http-attempt-keepalives nil)

Saya memiliki tiga pertanyaan terkait dengan instalasi dan pembaruan paket.

Q1. Apakah ada cara untuk memperbarui daftar paket yang tersedia (dan versi terbaru) dan memperbarui paket tertentu?

Q.2 Apa perbedaan antara sumber paket berikut ?:

  • ELPA,
  • GNU
  • selai jeruk
  • melpa

Q.3 Apakah penting urutan mereka ditambahkan package-archives?

Amelio Vazquez-Reina
sumber
13
MELPA diperlukan untuk pelengkapan otomatis karena jelas tidak ada yang peduli untuk membuat pelengkapan otomatis tersedia di Marmalade. Jangan repot-repot, tapi bersihkan saja package-archives. Singkirkan arsip ELPA, yang tidak lagi dipelihara, dan arsip marmalade, yang merupakan paket usang dan duplikat tanpa bimbingan dan pemeliharaan yang jelas. Gunakan hanya arsip GNU standar, dan MELPA>
lunaryorn
2
Terima kasih @unaryorn! Itu sangat membantu. Apakah Anda tahu bagaimana saya bisa tetap mendapat informasi tentang hal-hal seperti ini? (yaitu "hal-hal yang baik untuk diketahui" seperti ini ketika Emacs berevolusi)
Amelio Vazquez-Reina
3
Informasi mengalir dengan bebas di web, cukup tangkap: Ikuti / emacs di Reddit, ikuti blog dan twitter dari orang-orang Emacs terkenal seperti Nic Ferrier, Bozhidar Batsov, Magnar Sveen, John Wiegley, dll., Bergabunglah dengan #emacs di Freenode IRC, dan masih banyak lagi.
lunaryorn
3
Anda harus melakukannya (setq package-enable-at-startup nil)jika ingin menelepon (package-initialize)diri sendiri.
phils
2
Terima kasih @ phils - Mengapa itu diperlukan?
Amelio Vazquez-Reina

Jawaban:

163
  1. Untuk memperbarui daftar paket secara otomatis, hanya jika belum ada daftar paket , gunakan yang berikut ini:

    (when (not package-archive-contents)
        (package-refresh-contents))

    Untuk memperbarui semua paket yang diinstal, ketik package-list-packages, yang akan membawa Anda ke *Packages*buffer (dan juga perbarui daftar paket), lalu ketik U x.

    package-refresh-contentstanpa syarat mencoba mengunduh daftar paket dari semua repo yang telah Anda tambahkan package-archives; package-archive-contentstidak ada nihil jika Anda sudah mengunduh daftar paket.

  2. ELPA adalah aslinya. Saya tidak berpikir itu benar-benar dipertahankan lagi, tetapi saya tidak yakin. Saya tidak menggunakannya.

    GNU adalah "resmi". Itu dikelola bersama dengan Emacs, yang berarti segala sesuatu harus selalu berfungsi tetapi pembaruan dan paket baru tidak sering datang.

    Selai jeruk pada dasarnya adalah situs web tempat Anda dapat mengunggah paket lengkap, dan itu akan ditambahkan ke repo marmalade. Anda tidak hanya mengirimkan tautan ke hulu paket, dan itu tidak cukup mengotomatiskan pembuatan paket sepenuhnya. Saya pikir ini adalah Hal yang Benar, karena Anda tidak perlu ingin melacak hulu. Sayangnya, sudah tidak terawat untuk sementara waktu, tetapi seseorang baru-baru ini mengambil alih sehingga harus kembali dan lebih baik di beberapa titik.

    Melpa mengambil URL ke misalnya area lac EmacsWiki atau repo github, dan membangun sebuah paket secara otomatis darinya. Jadi biasanya paling tidak sehari di belakang apa pun yang dilacak. Meskipun trek upstream, saya tidak pernah punya masalah dalam praktek, dan ini adalah tempat sebagian besar paket saya berasal. Ada juga Melpa Stable , yang seperti Melpa tetapi mengambil revisi yang ditandai dari repo hulu alih-alih revisi terbaru. Melpa stable memiliki paket lebih sedikit daripada Melpa.

    Mode org memiliki package.elrepo sendiri ( http://orgmode.org/elpa/ ).

    Semua repo paket bekerja sama, Anda tinggal menambahkannya ke package-archives .

    Inilah posting blog yang lebih mendalam tentang subjek ini, yang sebagian besar saya setujui.

  3. Saya tidak yakin, tapi saya pikir jika sebuah paket diduplikasi dalam berbagai repo, urutan repo muncul package-archives menentukan prioritas. Saya tidak tahu apakah prioritas yang lebih tinggi ada di awal atau akhir daftar.

    Pembaruan: Di Emacs 25, ada variabel package-archive-prioritiesyang dapat Anda gunakan untuk memprioritaskan repo paket Anda (mis. Lebih suka ELPA daripada MELPA).


Inilah bagian yang relevan dari saya init.el, jika Anda tertarik:

(setq jpk-packages
      '(
        ac-dabbrev
        ...
        yasnippet
        ))

(package-initialize)
(add-to-list 'package-archives
             '("melpa" . "http://melpa.org/packages/"))
(add-to-list 'package-archives
             '("org" . "http://orgmode.org/elpa/"))

;; install any packages in jpk-packages, if they are not installed already
(let ((refreshed nil))
  (when (not package-archive-contents)
    (package-refresh-contents)
    (setq refreshed t))
  (dolist (pkg jpk-packages)
    (when (and (not (package-installed-p pkg))
             (assoc pkg package-archive-contents))
      (unless refreshed
        (package-refresh-contents)
        (setq refreshed t))
      (package-install pkg))))

(defun package-list-unaccounted-packages ()
  "Like `package-list-packages', but shows only the packages that
  are installed and are not in `jpk-packages'.  Useful for
  cleaning out unwanted packages."
  (interactive)
  (package-show-package-list
   (remove-if-not (lambda (x) (and (not (memq x jpk-packages))
                            (not (package-built-in-p x))
                            (package-installed-p x)))
                  (mapcar 'car package-archive-contents))))
jpkotta
sumber
2
Terima kasih! Apa yang when (not package-archive-contents)diperiksa?
Amelio Vazquez-Reina
3
Persyaratan mencegah penyegaran setiap kali saya memulai emacs (saya biasanya hanya ingin memeriksa kapan saya mengatakannya). Ini hanya memeriksa jika tidak ada arsip paket, yang seharusnya hanya menjadi kasus pertama kali saya mengkloning konfigurasi saya ke mesin baru.
jpkotta
Memberi tahu Anda tentang jawaban @Brandy Trainor, yang sepertinya melengkapi jawaban Anda - jika itu membantu.
Amelio Vazquez-Reina
Saya pikir ini perlu menelepon (refresh-package-contents)tanpa syarat sebelum mengunduh paket baru, karena jika tidak Emacs dapat mencoba mengunduh versi paket lama (yang saat itu adalah 404), gagal, dan berhenti memuat.
Vladimir Panteleev
Apa cara terbaik untuk memahami paket mana yang tidak diinginkan? @jpkotta
alper
103

Di dalam Emacs, gunakan M-x list-packages untuk mendaftar semua paket yang secara otomatis akan me-refresh konten arsip. Setelah itu gunakan Uuntuk menandai semua paket yang dapat diupgrade untuk ditingkatkan, danx untuk benar-benar melakukan pembaruan baru. Emacs kemudian akan mengambil dan menginstal semua pemutakhiran, dan meminta Anda apakah akan menghapus versi lama yang sudah usang sesudahnya.

Anda mungkin juga ingin melihatnya Karton yang menyediakan cara yang lebih mudah untuk mengelola paket Anda dengan mendeklarasikannya dalam file khusus, dan menyertakan klien baris perintah yang nyaman untuk menginstal dan memutakhirkan paket secara otomatis dengan cara ini.


Urutan package-archivestidak tidak peduli. Emacs mengagregasi konten semua arsip ke dalam satu daftar paket yang tersedia dan versi yang koheren, disimpan di package-archive-contents.

Setelah itu package-install, Emacs hanya akan memilih versi terbaru dari sebuah paket, terlepas dari arsip aslinya. Untuk kontrol lebih lanjut tentang asal paket, MELPA menyediakan paket melpa yang memungkinkan paket hitam atau daftar putih dari arsip yang ditentukan.

lunaryorn
sumber
2
Itu S-ulebih tepatnya.
Lenar Hoyt
@ mcb Apa S-u? Menu paket tidak menggunakan ikatan itu.
lunaryorn
2
Maksud saya Shift-udengan itu.
Lenar Hoyt
8
@ MCB Yah, itu sebabnya saya menulis huruf besar U 😊
lunaryorn
1
Hanya untuk yang bingung seperti saya yang berpikir ini berarti <kbd> U </kbd>.
Lenar Hoyt
23

Di terminal:

emacs

M-x list-packages

ini menempatkan Anda dalam buffer * paket *

shift-u x

emacs akan meminta Anda (y / n), menunggu pembaruan

C-x k <ret>

ini akan mematikan * paket * buffer dan mengembalikan Anda kembali ke * scratch *

C-x-C-c

ini akan keluar dari emacs, dan membiarkan Anda meluncurkan kembali, tetapi Anda mungkin harus men-debug :(

emacs

2 ¢ saya

rezwits
sumber
Saya mendapat "tidak ada perintah yang ditentukan" atau sesuatu seperti itu ketika saya mengetik "U". Setelah berjalan M-x package-refresh-contents, saya diminta untuk mengetik "U" untuk menandai semua pembaruan, dan kemudian saya bisa mengetik "x" untuk menjalankan pembaruan.
MrColes
2

Ini lebih merupakan komentar panjang tentang jawaban jpkotta.

Ini adalah penyesuaian yang saya coba untuk jawaban jpkotta di atas:

(setq n 0)                                  ; set n as 0
(dolist (pkg pkgs-2b-present)               ; for each pkg in list
  (unless (or                               ; unless
           (package-installed-p pkg)        ; pkg is installed or
           (assoc pkg                       ; pkg is in the archive list
                  package-archive-contents))
    (setq n (+ n 1))))                      ; add one to n
(when (> n 0)                               ; if n > 0, 
  (package-refresh-contents))               ; refresh packages

(mengganti (when (not package-archive-contents) (package-refresh-contents))).

Daftar paket tidak cukup menyegarkan untuk kasus penggunaan saya.

Saya belum mempertimbangkan apakah ada solusi yang lebih efisien untuk masalah saya; pertama, saya harus melihat apakah masalahnya hilang dengan penyesuaian ini.

Brady Trainor
sumber
Dalam jawaban saya, di package-archive-contents-refresh hanya jika tidak ada. Idenya adalah bahwa Anda menyalin .emacs.d Anda ke mesin baru dan secara otomatis menginstal semua paket Anda, tetapi setelah itu Anda harus memperbarui secara manual. Saya mencoba memperbarui setiap dua minggu. Saya kira Anda menambahkan paket ke daftar Anda, tetapi Anda package-archive-contentsterlalu tua untuk memilikinya?
jpkotta
@ jpkotta, saya punya dual boot, masing-masing menggunakan default ~/.emacs.d/elpa/untuk lokasi paket. Namun, versi saya dari paket-install-code Anda ada di partisi "ketiga", ( e:/emacs-configatau /e/emacs-config/). Jadi saya menambahkan paket ke daftar saat dalam satu OS, dan itu harus diperbarui ketika saya memuat Emacsdi OS lain. Pasti ada beberapa elemen berlebihan dalam solusi saya, tetapi tampaknya berfungsi setidaknya.
Brady Trainor
@jpkotta, mengapa package-archive-contentssepertinya aku begitu gila membuatku lolos. Itu adalah masalah yang saya tidak mempersempit. Jika saya mencari dan menemukan solusi "lebih elegan" di masa depan, saya akan menambahkannya ke posting saya.
Brady Trainor
1
(package-refresh-contents)menulis untuk ~/.emacs.d/elpa/archives. Tidak jelas apakah Anda memiliki direktori yang dibagikan di antara OS. Saya akan merekomendasikan untuk tidak berbagi elpa/direktori, karena elpa/byacecode Emacs (kode dalam bytecompiled) tidak kompatibel ke belakang ( gnu.org/software/emacs/manual/html_node/elisp/… ). Anda harus memastikan bahwa kedua instalasi memiliki versi Emacs yang sama. Saya menjaga .emacs.dkontrol versi saya , dan menyinkronkan berbagai instalasi dengan itu.
jpkotta