Cara termudah untuk menurunkan versi paket yang diinstal melalui MELPA

22

Terkadang, pembaruan paket dari MELPA dapat merusak sebagian emacs dan ketika itu terjadi, saya ingin dapat kembali menggunakan paket versi yang lebih lama.

Saat ini, saya bisa melakukannya dengan dua cara:

  • Saya telah mengatur emacs untuk menghapus file dengan pindah ke tempat sampah dan ketika saya memperbarui paket, versi yang lebih lama dibuang. Saya dapat mengambil versi yang lebih lama dan menggantikan yang di ~/.emacs.d/elpa.

  • Pergi ke repo github dari paket yang merusak fungsionalitas, ambil versi yang lebih lama dari paket, ganti yang masuk ~/.emacs.d/elpadengan yang dari gitub, byte-kompilasi ulang file (s).

Kedua cara ini melibatkan banyak pekerjaan manual untuk memindahkan barang-barang. Apakah ada cara yang lebih mudah (lebih disukai otomatis) untuk menurunkan versi paket yang diinstal dari MELPA?

Chakravarthy Raghunandan
sumber
4
Anda hanya dapat menginstal versi terbaru melalui ELPA / package.el, Melpa dan Melpa-stable bahkan tidak menyimpan paket versi lama. Untuk menginstal paket secara manual, 1) unduh kode sumber 2) M-x package-install-file. Ada juga cara lain untuk mengelola paket selain ELPA / package.el, seperti el-get dan quelpa , mereka tampaknya dapat digunakan tanpa ELPA, mungkin mereka dapat melakukan apa yang Anda inginkan.
xuchunyang
2
Jika Anda tidak mendapatkan jawaban yang sederhana dan bisa diterapkan untuk pertanyaan ini, silakan pertimbangkan mengirim permintaan peningkatan ke Emacs: M-x report-emacs-bug(itu juga untuk permintaan peningkatan).
Drew

Jawaban:

9

Ketika Anda memperbarui paket Anda melalui M-x list-packagesantarmuka, setelah instalasi yang berhasil dari paket, Anda akan ditanya apakah Anda ingin menghapus paket yang lama. Jangan hapus mereka agar tetap di tempatnya dan nanti Anda bisa menghapus paket yang lebih baru melalui antarmuka ini.

Daftar paket saya saat ini menunjukkan 4 versi magit yang diinstal di pohon direktori ~ / .emacs.d / elpa / saya.

  magit              20160827.1549 obsolete              A Git porcelain inside Emacs
  magit              20160907.945  obsolete              A Git porcelain inside Emacs
  magit              20161001.1454 obsolete              A Git porcelain inside Emacs
  magit              20161123.617  installed             A Git porcelain inside Emacs

Anda dapat membersihkan versi lama nanti dengan tombol ~(package-menu-mark-obsolete-for-deletion) untuk menandai semua paket usang. Untuk menghapus versi lama tertentu, pindah ke jalurnya dan tekan duntuk menandai mereka untuk dihapus. Setelah Anda menandai paket yang akan Anda gunakan xuntuk menjalankan tindakan seperti biasa.

Di Emacs 25 tandai semua paket untuk Ufungsi pgrade secara otomatis menetapkan semua paket lama untuk dihapus, dan tidak meminta konfirmasi setelah menginstal. Anda harus mencari garis yang dimulai dengan huruf kapital "D", yang tidak dapat Anda tandai (paling baik dengan makro berikut)

Ketikkan kunci atau akor di sebelah kiri tanda hubung dari baris berikut.

<F3>  - start macro recording
C-s   - isearch-forward
C-q   - quoted-insert
C-j   - linefeed character
D     - the mark at the start of the line
<Ret> - stops the isearch on the line with the "D"
u     - unmark the package for deletion
<F4>  - stops macro recording - the first package is now unmarked
<F4>  - executes the macro for the next upgraded package

Jika tidak ada kecocokan lebih lanjut untuk pencarian, makro akan membunyikan bel dan berhenti, sehingga Anda dapat C-u 0 <F4>menghapus centang semua paket yang ditandai untuk dihapus. Setelah ini, Anda dapat xmembuat instalasi.

Fungsi yang saya nyatakan akan diubah dalam komentar saya harus diubah dengan cara yang belum dapat saya pahami, karena penting bahwa blok (cond) terakhir harus berhasil agar tidak berulang tanpa henti.

