如何在Emacs中自动回答yes或no?

13
我将函数semantic-symref绑定到C-c C-r键上,代码如下: (global-set-key (kbd "C-c C-r") 'semantic-symref) 每次按下C-c C-r键时,会提示:

查找xxxxx的引用?(y或n)

如何让它自动回答“是”呢?我试着使用lambda函数,但失败了。 (global-set-key (kbd "C-c C-r") (lambda() (interactive) (semantic-symref "yes")))
3个回答

7
您可以这样使用semantic-symref:
建议您使用semantic-symref进行语义搜索。
(defadvice semantic-symref (around stfu activate)
      (flet ((yes-or-no-p (&rest args) t)
             (y-or-n-p (&rest args) t))
        ad-do-it))

请注意,您正在本地绕过所有确认,因此可能会捕获由语义-symref本身触发的其他问题。


警告:您正在本地绕过所有确认,因此可能会捕获由语义-symref本身触发的其他问题。

“flet”不是已经被认为过时了吗?应该使用“cl-flet”代替吗? - wsdookadr

2

@huitseeker的回答很简洁有效。 四年后,由于fletdefadvice已经过时,我编写了以下函数自动回答“是”。 也许对某些人有用。

(defun my/return-t (orig-fun &rest args)
  t)
(defun my/disable-yornp (orig-fun &rest args)
  (advice-add 'yes-or-no-p :around #'my/return-t)
  (advice-add 'y-or-n-p :around #'my/return-t)
  (let ((res (apply orig-fun args)))
    (advice-remove 'yes-or-no-p #'my/return-t)
    (advice-remove 'y-or-n-p #'my/return-t)
    res))

(advice-add 'projectile-kill-buffers :around #'my/disable-yornp)

2

要在不提示反馈的情况下运行函数,您可以使用宏,这有以下优点:

  • 它不会对该函数进行任何全局更改 (如advice所做的)。
  • 代码中的任何错误都不会导致建议保持启用状态 (虽然可以使用condition-case来防止)
(defmacro without-yes-or-no (&rest body)
  "Override `yes-or-no-p' & `y-or-n-p',
not to prompt for input and return t."
  (declare (indent 1))
  `(cl-letf (((symbol-function 'yes-or-no-p) (lambda (&rest _) t))
             ((symbol-function 'y-or-n-p) (lambda (&rest _) t)))
    ,@body))

这可以像这样绑定到一个键:

(这句话是关于IT技术的)

(global-set-key (kbd "C-c C-r")
  '(lambda ()
     (interactive)
     (without-yes-or-no
       (semantic-symref))))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接