如何在elisp中使用defadvice
覆盖交互式输入?
例如,我试图阻止ansi-term
提示输入以下内容:
(defadvice ansi-term (around kill-interactive activate)
(let ((explicit-shell-file-name "/bin/bash"))
(ad-set-arg 0 explicit-shell-file-name)
(deactivate-input-method)
ad-do-it))
但是,即使explicit-shell-file-name
设置正确,它仍会提示。
答案 0 :(得分:2)
该函数仍然具有原始的interactive
声明,因此如果您以交互方式调用它,它将使用它来获取参数值。
您可以将interactive
表单添加到您的建议中来替换它。 e.g:
(defadvice ansi-term (around kill-interactive activate)
(interactive (list "/bin/bash" nil))
ad-do-it)
确实,如果使用这样的建议,那么应设置参数值的确切位置,否则你会破坏非交互式的PROGRAM
值>使用ansi-term,这显然不是你想要的!
然而,我个人不会这样做。我将定义一个新的包装器命令,然后调用它:
(defun bash ()
"Run bash inside `ansi-term'."
(interactive)
(ansi-term "/bin/bash"))
如果你有ansi-term
的任何键绑定,那么你可以像这样重新映射它们:
(global-set-key [remap ansi-term] 'bash)