ฉันจะลบคำแนะนำที่ไม่มีชื่อออกได้อย่างไร


12

ฉันสนุกกับการเพิ่มคำแนะนำลงในฟังก์ชั่น:

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

อุ๊ยพิมพ์ผิด แก้ไขและประเมินโค้ดข้างต้นอีกครั้ง แต่ตอนนี้ฉันมีทั้งคำแนะนำ "แก้ไข" และ "แตก" รอบฟังก์ชันนั้น

ฉันจะกำจัดสิ่งเหล่านี้ได้อย่างไร ระบุว่าadvice-removeต้องการฟังก์ชั่นวัตถุหรือคำแนะนำรอบ ๆ

(เห็นได้ชัดว่าฉันสามารถออกจากและรีสตาร์ท แต่มีวิธีอื่นใช่หรือไม่)

คำตอบ:


7

นอกจากนี้คุณยังสามารถเรียกadvice-removeกับการแสดงออกแลมบ์ดาเดียวกันกล่าวคือแทนที่advice-addด้วยadvice-removeและลบแล้ว:aroundC-x C-e


มันใช้งานได้! ฉันคิดว่ามันคงไม่ฉันคิดว่า (1) ทุกครั้งที่คุณประเมินรูปแลมบ์ดาที่คุณได้รับฟังก์ชั่นใหม่ไม่ใช่eqหน้าที่ก่อนหน้า (2) คำแนะนำการลบจะเปรียบเทียบฟังก์ชั่นที่คุณส่งให้คำแนะนำจนกว่าจะพบ สิ่งหนึ่งที่อยู่eqในนั้นและลบนั้น (3) แม้ว่าคำแนะนำในการลบใช้การทดสอบที่แตกต่างกันเช่นequalมันยังคงใช้งานไม่ได้เพราะการประเมินรูปแบบแลมบ์ดาที่แตกต่างกันจะไม่equalกันและกัน ปรากฎว่า (1) ถูกต้อง แต่ (2) และ (3) ไม่ถูกต้อง: แนะนำให้ลบการใช้equalและประเมินผลlambdaสองครั้งเหมือนกันequal!
โอมาร์

สังเกตเห็นฉันไม่ยอมรับคำตอบกลับเมื่อฉันถามคำถาม ฉันเลือกของคุณเพราะมันเป็น IMO ที่มีประโยชน์มากที่สุดในสถานการณ์นี้
Daniel Jour

11

ที่นั่นadvice-mapcเราจะทำซ้ำคำแนะนำทั้งหมดของฟังก์ชั่นโดยใช้ฟังก์ชั่นที่กำหนดให้กับแต่ละฟังก์ชั่น ด้วยมันง่ายที่จะลบคำแนะนำทั้งหมด:

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

ซึ่งอาจจะขยายไปถึงลบเฉพาะคำแนะนำซึ่งไม่ได้มีnameทรัพย์สินโดยมองในครั้งที่สอง (คนprops) อาร์กิวเมนต์ (ซึ่งเป็น alist) nameสำหรับผู้ที่ไม่ได้มีบางสิ่งบางอย่างที่เกี่ยวข้องกับคีย์


ใช่. และการใช้ a nameทำให้การถอดง่ายขึ้น
Drew

1

นี่คือรหัสบางส่วนที่จะช่วยทำสิ่งนั้นแบบโต้ตอบ

สิ่งนี้นิยามสองหน้าที่ ฟังก์ชั่นแรกได้รับรายชื่อของคำแนะนำทั้งหมดในสัญลักษณ์ที่กำหนดฟังก์ชั่นที่สองโต้ตอบถามหาสัญลักษณ์และคำแนะนำเกี่ยวกับสัญลักษณ์นั้นแล้วลบหลังจากอดีต เมื่อทั้งหมดนี้เกิดขึ้นเมื่อการทำให้สมบูรณ์มันง่ายกว่า (สำหรับฉัน) มากกว่าการคัดลอกการวางแลมบ์ดา

(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))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.