Làm thế nào để trả lời lập trình ngay lập tức có đúng với các lệnh nhắc nhở quyết định từ người dùng?


8

Tôi đã thực hiện một chức năng tùy chỉnh mà kết hợp hai chức năng của twittering-mode , twittering-favoritetwittering-native-retweet, tuy nhiên hai nhu cầu đầu vào từ tôi bằng cách trả lời một câu hỏi có hoặc không.

Tôi muốn biết liệu có cách nào để bọc hai chức năng đó bằng thứ gì đó sẽ khiến chúng nhận được câu trả lời mà không cần sự can thiệp trực tiếp của tôi không.


8
Tôi không sử dụng 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ời yes), 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à yescâu trả lời sẽ gây ra để được gọi. (Chỉ là một gợi ý.)
vẽ

Tiêu đề là sai lệch vì điều này không thể được thực hiện đúng theo cách chung chung.
wasamasa

Câu trả lời:


7

EDIT: Như @hatschipuh đã chỉ ra trong các bình luận, việc fletxâ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-fletsử dụng phạm vi từ vựng, vì vậy bạn sẽ cần nofletgó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-modecậ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)

Điều này sẽ không sửa đổi hành vi của các chức năng mà tôi muốn có hành vi khác (chỉ) trong chức năng tùy chỉnh của mình chứ?
shackra

Vâng, đó không phải là những gì bạn muốn?
Aaron Harris

Chà, không chính xác, thay đổi hành vi của cả hai lệnh ở mọi nơi là điều tôi không cảm thấy thoải mái với :(
shackra

1
Tôi nghĩ rằng tôi có thể đã đọc sai nhận xét trước đó của bạn. Các lời nhắc duy nhất được bỏ qua là những người bên trong lệnh gọi hàm được gói. Để giúp làm rõ, tôi đã thêm một ví dụ sử dụng cho câu trả lời.
Aaron Harris

1
Những điều sau đây về cơ bản giống nhau và tôi nghĩ là một sự thay thế tốt:(flet ((yes-or-no-p (prompt) t) (y-or-n-p (prompt) t)) body...)
clemera
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.