如何从vim中的进程重复读写?

时间:2014-02-22 23:08:42

标签: vim inter-process-communicat

很难将此作为一个问题,但这就是我想要做的事情:

我希望vim执行一个进程并写入其stdin并重复读取其stdout文件描述符。换句话说,我想要在vim和另一个程序之间进行反复对话。

我将使用cat作为一个简单的例子。如果你运行没有命令行参数的cat,那么你在stdin上输入的内容就会在每个换行符之后输出到stdout。

我想要的是有一个vim窗口,它显示某些程序的最新输出,并能够在某些事件时写入其stdin。所以,不像以下那样:

:read !cat

等待你完成输入并按Ctrl-D关闭cat的标准输入,我想在输入后立即显示输出并保持进程运行以便我可以输入更多。

最终,我不打算输入流程的输入;我希望事件(例如移动光标)触发vim将特定命令写入此过程并显示输出。

我希望程序继续运行而不是为每个事件调用一次进程的原因是程序的输出将是生成状态的命令。如果必须为每个命令调用程序,则必须将状态保存到文件中并每次都读取它。

我正在考虑的另一种选择:编写程序来监听端口。然后,vim调用一个命令,该命令只是打开套接字并将vim命令传递给程序并从程序返回消息。这需要我编写两个程序,我希望这是不必要的。

我在这里要做的是编写一个分析代码的工具,并提供一个交互式命令行界面(例如,像“输出设置此变量的所有行的列表”之类的命令。)而不是在单独的终端或屏幕会话中运行该程序,我希望vim能够在窗口中集成该程序的输出,如果可能的话。

1 个答案:

答案 0 :(得分:1)

你应该看看vimproc。您可以使用vimproc#popen3开始此过程。 vimproc#popen3返回一个对象(=字典),其中stdin成员字段具有write方法,stdout成员字段具有read方法。< / p>

问题是如何触发读写。 Vim是单线程,因此您必须依赖autocmd事件。显然你会想在每次写东西时尝试阅读(以防万一),但你也应该使用CursorHold事件。

您也可以使用Python进行IO。虽然看起来你可以使用Python线程来触发读取,但我建议反对它,因为Vim从来没有为多线程构建,根据我的经验,尝试使用Python线程破解多线程通常会导致竞争条件并导致Vim崩溃。