Adsız bir tavsiyeyi nasıl kaldırabilirim?


12

Bir işleve bazı tavsiyeler ekleyerek eğleniyordum:

(advice-add 'executable-find :around
            (lambda (f &rest args)
              (apply g args)))
               ;;;   ^

Ah, bir yazım hatası. Düzeltildi ve yukarıdaki kod tekrar değerlendirildi. Ama şimdi, bu fonksiyonun etrafında "düzeltilmiş" ve "kırık" tavsiyeye sahibim.

Bunlardan nasıl kurtulurum? advice-removeBu fonksiyon nesnesi ya da (burada boş olan) etrafında tavsiye gerekir göz önüne alındığında ?

(Açıkçası bırakıp yeniden başlatabilirim, ama başka bir yol var, değil mi?)

Yanıtlar:


7

Ayrıca arayabilir advice-remove, yani aynı lambda ifadesi ile değiştirin advice-addile advice-removeve silme :aroundsonra, C-x C-e.


Bu çalışıyor! (1) Bir lambda formunu her değerlendirdiğinizde eq, öncekilere değil yeni bir işlev elde edeceğinizi düşündüm , (2) tavsiye kaldırma, bulduğunuza kadar onu tavsiye ettiğiniz işlevi karşılaştırır. biri olan eqve bunu kaldıran, (3) tavsiye kaldırma farklı bir test kullansa bile equal, yine de işe yaramaz, çünkü lambda formunun farklı değerlendirmeleri equalbirbirini tutmazdı. (1) doğrudur, ancak (2) ve (3) yanlıştır: tavsiye kaldırma kullanımları equalve aynı lambdaiki kez değerlendirmek equalsonuç verir!
Omar

Soruyu sorduğumda bir cevabı kabul etmediğimi fark ettim. Seninkini seçtim çünkü bu durum en yararlı IMO.
Daniel Jour

11

Biri advice-mapc, bir işlevin tüm tavsiyelerini yineleyip, her birine belirli bir işlev uygulayarak var. Bununla birlikte, tüm önerileri kaldırmak kolaydır:

(advice-mapc
  (lambda (adv prop)
    (advice-remove 'executable-find adv))
  'executable-find)

Bu, yalnızca anahtarla ilişkili bir şey olmayanlar nameiçin ikinci ( props) argümanına (bir alist olan) bakılarak bir özelliği olmayan önerileri kaldırmak için genişletilebilir name.


Evet. Ve bir kullanarak namekaldırmak kolaylaştırır.
Drew

1

İşte bunu etkileşimli olarak yapmanıza yardımcı olacak bazı kodlar.

Bu iki işlevi tanımlar. İlk işlev, belirli bir sembol üzerindeki tüm önerilerin listesini alır, ikinci işlev etkileşimli olarak bir sembol ve bu sembol hakkında bir tavsiye ister, ardından ikincisini öncekinden kaldırır. Tüm bunlar tamamlanınca, lambda ifadesini kopyalamaktan (benim için) daha kolay.

(defun yf/advice-list (symbol)
  (let (result)
    (advice-mapc
     (lambda (ad props)
       (push ad result))
     symbol)
    (nreverse result)))

(defun yf/kill-advice (symbol advice)
  "Kill ADVICE from SYMBOL."
  (interactive (let* ((sym (intern (completing-read "Function: " obarray #'yf/advice-list t)))
                      (advice (let ((advices-and-their-name
                                     (mapcar (lambda (ad) (cons (prin1-to-string ad)
                                                                ad))
                                             (yf/advice-list sym))))
                                (cdr (assoc (completing-read "Remove advice: " advices-and-their-name nil t)
                                            advices-and-their-name)))))
                 (list sym advice)))
  (advice-remove symbol advice))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.