用建议覆盖交互功能

Override interactive function with advice

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

该函数仍然有其原始的 interactive 声明,因此如果您以交互方式调用它,它将使用它来获取参数值。

您可以通过将 interactive 表格包含在您的建议中来替换它。例如:

(defadvice ansi-term (around kill-interactive activate)
  (interactive (list "/bin/bash" nil))
  ad-do-it)

事实上,如果使用这样的建议,那正是您 应该 设置参数值的地方,否则您将破坏 [=27= 的 PROGRAM 值]non-interactive 也使用 ansi-term,这显然不是你想要的!

不过,就我个人而言,我不会这样做。我会定义一个新的包装器命令,然后调用它:

(defun bash ()
  "Run bash inside `ansi-term'."
  (interactive)
  (ansi-term "/bin/bash"))

如果您有 ansi-term 的任何键绑定,您可以像这样重新映射它们:

(global-set-key [remap ansi-term] 'bash)