通过建议覆盖交互功能

时间:2016-10-07 01:14:23

标签: emacs defadvice

如何在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设置正确,它仍会提示。

1 个答案:

答案 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)