Manfaat praktis dari sistem saran baru di Emacs 24.4

53

Emacs 24.4 hadir dengan sistem saran baru. The NEWSberkas mengatakan:

** Paket baru nadvice.elmenawarkan fasilitas saran yang lebih ringan. Itu berlapis sebagai:

*** add-function/ remove-function, yang dapat digunakan untuk menambah / menghapus kode di sembarang tempat pembawa fungsi, seperti filter proses atau <foo>-functionkait.

*** advice-add/ advice-removeuntuk menambah / menghapus saran tentang fungsi bernama, seperti defadvicehalnya.

T: Apa manfaat dan implikasi praktis dari paket baru ini?

Saya khususnya tertarik pada jawaban yang membahas hal-hal berikut:

  • Jika saya hanya menggunakan saran untuk mengkustomisasi Emacs (bukan menulis paket tambahan), apakah saya perlu beralih ke sistem baru? Apakah ini akan menggantikan sistem lama di beberapa titik?

  • Apa sebenarnya yang bisa saya lakukan dengan sistem baru yang tidak dapat saya capai defadvice?

  • Apa pentingnya bisa "menambah / menghapus kode di sembarang tempat pembawa fungsi"?

itu hanya
sumber

Jawaban:

57

Sistem saran baru memiliki keuntungan sebagai berikut:

  • add-function: Ini adalah fungsi baru yang bukan bagian dari defadvice. Ini adalah jenis hibrida antara add-hookdan defadvice. Di masa mendatang, harapkan lebih banyak foo-functionvariabel (dimodifikasi melalui add-function) dan lebih sedikit foo-functions(dimodifikasi melalui add-hook). Fungsionalitas ini adalah motivasi utama untuk menerapkan sistem saran baru, dipicu oleh laporan bug yang menanyakan bagaimana cara "berbagi" proses-filter antara paket yang berbeda.

  • Kesederhanaan implementasi: setelah add-functiondiimplementasikan, hanya diperlukan 8KB untuk mengimplementasikan advice-addfungsionalitas yang membawa hampir semua fungsi 100KB dari advice.el.

  • Kesederhanaan desain: defadvice memiliki berbagai pengertian yang umumnya sulit dipahami secara tepat dan / atau jarang digunakan. Misalnya perbedaan antara saran "mengaktifkan" dan "mengaktifkan". Atau arti "pra" dan / atau "dikompilasi". Ada juga keanehan dalam penanganan ad-do-it, seperti fakta bahwa itu terlihat seperti referensi variabel daripada panggilan, atau fakta bahwa Anda perlu (setq ad-return-value ...)secara eksplisit daripada hanya mengembalikan nilai.

  • Defadvice menderita berbagai masalah terkait ekspansi dan kompilasi makro: isi saran tidak diekspos sebagai "kode" (yang dilihat oleh kompiler dan makro ekspander) tetapi sebagai "data" yang kemudian digabungkan untuk membentuk ekspresi. Jadi ekspansi makro terjadi terlambat (yang dapat menyebabkan kejutan jika Anda menggunakan hal-hal seperti (eval-when-compile (require 'foo))) dan pelingkupan leksikal sulit untuk dipertahankan dengan benar.

Adapun apakah Anda perlu beralih ke sistem baru: Saya memang bermaksud untuk menyingkirkan layanan lama di beberapa titik di masa depan, tapi saya pikir masa depan ini relatif jauh (dan pertama-tama harus pindah ke lisp/obsolete, kemudian nanti ke GNU ELPA).

Stefan
sumber
1
Apakah ada rencana untuk menambahkan ke nadvice.el fungsi argumen-modifikasi yang sama yang ditawarkan oleh sistem saran lama?
Aaron Miller
Tidak, itu tidak masuk akal dalam konteks nadvice.el di mana fungsi saran adalah fungsi normal lama yang biasa. Tetapi Anda dapat menggunakan :aroundsaran ( :filter-argsatau :filter-resultsaran) untuk mendapatkan efek yang sama.
Stefan
2
Tapi aku tidak bisa. Misalkan saya ingin menyarankan fungsi dua argumen, mengganti hanya argumen kedua, sehingga fungsi yang disarankan masih akan meminta sesuai dengan bentuk interaktif untuk yang pertama. Saran baru tampaknya menyediakan beberapa cara berbeda untuk menggantikan bentuk interaktif fungsi yang disarankan, tetapi saya tidak melihat apa pun yang menawarkan nuansa lebih dari itu.
Aaron Miller
@AaronMiller: Tolong jadikan ini sebagai pertanyaan SX yang terpisah, sehingga dapat didiskusikan tanpa batasan buatan dari komentar SX.
Stefan
Selesai, di emacs.stackexchange.com/q/19233/2162 . Saya menghargai tindak lanjut Anda. (Saya juga ingin tahu melihat laporan bug yang Anda sebutkan dalam jawaban Anda, tetapi belum dapat menemukannya melalui Google atau pencarian arsip milis. Apakah Anda keberatan mengaitkannya?)
Aaron Miller
9

Salah satu manfaat jelas dari saran adalah fungsi normal adalah Anda dapat mengunjungi definisi dengan find-function.

Saat ini, ketika melihat bantuan untuk fungsi yang disarankan (gaya baru), ia menyediakan tautan ke bantuan untuk fungsi saran, dan dari sana tautan ke sumber (seperti biasa untuk bantuan fungsi).

Sistem lama menyediakan saran yang mendokumentasikan, tetapi tidak ada cara untuk melihat kode (biasanya saya terpaksa rgrep).

(Secara pribadi saya ingin melihat campuran dari pendekatan lama dan baru untuk menampilkan bantuan, karena saya suka memiliki inline docstring, tapi saya yakin itu mungkin di jalurnya.)

phils
sumber
2
Ya, terlalu buruk bahwa sistem saran baru tidak membiarkan Anda menambahkan ke string doc yang ada seperti defadvicehalnya. Lihat laporan bug Emacs ini . Ini kekurangan.
Drew
8

Dari header file:

;;; Commentary:

;; This package lets you add behavior (which we call "piece of advice") to
;; existing functions, like the old `advice.el' package, but with much fewer
;; bells and whistles.

Ketika saya membacanya, tujuan utama adalah menjadi lebih sederhana daripada sistem saran lama, bukan untuk memiliki lebih banyak kemampuan. Membaca dokumen, tampaknya advice-addberisi subset dari defadvicefungsionalitas, sementara add-functionberisi beberapa fungsionalitas yang bagus untuk menasihati fungsi-fungsi non-tradisional seperti filter proses (yang mungkin mungkin dengan defadvice, tapi saya tidak yakin bagaimana).

Sejauh yang saya tahu, defadvicetidak secara resmi ditinggalkan sehingga Anda harus merasa bebas untuk tetap menggunakannya untuk saat ini (dan jika Anda seorang pembuat paket, Anda mungkin ingin terus menggunakannya sampai 24.4 menjadi lebih banyak diadopsi). Namun, sepertinya penulis Emacs ingin bermigrasi sepenuhnya ke sistem baru pada akhirnya, jadi mungkin masuk akal untuk perlahan-lahan beralih.

shosti
sumber
Iya. Yang baru berbeda, tidak lebih. Dan ya, ada banyak penggunaan di defadviceluar sana (dan akan terus ada).
Drew
0

Satu hal yang belum saya lihat disebutkan di sini - meskipun dalam beberapa hal itu adalah karena pendekatan yang lebih sederhana (modularitas yang lebih baik dan "lem") dari sistem saran "baru", yang telah disebutkan dalam jawaban lain - adalah ini: lebih mudah untuk menambahkan, menggabungkan, menghapus, menyusun ulang , dll. saran saran.

Bahkan mungkin untuk melakukannya secara interaktif, dinamis, meskipun nadvice membutuhkan sedikit bantuan untuk memfasilitasi ini. Saya tidak mengetahui penggunaan lain dari nadvice dengan cara ini (komposisi saran interaktif), tetapi setidaknya ada satu aplikasi seperti itu. Saya memanfaatkannya di Isearch + , untuk memungkinkan Anda menambah dan menghapus kombinasi predikat filter Isearch arbitrer (filter) saat mencari.

TKI, sama seperti Anda mengubah pola pencarian Anda secara bertahap, sehingga Anda dapat mempersempit pencarian Anda dengan cepat menggunakan beberapa filter.

Penyaringan isearch dilakukan menggunakan variabel isearch-filter-predicate, yang telah tersedia cukup lama sekarang. Namun filter Isearch tidak sering didefinisikan. Mereka biasanya statis dan sudah ditentukan sebelumnya untuk konteks tertentu (misalnya Wdired). Tidak mudah bagi pengguna untuk mendefinisikan dan menggunakannya, setidaknya secara interaktif.

Hanya ada satu variabel, isearch-filter-predicatesehingga mengubah penyaringan benar-benar berarti mengubah satu saringan predikat tunggal, yang berjumlah menyusun fungsi, menggabungkan predikat, untuk mempersempit, memperluas, atau memodifikasi pencarian.

Tapi itulah yang harus dilakukan nadvice. Singkatnya, nadvice sangat berguna untuk menggabungkan fungsi-fungsi yang dapat memudahkan penyaringan pencarian secara interaktif . (Lihat Penyaringan Pencarian dinamis untuk lebih lanjut tentang ini.)

Drew
sumber