Sebagai lanjutan dari jawaban untuk pertanyaan lain tentang sistem saran baru :
Dalam gaya lama advice.el
, dimungkinkan untuk memanipulasi anggota individu dari daftar argumen fungsi yang disarankan, tanpa membuat pernyataan mengenai anggota yang tidak dimanipulasi. Misalnya, saran berikut:
(defadvice ansi-term (around prompt-for-name last)
(let ((name (read-from-minibuffer "Tag: ")))
(and (not (string= name ""))
(ad-set-arg 1 (concat "Term: " name)))
ad-do-it))
memungkinkan ketentuan (opsional) argumen nama penyangga untuk ansi-term
panggilan, sementara ansi-term
masih akan mendapatkan argumen pertamanya dengan mendorong sesuai dengan bentuk interaktifnya sendiri.
(Untuk referensi di kemudian hari, ansi-term
tandatangannya adalah (PROGRAM &optional BUFFER-NAME)
, dan formulir interaktifnya meminta PROGRAM dengan beberapa kemungkinan default, tetapi tidak melakukan apa pun mengenai BUFFER-NAME.)
Saya tidak yakin apakah ini mungkin masuk atau tidak nadvice.el
. Jika ya, saya tidak yakin bagaimana hal itu dapat dilakukan. Saya telah menemukan beberapa cara untuk mengganti daftar argumen fungsi yang disarankan.
Misalnya, dari * info * (elisp) Kombinator saran :
`:filter-args' Call FUNCTION first and use the result (which should be a list) as the new arguments to pass to the old function. More specifically, the composition of the two functions behaves like: (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
Combinator lain memberikan kemampuan yang serupa, dan utas umum di antara mereka adalah bahwa, sementara daftar argumen fungsi dapat diganti, dipotong, diperluas, dan lain-lain, tidak ada cara yang jelas bagi saran fungsi untuk memodifikasi argumen pada posisi tertentu dalam daftar tanpa menegaskan apa pun tentang sisanya .
Dalam kasus yang sedang dibahas, tampaknya tidak mungkin bagi penulis saran untuk memberikan ansi-term
hanya nama penyangga, karena tidak mungkin untuk membuat daftar yang memiliki nilai di posisi 1 tetapi tidak ada, bahkan tidak nil
, di posisi 0. Dalam kasus umum, Tampaknya mustahil bagi penulis saran untuk secara sewenang-wenang mengubah argumen di luar posisi 0.
Ini sepertinya disayangkan bahwa, untuk menghasilkan efek yang serupa, perlu menyalin kode tempel: secara spesifik, saya dapat menyalin ansi-term
formulir interaktif dan memperluasnya sesuai selera saya, atau saya dapat menyalin ansi-term
semuanya dan memperluasnya juga. Dalam kedua kasus tersebut, sekarang saya harus mendefinisikan kembali bagian dari distribusi Emacs Lisp dalam file init saya, yang menurut saya tidak diinginkan dalam hal daya tahan dan estetika.
Pertanyaan saya adalah: Dapatkah daftar argumen semacam ini diselesaikan nadvice.el
? Jika ya, bagaimana caranya?
Jawaban:
Sebaliknya, saya pikir itu akan menjadi ide yang baik untuk menyalin-tempel bentuk interaktif dari fungsi yang disarankan, meskipun Anda tidak benar-benar harus melakukannya di sini.
Saya membaca pertanyaan Anda dari atas ke bawah. Ketika saya sampai pada blok-kode saya menduga bahwa saran Anda mungkin mengubah nama buffer. Tapi saya tidak tahu sampai Anda kemudian memberikan tanda tangan sebagai komentar.
Memang tidak ada yang kurang dari tidak sama sekali. :-) Tapi itu tidak relevan di sini.
Seperti yang Anda lihat dalam dokumentasi yang Anda kutip, nilai yang dikembalikan oleh saran tersebut digunakan sebagai argumen untuk fungsi yang disarankan. Nilai balik harus berupa daftar semua argumen, bukan hanya argumen yang telah berubah.
Tetap sedekat mungkin dengan saran lama, inilah yang harus Anda lakukan menggunakan
nadvice
:Tapi saya sarankan Anda mendefinisikan saran seperti ini sebagai gantinya:
Varian ini sebenarnya cukup jelas.
sumber
args
daftar jika ada panggilan seperti(ansi-term "foo")
, atau jika tidak(setf (nth 1 args)...
akan menimbulkan kesalahan.buffer-name
wajib.:filter-args
saran mendapat argumen tunggal yang merupakan daftar argumen untuk fungsi yang disarankan, sehingga varian 1 harus turun&rest
dan varian 2 harus menggunakan semacam konstruksi yang merusak untuk mendapatkan nama yang bagus.Begini cara saya melakukannya:
sementara saya adalah orang yang memperkenalkan
:filter-args
saya pribadi merasa jarang nyaman.sumber