Làm thế nào tôi có thể loại bỏ một lời khuyên không tên?


12

Tôi đã rất vui khi thêm một số lời khuyên cho một chức năng:

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

Ouch, một lỗi đánh máy. Đã sửa nó và đánh giá mã trên một lần nữa. Nhưng bây giờ tôi có cả hai, lời khuyên "đã sửa" và "hỏng" xung quanh chức năng đó.

Làm thế nào để tôi thoát khỏi những điều này? Cho rằng advice-removecần phải có đối tượng chức năng hoặc lời khuyên xung quanh (mà trống ở đây)?

(Rõ ràng là tôi có thể thoát ra và khởi động lại, nhưng có một cách khác, phải không?)

Câu trả lời:


7

Bạn cũng có thể gọi advice-removevới biểu thức lambda cùng, tức là, thay thế advice-addvới advice-removevà xóa :around, sau đó C-x C-e.


Những công việc này! Tôi nghĩ rằng nó sẽ không, tôi giả sử rằng (1) mỗi khi bạn đánh giá một biểu mẫu lambda bạn sẽ nhận được một chức năng mới không phải eqvới các chức năng trước đó, (2) lời khuyên loại bỏ sẽ so sánh chức năng bạn chuyển nó với lời khuyên cho đến khi tìm thấy một trong số đó là eqvà loại bỏ điều đó, (3) ngay cả khi lời khuyên loại bỏ đã sử dụng một thử nghiệm khác, như equal, nó vẫn không hoạt động, bởi vì các đánh giá khác nhau về hình thức lambda sẽ không equalkhác nhau. Hóa ra (1) là đúng, nhưng (2) và (3) sai: sử dụng lời khuyên loại bỏ equalvà đánh giá lambdahai lần giống nhau tạo ra equalkết quả!
Omar

Nhận thấy tôi đã không chấp nhận một câu trả lời khi tôi đặt câu hỏi. Tôi chọn bạn vì đó là IMO hữu ích nhất trong tình huống.
Daniel Jour

11

advice-mapc, chúng ta hãy lặp đi lặp lại tất cả các lời khuyên của một số chức năng, áp dụng một chức năng nhất định cho từng chức năng. Với nó, thật dễ dàng để loại bỏ tất cả các lời khuyên:

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

Điều này có thể được mở rộng để loại bỏ chỉ những lời khuyên không có thuộc nametính bằng cách tìm trong propsđối số thứ hai ( ) là tồn tại) đối với những người không có liên quan đến khóa name.


Đúng. Và sử dụng namelàm cho việc loại bỏ dễ dàng hơn.
vẽ

1

Đây là một số mã để giúp làm điều đó, tương tác.

Điều này xác định hai chức năng. Hàm đầu tiên nhận được danh sách tất cả các lời khuyên trên một biểu tượng nhất định, hàm thứ hai tương tác yêu cầu một biểu tượng và một lời khuyên về biểu tượng đó, sau đó loại bỏ biểu tượng sau khỏi biểu tượng trước. Vì tất cả điều này xảy ra khi hoàn thành, nó dễ dàng hơn (với tôi) so với việc sao chép biểu thức lambda.

(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))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.