Saya ingin mengubah paket, mengujinya dan mudah-mudahan mengirimkan permintaan tarik sesudahnya. Bagaimana saya melakukannya dengan cara yang aman dan efisien? Pertanyaannya mungkin terasa terlalu luas, saya akan menerima jawaban yang mencakup masalah-masalah berikut:
Saya berharap untuk menginstal cabang terpisah dari sebuah paket dan dapat beralih di antara itu dan cabang stabil pada kemauan, dengan kompilasi dilakukan secara otomatis ketika diperlukan, tetapi
package.el
tampaknya tidak menawarkan cara mudah untuk melakukan itu. Jawaban pada emacs-SE ini memberi tahu kita bahwa "Jika banyak salinan paket diinstal, maka yang pertama akan dimuat" jadi saya kira orang bisa mengacaukan secara manualload-path
tetapi ini tidak terasa kuat. Apa cara standar untuk memilih versi paket tertentu di antara yang diinstal?Bahkan jika saya berhasil mengekspos beberapa cabang ke Emacs, untuk penyesuaian signifikan saya perlu memastikan cabang yang belum ditambal "dibongkar" dan efek sampingnya terisolasi. Apakah
unload-feature
menangani ini dengan benar atau mungkin memiliki kekhasan yang harus diketahui oleh setiap penguji paket multi-versi?Bagaimana cara saya menginstal dan menguji versi lokal? Jawabannya tampaknya tergantung pada apakah paket itu sederhana (= satu file) atau multifile. EmacsWiki mengatakan tentang paket multi-fungsi : " MELPA membuat paket untuk Anda ". Saya ragu bahwa saya harus (atau harus) berbicara dengan MELPA setiap kali saya mengubah
defun
formulir dalam paket multifile tetapi pertanyaannya tetap. Setidaknya saya perlu memberi tahu manajer paket tentang versi lokal, dan jika demikian, bagaimana saya melakukannya?Nama apa yang harus saya tetapkan untuk versi paket lokal? Misalkan saya ingin mengerjakan beberapa fitur atau bug secara bersamaan, yang berarti memiliki beberapa cabang. Emacs tidak akan mengizinkan untuk menyebutkan versi secara deskriptif (sepanjang baris
20170117.666-somebugorfeature
). Saya kira saya bisa mengganti nama paket itu sendiri, akhiran per cabang, tapi sekali lagi, seperti mengacaukan secara manualload-path
di Q1, ini adalah hack yang jelek, jadi saya tidak akan mencobanya dengan sesuatu yang saya ingin kirim ke hulu kecuali itu adalah praktik yang diterima secara luas .
Pertanyaannya mungkin naif, karena saya tidak pernah menulis tambalan yang tidak diterapkan dengan git atau vcs serupa. Namun, bagi banyak pengguna Emacs, menambal paket Emacs mungkin merupakan upaya pemrograman sosial pertama mereka (atau mungkin satu-satunya), yang mengapa, saya yakin, jawaban atas pertanyaan ini masih berharga.
sumber
emacs -L
pendekatan untuk memuat versi lokal dari sebuah paket yang saya juga instal secara global menggunakan Tong. Satu hal yang membuat saya kecewa adalah menjalankan<package>-version
selalu mengembalikan versi yang diinstal secara global, bahkan ketika saya benar-benar menjalankan versi modifikasi lokal. Ternyata ini karena<package>-version
paket untuk mendapatkan versi daripackages.el
.Pertanyaan bagus! Jawabannya adalah bahwa sampai sekarang, tidak ada jawaban yang baik, karena tidak ada manajer paket yang ada yang dirancang untuk kasus penggunaan ini (kecuali untuk Borg , tetapi Borg tidak berusaha untuk menangani operasi manajemen paket umum lainnya seperti penanganan ketergantungan) .
Tapi sekarang, ada
straight.el
, manajer paket generasi berikutnya untuk Emacs yang menangani masalah ini selengkap mungkin. Penafian: Saya menulisstraight.el
!Setelah memasukkan potongan bootstrap , menginstal paket semudah
Ini akan mengkloning repositori Git untuk Magit, membangun paket dengan menghubungkan file-nya ke direktori yang terpisah, byte-compile, menghasilkan dan mengevaluasi pengisian otomatis, dan mengkonfigurasi dengan
load-path
benar. Tentu saja, jika paket sudah diklon dan dibangun, tidak ada yang terjadi, dan waktu init Anda tidak akan terganggu.Bagaimana Anda membuat perubahan pada Magit? Itu sepele! Cukup gunakan
M-x find-function
atauM-x find-library
untuk melompat ke kode sumber, dan retas! Anda dapat mengevaluasi perubahan Anda untuk mengujinya secara langsung, seperti praktik umum untuk pengembangan Emacs Lisp, dan ketika Anda memulai ulang Emacs, paket akan secara otomatis dibangun kembali, disusun ulang, dan sebagainya. Ini sepenuhnya otomatis dan sangat mudah.Ketika Anda puas dengan perubahan Anda, cukup komit, dorong, dan buat permintaan tarik. Anda memiliki kontrol total atas paket lokal Anda. Tetapi konfigurasi Anda masih dapat direproduksi 100% karena Anda dapat meminta
straight.el
untuk membuat file kunci yang menyimpan revisi Git dari semua paket Anda, termasukstraight.el
itu sendiri, MELPA, dan sebagainya.straight.el
dapat menginstal paket apa pun dari MELPA, GNU ELPA, atau EmacsMirror. Tetapi ia juga memiliki resep DSL yang sangat fleksibel yang memungkinkan Anda untuk menginstal dari mana saja, serta untuk menyesuaikan bagaimana paket dibangun. Berikut ini contoh yang menunjukkan beberapa opsi:straight.el
memiliki dokumentasi yang sangat komprehensif. Baca semua tentang itu di GitHub .sumber
Ini semua adalah pertanyaan bagus!
Emacs bekerja pada model memori-gambar, di mana memuat kode baru mengubah gambar memori dari instance yang sedang berjalan. Mendefinisikan fungsi dan variabel baru dengan mudah diurungkan, jika Anda menyimpan daftarnya, tetapi ada banyak efek samping yang mungkin dimiliki modul yang ingin Anda batalkan. Sepertinya
unload-feature
membuat itu cukup bagus.Saya pikir apa yang ingin Anda lakukan adalah kombinasi live coding dan sesekali meluncurkan kembali Emacs, memuat modul yang sedang Anda kerjakan dari cabang Anda dan bukan dari tempat dipasangnya. Jika Anda memiliki banyak cabang ini, Anda mungkin menginginkan skrip shell yang meluncurkan emacs dengan benar
load-path
untuk yang sedang Anda kerjakan saat ini. Bagaimanapun saya tidak akan mengganti nama paket; Saya pikir itu akan lebih membingungkan karena emacs kemudian dapat memuat keduanya.Saat Anda mengembangkan tambalan Anda, Anda bisa mulai dengan mendefinisikan kembali fungsi yang Anda ubah tepat di sesi Emacs langsung Anda. Ini memungkinkan Anda menguji definisi baru dengan segera, tanpa meninggalkan Emacs. Secara khusus, saat Anda mengedit file elisp Anda dapat menggunakan
C-M-x
(eval-defun
) untuk mengevaluasi fungsi saat ini di sesi Emacs Anda saat ini. Anda kemudian dapat memanggilnya untuk memastikan itu berfungsi. Jika Anda mengubah sesuatu yang terjadi pada startup Emacs maka Anda harus memulai dan menghentikan Emacs untuk mengujinya; Anda dapat melakukannya dengan memulai dan menghentikan proses Emacs terpisah sehingga sesi pengeditan Anda tidak terganggu.sumber
Saya tidak berpikir ada jawaban yang bagus untuk itu (saya harap Anda bisa mendapatkan solusi parsial dengan Cask, tho saya tidak cukup akrab dengannya untuk memberikan jawaban yang baik dengan menggunakannya; semoga orang lain akan), tapi di sini apa yang saya lakukan (saya jarang menggunakan paket Elisp tanpa membuat perubahan lokal untuk itu, jadi itu benar-benar cara saya "normal"):
cd ~/src; git clone ..../elpa.git
cd ~/src/elisp; git clone ....thepackage.git
cd ~/src/elpa/packages; ln -s ~/src/elisp/* .
cd ~/src/elpa; make
di
~/.emacs
add AndaDengan cara ini, semua paket diinstal "langsung dari Git", sebuah simpel
cd ~/src/elpa; make
akan mengkompilasi ulang yang membutuhkannya, danC-h o thepackage-function
akan melompat ke file sumber yang berada di bawah Git.Untuk "beralih di antara itu dan cabang stabil pada kemauan", Anda harus
git checkout <branch>; cd ~/src/elpa; make
; dan jika Anda ingin itu mempengaruhi menjalankan sesi Emacs itu akan membutuhkan lebih banyak pekerjaan. Saya biasanya merekomendasikan untuk tidak menggunakanunload-feature
kecuali dalam situasi luar biasa (ini adalah fitur yang baik, tetapi saat ini tidak cukup dapat diandalkan).Itu juga tidak memenuhi banyak persyaratan Anda. Dan itu memiliki beberapa kelemahan tambahan, sebagian besar fakta bahwa banyak klon Git paket tidak cukup cocok dengan tata letak dan konten yang diharapkan oleh makefile elpa.git, jadi Anda harus mulai dengan mengubah paket-paket tersebut (biasanya hal-hal yang berkaitan dengan
<pkg>-pkg.el
, karena makefile dari elpa.git mengharapkan untuk membuat file ini<pkg>.el
daripada membuatnya disediakan, tetapi yang lebih bermasalah, kompilasi dilakukan secara berbeda, jadi kadang-kadang Anda perlu bermain denganrequire
s).Oh dan tentu saja, ini pada dasarnya berarti Anda menginstal paket-paket itu dengan tangan, jadi Anda harus memperhatikan ketergantungan. Pengaturan ini benar berinteraksi dengan paket lain yang diinstal oleh
package-install
, tho, jadi tidak terlalu buruk.sumber
Jawaban lain untuk pertanyaan ini, termasuk jawaban saya yang lain , berbicara tentang menambal paket Emacs dengan membuat perubahan pada kodenya. Tetapi orang-orang yang menemukan pertanyaan ini melalui Google mungkin memikirkan hal lain ketika mereka mengatakan "menambal paket Emacs" - yaitu, mengesampingkan perilakunya tanpa harus mengubah kode sumbernya.
Mekanisme untuk melakukan ini termasuk, dalam urutan peningkatan keagresifan:
let
Terlepas dari kekuatan dua opsi pertama, saya mendapati diri saya mengambil rute ketiga cukup sering, karena kadang-kadang tidak ada cara lain. Tetapi kemudian pertanyaannya adalah, bagaimana jika definisi fungsi asli berubah? Anda tidak akan mengetahui bahwa Anda perlu memperbarui versi definisi yang telah Anda salin dan tempel ke file init Anda!
Karena saya terobsesi dengan menambal sesuatu, saya menulis paket
el-patch
, yang menyelesaikan masalah ini selengkap mungkin. Idenya adalah Anda mendefinisikan perbedaan berbasis-ekspresi dalam file init Anda, yang menggambarkan definisi fungsi asli dan perubahannya. Ini membuat tambalan Anda jauh lebih mudah dibaca, dan juga memungkinkanel-patch
untuk memvalidasi nanti apakah definisi fungsi asli telah diperbarui sejak Anda membuat tambalan Anda. (Jika demikian, itu akan menunjukkan kepada Anda perubahan melalui Ediff!) Mengutip dari dokumentasi:sumber
Ketika Anda membuat banyak perubahan, saya pikir Anda harus menggunakan
straight.el
, lihat jawabannya oleh Radon Rosborough .Jika Anda hanya ingin membuat perubahan satu kali, mari kita asumsikan sebuah proyek bernama
fork-mode
, lakukan langkah-langkah berikut:mkdir ~/.emacs.d/lisp-gits
https://github.com/user/fork-mode
cd ~/.emacs.d/lisp-gits && git clone [email protected]:user/fork-mode.git
Tulis kode berikut di
.emacs
Sekarang Anda dapat menggunakan mode emacs, gunakan
C-h f
untuk menemukan fungsi yang ingin Anda ubah. Anda akan melihat bahwa ketika paket diinstal di lisp-gits, Anda akan melompat ke sana. Gunakan perintah magit atau git lainnya untuk melakukan / mendorong perubahan dan kemudian menggunakan github untuk mengirim permintaan tarikan Anda.Setelah permintaan tarik Anda diterima, Anda bisa menghapus proyek
~/.emacs.d/lisp-gits
dan membiarkan manajer paket melakukan tugasnya.sumber