我有一个外部命令行程序,我想从elisp调用。使用shell命令这很容易,但是当命令行程序是交互式时它无法正常工作,在我的特定情况下它是:当我调用它时,被调用的脚本在读取stdin时看到EOF:
;; upload command is a string with the name of
;; a python script and some args
(shell-command upload-command
(get-buffer-create "*upload output*")))))
upload-command标识的python脚本可能会询问一些是/否问题,并且可能会提示输入密码,我想要屏蔽输入。理想情况下,所有这些互动都会发生在迷你缓冲区内。
我如何安排事情,以便在通过elisp调用时,我的外部交互式命令通过迷你缓冲区与用户交互?
答案 0 :(得分:6)
最简单的方法是使用make-comint
或make-comint-in-buffer
:
(make-comint-in-buffer "upload-script-process" "*upload output*" upload-command)
这将在像shell
缓冲区这样的缓冲区中运行脚本,因此它不能满足在迷你缓冲区中进行所有交互的要求。但是,如果密码提示符与comint-password-prompt-regexp
匹配, 将自动从迷你缓冲区中以掩码形式读取密码。
请注意,此示例中的upload-command
必须是exec-path
上可执行文件的名称。脚本的任何额外开关或其他参数都必须作为字符串参数传递给make-comint
:
(make-comint-in-buffer "upload-script-process" "*upload output*"
upload-command nil "--verbose" "--other-option")
有关详细信息,请参阅Emacs文档。