0

如何使用defadviceelisp 覆盖交互式输入?

例如,我试图停止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设置正确,它仍然会提示。

4

1 回答 1

2

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

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

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

事实上,如果使用这样的建议,这正是你应该设置参数值的地方,否则你也会破坏ansi-term 的非交互式PROGRAM使用的值,这显然不是你想要的!

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

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

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

(global-set-key [remap ansi-term] 'bash)
于 2016-10-07T06:40:46.933 回答