作为 emacs 缓冲区启动交互式 shell 命令

作为 emacs 缓冲区启动交互式 shell 命令

我想在 Emacs 中运行一个 shell 命令,在继续操作之前询问几个交互问题。我正在寻找的功能类似于xterm -e <command>,只是会打开一个 Emacs 窗口。它不需要太多的终端仿真功能(基本上就是按几次“y”),但仍需要键盘输入。有办法做到这一点吗?

我已经尝试使用termansi-term;当给出不同于 /bin/bash 的命令时,两者都会立即关闭,而没有留下任何时间来读取问题所在。

答案1

简短回答:

M-x terminal-emulator

听起来就像你想要的一样。

需要y可能会有所不同 - 如果您真的只需要在 stdin 上给程序一系列行,请考虑yes | program。 如果程序确实希望其 stdin 是 tty,请考虑使用expect

答案2

您可以制作一个 emacs 编辑宏(“emacs”这个名称即源于“编辑宏”),并在键盘宏中放入运行 Gnu Bash 脚本或其他 shell 程序的命令,并创建向用户查询 Y 或 N 答案的脚本。

因此,要创建宏,您可以执行以下操作:

Cx (
Mx new-frame return
Mx shell return (or just Mx eshell return--to use the emacs built-in shell)
bash <bash-program-that-queries-end-user-for-Y-or-N-answers> &
Mx delete-frame
Cx )

保存宏并将其放入可供重复使用的 emacs lisp 程序中。

当然,从那时起,该宏就可以在 emacs 中使用,或者您可以像任何其他程序一样,从命令行将整个宏作为批处理文件运行。

其他工具和建议:查看 emacs 递归编辑(停止并重新启动宏并为最终用户提供时间来回答问题甚至编辑内容)和 emacs 内置函数 message-or-box 或只是消息函数。您可以使用 tkquery(一个易于设置的 Tcl/Tk 程序,用于查询用户的输入数据)和/或使用 zenity 制作简单的图形交互框,这些框易于编程且易于最终用户使用。

您可以在 Gnu Make 中创建一个问答例程并在 Gnu Emacs 中运行它。要执行此操作并与正在运行的 Make 会话进行交互,您可以使用 process-send-string,就像我的一个 makefile 中的这段摘录一样:

echo "(process-send-string \"*compilation*\" \" \\n \") "

我的意思是,您可以使用 emacs process-send-string 函数与在 Gnu Emacs 缓冲区内运行的 Gnu Make 程序进行通信并回答 Y 或 N 问题。

最后,回到你的问题,你想知道为什么xterm -e <your-program>会很快终止:你可以做类似emacs -l <emacs-lisp-file-with-question-and-answer-macro-in-it> & disownand/or 的事情xterm -e <your-program-which-queries-the-end-users> & disown。但这取决于你想如何运行程序,作为同步还是异步过程;我的意思是,当最终用户回答问题时,你是否想阻止程序运行?

有了这些工具,我想您就可以用 Gnu Emacs 得到您想要的东西;而且,由于 Gnu Emacs 是可扩展的,您当然可以让它以某种方式做您想做的事情 — — 如果您通过自己编程来扩展它。

相关内容