EDIT: Như @hatschipuh đã chỉ ra trong các bình luận, việc flet
xây dựng kiểu chữ đơn giản hơn và không phụ thuộc vào macro lời khuyên bình dị của tôi. Ít nhất là trên Emacs của tôi (24.5.1), cl-flet
sử dụng phạm vi từ vựng, vì vậy bạn sẽ cần noflet
gói cho đoạn mã sau hoạt động. Cuộn xuống cho câu trả lời ban đầu, bình dị.
(defun my/bypass-confirmation (function &rest args)
"Call FUNCTION with ARGS, bypassing all `y-or-n-p' prompts."
(require 'noflet)
(noflet
((y-or-n-p (prompt) t))
(apply function args)))
(defun my/bypass-confirmation-all (function &rest args)
"Call FUNCTION with ARGS, bypassing all prompts.
This includes both `y-or-n-p' and `yes-or-no-p'."
(require 'noflet)
(noflet
((y-or-n-p (prompt) t)
(yes-or-no-p (prompt) t))
(apply function args)))
EDIT: Đây là câu trả lời ban đầu, ngoại trừ việc tôi đã sửa my/bypass-confirmation-all
để hoạt động như quảng cáo và thay đổi các quy ước gọi một chút.
Đây là một trình bao bọc chung nên hoạt động cho bất kỳ chức năng nào.
(defun my/bypass-confirmation (function &rest args)
"Call FUNCTION with ARGS, bypassing all `y-or-n-p' prompts."
(my/with-advice
((#'y-or-n-p :override (lambda (prompt) t)))
(apply function args)))
(defun my/bypass-confirmation-all (function &rest args)
"Call FUNCTION with ARGS, bypassing all prompts.
This includes both `y-or-n-p' and `yes-or-no-p'."
(my/with-advice
((#'y-or-n-p :override (lambda (prompt) t))
(#'yes-or-no-p :override (lambda (prompt) t)))
(apply function args)))
Mã này phụ thuộc vào macro này, dường như là giải pháp tiếp theo của tôi cho mọi thứ trên Stackexchange.
(defmacro my/with-advice (adlist &rest body)
"Execute BODY with temporary advice in ADLIST.
Each element of ADLIST should be a list of the form
(SYMBOL WHERE FUNCTION [PROPS])
suitable for passing to `advice-add'. The BODY is wrapped in an
`unwind-protect' form, so the advice will be removed even in the
event of an error or nonlocal exit."
(declare (debug ((&rest (&rest form)) body))
(indent 1))
`(progn
,@(mapcar (lambda (adform)
(cons 'advice-add adform))
adlist)
(unwind-protect (progn ,@body)
,@(mapcar (lambda (adform)
`(advice-remove ,(car adform) ,(nth 2 adform)))
adlist))))
Cho dù mã này là cách thông minh nhất để xử lý tình huống này, tôi không biết. Nói chung, tôi thích sử dụng loại lời khuyên tạm thời này để sửa đổi các chức năng hiện có thay vì sao chép mã của các chức năng ban đầu, một phần vì nó giúp chứng minh chức năng sửa đổi của bạn trong tương lai chống lại các thay đổi không liên quan trong bản gốc. Nhưng trong trường hợp này, bạn có thể cần phải cẩn thận hơn, bởi vì nếu twittering-mode
cập nhật và thay đổi lời nhắc hoặc thêm một lần nữa, bạn sẽ không thấy các thay đổi. Vì dấu nhắc y-hoặc-n chỉ ra lựa chọn gây tranh cãi, điều đó có thể gây ra hậu quả đáng tiếc.
EDIT: Tôi nhận thấy rằng một ví dụ về việc sử dụng có thể hữu ích. Ví dụ này hoạt động với cả hai thực hiện.
(defun my/twittering-function ()
;; This will bypass `y-or-n-p' in both commands.
(my/bypass-confirmation #'twittering-favorite arg)
(my/bypass-confirmation #'twittering-native-retweet)
;; This will bypass both `y-or-n-p' and `yes-or-no-p' in this command.
(my/bypass-confirmation-all #'twittering-favorite arg)
;; Prompts in this call are not bypassed.
(twittering-native-retweet)
twittering-mode
(và tôi sẽ không bận tâm truy cập mã), nhưng như một lời khuyên chung: Thông thường, thay vì làm những gì bạn đề xuất (tạo mã mô phỏng người dùng trả lờiyes
), tốt hơn là tạo mã trực tiếp sử dụng mã mong đợi câu trả lời. IOW, hãy thử tận dụng đường dẫn mã nguồn màyes
câu trả lời sẽ gây ra để được gọi. (Chỉ là một gợi ý.)