2012-12-02 122 views
3

我有一个外部命令行程序,我想从elisp中调用。这对于s​​hell命令来说很简单,但当命令行程序是交互式时它不能正常工作,在我的具体情况下它是这样的:被调用的脚本在读取stdin时看到EOF,当我这样称呼它时:从elisp正确调用交互式脚本

;; upload command is a string with the name of 
    ;; a python script and some args 
    (shell-command upload-command 
       (get-buffer-create "*upload output*"))))) 

上传命令标识的python脚本可能会询问一些是/否的问题,它可能会提示输入密码,为此我想要屏蔽输入。理想情况下,所有这些交互都会发生在小缓冲区内。

如何通过elisp调用外部交互式命令以便通过minibuffer与用户交互?

回答

6

最简单的方法是使用两种make-comintmake-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的文档了解更多信息。