p_wiersig
sumber
Oh, hei, itu tidak meminta konfirmasi untuk menghapus di emacs saya. Itu hanya menghapus paket lama: / saya pikir itu digunakan untuk bertanya di emacs 24? saya tidak ingat
Chakravarthy Raghunandan
memang. Emacs 24 meminta, 25 tampaknya menandai yang lama untuk dihapus dan yang akan memicu pada mengeksekusi tanda. Anda dapat menandai paket untuk instalasi dengan tangan atau menghapus tanda penghapusan atau mengubah (t (package-menu-mark-delete))baris package-menu--mark-upgrades-1sehingga baris pertama adalah tes untuk variabel konfigurasi atau sesuatu yang kembali nilketika Anda tidak ingin langsung menghapus paket lama
p_wiersig
Bisakah Anda menambahkan baris yang relevan untuk diedit di package.eljawaban asli, sehingga saya dapat menerima jawabannya? Terima kasih
Chakravarthy Raghunandan
Yakin. Saya perhatikan bahwa saya tidak dapat membuat fungsi untuk melakukan apa yang saya inginkan, jadi saya menjelaskan cara menghapus tanda semua melalui makro.
p_wiersig
7

"Opsi nuklir", seolah-olah, adalah untuk membuang package.elsepenuhnya dan alih-alih menggunakan manajer paket yang saya tulis straight.el,. Keuntungannya adalah straight.elmenginstal paket dengan mengkloning repositori Git mereka, sehingga membuatnya sepele untuk menggunakan versi apa pun yang Anda inginkan. Juga, straight.elmenyediakan fungsionalitas untuk berurusan dengan kunci penguncian revisi, yang memungkinkan Anda untuk mencatat keadaan yang tepat dari konfigurasi manajemen paket Anda hingga ke detail terkecil. Kemudian, dalam keadaan darurat, Anda dapat dengan mudah mengembalikan semua paket ke versi yang dikenal baik.

Jenis-jenis operasi ini, secara umum, mustahil dengan package.el, dan mereka akan selalu mustahil, karena desain keseluruhan.

Menanggapi keinginan Anda untuk menghindari membuat komitmen setiap kali Anda memperbarui paket Anda, ini tidak diperlukan dengan straight.el. Saya akan merekomendasikan menulis versi lockfile dan melakukan itu setiap kali Anda memperbarui paket Anda, karena itu membuat tidak mungkin untuk pernah masuk ke keadaan di mana konfigurasi Emacs Anda rusak setelah peningkatan dan Anda tidak tahu cara mengembalikan. Tetapi Anda tidak harus melakukan ini, jika Anda suka menjalani kehidupan di tepi.

Radon Rosborough
sumber
4

Saya menemukan cara mudah untuk menurunkan versi: mengelola arsip melpa Anda sendiri.

  1. Klon repo melpa .
  2. Ikuti halaman wiki arsip melpa khusus melpa untuk menghapus semua resep.
  3. Temukan komit dari paket yang ingin Anda turunkan, dan buat resep baru dengan komit itu untuk paket tersebut. (lihat readme melpa tentang cara menentukan komit)
  4. Jalankan makeuntuk membangun paket yang diturunkan
  5. Tambahkan arsip melpa Anda sendiri, yang bisa menjadi direktori lokal, ke package-archivesdaftar.
  6. Instal paket yang diturunkan menggunakan menu paket. Atau Anda dapat menggunakan package-pinned-packagesuntuk membatasi arsip dari mana paket itu harus diunduh.
chunfengd
sumber
3

Banyak orang memilih untuk tidak melakukan paket ELPA ke kontrol versi, tetapi ini adalah contoh mengapa saya percaya Anda harus melakukannya.

Mengembalikan apa pun itu sepele jika semuanya dilakukan.

Tergantung pada keadaan paket ELPA hulu adalah risiko.

phils
sumber
Tapi itu berarti saya harus ingat untuk melakukan setiap kali saya memperbarui paket. Bukan itu yang saya inginkan. ATAU adakah cara saya dapat membuat emacs secara otomatis menggelar dan melakukan paket yang diperbarui setiap kali saya melakukan pembaruan paket?
Chakravarthy Raghunandan
1
Saya tidak mengerti mengapa Anda tidak ingin perubahan pada konfigurasi Anda menjadi keputusan yang disengaja. Mengenai komit otomatis, saya yakin itu bisa otomatis, tetapi saya tidak punya solusi untuk itu. Namun, mencari solusi semacam itu mungkin memberikan hasil yang produktif.
phils