İ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
.
:around
Seçeneği olan bir örnek
En genel durum :around
seçenek, bu yüzden bunun için bir örnek vereyim. ( WHERE
Mümkünse özel parametreler kullanmak muhtemelen daha iyidir , ancak birbirinizi eşdeğer bir :around
işlevle değiştirebilirsiniz
.)
Örnek olarak, her kullanımında hata ayıklamak find-file
istediğinizi print
ve 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-args
Gereksiz hale gelir, çünkü argümanlar tavsiye fonksiyonuna normal fonksiyon argümanları olarak iletilir (
WHERE
anlam ifade ettiği argümanlar için). ad-do-it
gibi 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 WHERE
değerler
Dokümantasyonu, add-function
tüm tavsiye yerlerinin (veya “birleştiricilerin”) ve neye eşdeğer olduklarının bir tablosunu içerir ve önerilen işleve lambda
eş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 WHERE
uygun 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 :around
her ş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-file
olarak
: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, lambda
doğ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-add
Eski sürümün aktif kalması için tavsiye tanımını tekrar tekrar çalıştırmadan veya riske atmadan riske sokabilirsiniz
( advice-add
değiştikçe çalışmak eski sürüm için
lambda
bir güncelleme olarak değil, yeni bir tavsiye olarak kabul edilecektir).
Yan sözler#'function
notasyonu için temelde eşdeğer
'function
farklı (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.