Konfigurasi saya penuh dengan saran, dan saya terus mendengar tentang nadvice.el
paket minimalis mengkilap yang baru .
Saya telah mencari manual, dan saya sudah membaca sumbernya , tetapi saya akan mengakui secara terbuka: Saya masih tidak tahu bagaimana cara menggunakannya.
Adakah yang bisa mengarahkan saya ke panduan, atau memberi tahu saya cara memulangkan saran gaya lama saya?
advice
emacs-internals
elisp
PythonNut
sumber
sumber
M-x report-emacs-bug
. Beberapa pengembang terkadang lebih suka mengembangkan daripada mendokumentasikan. ;-) Adalah penting bahwa dokumen Emacs itu sendiri.nadvice
dari konfigurasi saya: : setelah , : filter-return , : sekitar , : sebelum-sampaiJawaban:
Semua informasi yang Anda butuhkan termasuk dalam
C-h f add-function
yang menggambarkan mekanisme yang mendasariadvice-add
.Sistem saran baru pada dasarnya bertindak seperti mengganti definisi fungsi saat ini dengan fungsi yang dijelaskan dalam tabel di
C-h f add-function
, tergantung pada pilihanWHERE
argumen Anda, hanya pembersih demi melacak perilaku apa yang telah didefinisikan dalam file sumber apa.Contoh dengan
:around
opsiKasus yang paling umum adalah
:around
opsi, jadi saya memberikan contoh untuk itu. (Mungkin lebih baik menggunakanWHERE
parameter khusus bila memungkinkan, tetapi Anda dapat mengganti satu sama lain dengan:around
fungsi yang setara ).Sama seperti contoh, katakanlah Anda ingin men-debug beberapa penggunaan
find-file
dan inginprint
daftar argumennya setiap kali dipanggil. Anda bisa menulisDengan implementasi baru ini, semua saran yang diperlukan dilewatkan sebagai argumen.
ad-get-args
menjadi tidak perlu, karena argumen diteruskan ke fungsi saran sebagai argumen fungsi normal (untukWHERE
argumen yang masuk akal).ad-do-it
menjadi tidak perlu karena:around
saran mendapat sebagai fungsi argumen dan argumen, jadi(ad-do-it)
digantikan oleh formuliratau ketika Anda telah menyebutkan argumen
yang lebih bersih karena tidak ada bentuk sihir yang terlibat. Mengubah argumen hanya terjadi dengan meneruskan nilai yang dimodifikasi ke
OLD-FUNCTION
.WHERE
Nilai lainnyaDokumen
add-function
berisi tabel semua tempat saran (atau "kombinator"), dan apa yang setara dengan mereka, dan menjelaskan fungsionalitas dalam hallambda
berperilaku setara dengan fungsi yang disarankan:di mana FUNCTION adalah fungsi saran dan OLDFUN fungsi di mana saran ditambahkan. Jangan mencoba untuk memahami semuanya sekaligus, cukup pilih
WHERE
simbol yang terdengar pas dan cobalah untuk memahaminya.Atau gunakan saja
:around
. Sejauh yang saya tahu satu-satunya keuntungan menggunakanWHERE
s khusus:around
untuk semuanya adalah bahwa Anda mendapatkan sedikit informasi lebih banyak dari mencariC-h f ADVISED-FUNCTION
sebelum membaca dokumentasi saran. Kecuali Anda berencana untuk menerbitkan kode yang berisi saran itu mungkin tidak masalah.Bernama fungsi saran
Saya sarankan menggunakan fungsi bernama sebagai saran karena memberikan banyak keuntungan (beberapa dari mereka juga berlaku untuk menggunakan fungsi bernama untuk kait):
Itu muncul
C-h f find-file
sebagaimenautkan ke definisi fungsi saran, yang seperti biasa berisi tautan ke file di mana ia didefinisikan. Jika saran telah didefinisikan sebagai
lambda
bentuk langsung dalamadvice-add
bentuk docstring akan ditampilkan inline (berantakan untuk dokumen panjang?) Dan tidak ada yang menunjukkan di mana itu didefinisikan.Anda dapat menghapus saran dengan
Anda dapat memperbarui definisi saran tanpa menjalankan kembali
advice-add
atau mengambil risiko untuk mengaktifkan versi lama (karena menjalankanadvice-add
dengan yang diubahlambda
akan diakui sebagai saran baru, bukan sebagai pembaruan ke yang lama).Side komentar The
#'function
notasi pada dasarnya setara dengan'function
, kecuali bahwa itu membantu compiler byte mengidentifikasi simbol sebagai nama fungsi dan dengan demikian untuk mengidentifikasi fungsi yang hilang (misalnya karena kesalahan ketik).sumber
(advice-add 'find-file :around #'my-find-file-advice-print-arguments)
dan sama(advice-remove 'find-file #'my-find-file-advice-print-arguments)
.advice-add
kasus perbatasan. Secara pribadi saya menganggap' ↔ #'
perbedaan sebagai sebagian besar bantuan untuk mengidentifikasi kesalahan ketik pada nama fungsi, jadi di sini mungkin akan tergantung pada apakah seseorang mengharapkan fungsi untuk didefinisikan pada saat saran ditambahkan.add-function
). Saya berharap dokumen membuatnya lebih jelas. Saya mungkin ingin membuat tambalan untuk itu.C-h f find-file
, bukanC-x
?