用建议覆盖交互功能
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)
如何在 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)