İhtiyacınız olan tüm bilgiler C-h f add-function, altında yatan mekanizmayı tanımlayan dahil edilmiştir advice-add.
Yeni öneri sistemi temelde, bir fonksiyonun mevcut tanımını C-h f add-function, WHERE
argüman seçiminize bağlı olarak , tabloda hangi fonksiyonun hangi kaynak dosyada tanımlanmış olduğunu izlemek amacıyla temizleyici olarak tanımlanmış olan fonksiyonla değiştirmek gibi davranır
.
:aroundSeçeneği olan bir örnek
En genel durum :aroundseçenek, bu yüzden bunun için bir örnek vereyim. ( WHEREMümkünse özel parametreler kullanmak muhtemelen daha iyidir , ancak birbirinizi eşdeğer bir :aroundişlevle değiştirebilirsiniz
.)
Örnek olarak, her kullanımında hata ayıklamak find-file
istediğinizi printve tartışma listesine girmek istediğinizi varsayalım. Yazabilirsin
(defun my-find-file-advice-print-arguments (old-function &rest arguments)
"Print the argument list every time the advised function is called."
(print arguments)
(apply old-function arguments))
(advice-add #'find-file :around #'my-find-file-advice-print-arguments)
Bu yeni uygulama ile tavsiyenin ihtiyaç duyduğu her şey argüman olarak kabul edilir. ad-get-argsGereksiz hale gelir, çünkü argümanlar tavsiye fonksiyonuna normal fonksiyon argümanları olarak iletilir (
WHEREanlam ifade ettiği argümanlar için). ad-do-itgibi gereksiz hale gelir :around, böylece, tavsiye argümanları fonksiyonu ve argümanlar olarak alır (ad-do-it)formu ile değiştirilir
(apply old-function arguments)
veya bağımsız değişkenleri adlandırdığınızda
(funcall old-function first-arg second-arg)
Hangi sihirli formlar olduğundan daha temizdir. Değişkenleri değiştirmek, değiştirilmiş değerleri geçirerek gerçekleşir OLD-FUNCTION.
Diğer WHEREdeğerler
Dokümantasyonu, add-functiontüm tavsiye yerlerinin (veya “birleştiricilerin”) ve neye eşdeğer olduklarının bir tablosunu içerir ve önerilen işleve lambdaeşdeğer bir davranış açısından işlevselliği açıklar :
`:before' (lambda (&rest r) (apply FUNCTION r) (apply OLDFUN r))
`:after' (lambda (&rest r) (prog1 (apply OLDFUN r) (apply FUNCTION r)))
`:around' (lambda (&rest r) (apply FUNCTION OLDFUN r))
`:override' (lambda (&rest r) (apply FUNCTION r))
`:before-while' (lambda (&rest r) (and (apply FUNCTION r) (apply OLDFUN r)))
`:before-until' (lambda (&rest r) (or (apply FUNCTION r) (apply OLDFUN r)))
`:after-while' (lambda (&rest r) (and (apply OLDFUN r) (apply FUNCTION r)))
`:after-until' (lambda (&rest r) (or (apply OLDFUN r) (apply FUNCTION r)))
`:filter-args' (lambda (&rest r) (apply OLDFUN (funcall FUNCTION r)))
`:filter-return'(lambda (&rest r) (funcall FUNCTION (apply OLDFUN r)))
(cited from `C-h f add-function')
FONKSİYON, bir tavsiye işlevidir ve OLDFUN, önerinin eklendiği işlevdir. Hepsini bir kerede anlamaya çalışmayın, sadece WHEREuygun görünen bir sembol seçin ve onu anlamaya çalışın.
Ya da sadece kullanın :around. Bildiğim kadarıyla uzman kullanarak tek avantajı söyleyebilirim WHEREüzerinde ler :aroundher şey için yukarı bakarak biraz daha fazla bilgi almak olmasıdır C-h f ADVISED-FUNCTION
öncesinde tavsiye docstring'ini okumaya. Tavsiyeyi içeren kodu yayınlamayı planlamıyorsanız, muhtemelen önemli değildir.
Adlandırılmış tavsiye fonksiyonları
Bir çok avantaj sağladığı için adlandırılmış fonksiyonları tavsiye olarak kullanmanızı öneririm (bazıları kancalarda adlandırılmış fonksiyonları kullanmak için de geçerlidir):
Bu renkte görünür C-h f find-fileolarak
:around advice: `my-find-file-advice-print-arguments'
Her zaman olduğu gibi tanımlandığı dosyaya bir bağlantı içeren tavsiye işlevinin tanımına bağlantı verir. Tavsiye, lambdadoğrudan formdaki bir form olarak tanımlanmış advice-add
olsaydı, dokümanlar satır içi (uzun dokümanlar için bir karışıklık?) Gösterilecek ve hiçbir şey nerede tanımlandığını göstermeyecekti.
İle tavsiyeyi kaldırabilirsiniz
(advice-remove #'find-file #'my-find-file-advice-print-arguments)
advice-addEski sürümün aktif kalması için tavsiye tanımını tekrar tekrar çalıştırmadan veya riske atmadan riske sokabilirsiniz
( advice-adddeğiştikçe çalışmak eski sürüm için
lambdabir güncelleme olarak değil, yeni bir tavsiye olarak kabul edilecektir).
Yan sözler#'function notasyonu için temelde eşdeğer
'functionfarklı (yazım hataları örneğin) bayt derleyici eksik fonksiyonları belirlemek oldukça fonksiyon adları gibi semboller tanımlamak ve yardımcı olması dışında,.
M-x report-emacs-bug. Bazı geliştiriciler bazen belgelemeyi geliştirmeyi tercih ediyor. ;-) Emacs'in belgenin kendisinin olması önemlidir.