Vim执行命令并通过stdout发送缓冲区

时间:2013-06-23 22:59:29

标签: unix vim

以下是如何以有趣的方式自动化vim:

vim -c '0,$d | r source.txt | 1d | w | q' dest.txt

这使用vim ex命令删除dest.txt,将source.txt读入缓冲区,删除第一行(由于{{1}的方式,最后一行为空行工作),写入文件(dest.txt),然后退出。

这(据我所知)从加载中跳过整个vim终端UI,概念上有点像使用vimscript解释器。

现在我希望能够进一步滥用r的功能:我想要一个脚本来查看当前编辑的已打开文件的更改(作为交互式自动化shell脚本)存在于vim vim交换文件中,通过vim *.swp命令应用更改,然后获取输出。

当然,使用实际文件是完全可以服务的,例如orig_file.txt正在另一个终端的vim中编辑;我的脚本可以在检测到交换文件发生变化的每个点上执行此操作:

recover

此时cp orig_file.txt orig_file_ephemeral.txt cp .orig_file.txt.swp .orig_file.txt_ephemeral.txt.swp vim -c 'recover | w | q' 应包含来自正在进行编辑的其他进程的vim缓冲区的内容,并且我们获得此数据而无需与所述进程进行任何直接交互。哪个很整洁。

当然,出于实际目的,做到这一点可能更有意义,只需要让主vim参与这个过程。它会将脚本的功能分解为vim的配置,这是一个缺点,但它在概念和计算上会更直接,因为它已经有了可以随时用于写入的缓冲区内容,并且它应该是直截了当的因为我相信存在一个我们可以使用的自动命令(尽管在保存交换文件之前是否运行了自动命令仍然有待观察)。

无论哪种方式,为了完整起见,我很想知道是否存在将命令写入vim的STDOUT的ex命令。或者,如果这甚至有意义。

我认为这可能没有意义,因为STDOUT必然是真正的终端,例如它是vim向终端发送其UI和缓冲区以及所有内容的“视图”的地方。因此,例如,如果任何orig_file_ephemeral.txt命令产生vim错误,我将看到vim的终端输出在STDOUT上显示这些错误。

因此,使用文件可能是切合实际的。但也许有某种疯狂,比如vim -c 'vimscript commands'我能做什么?

此外,这种环形交叉方法存在皱纹,即vim在亮红色背景文本中出现!tee /dev/fd/3错误大约一秒钟,这肯定是由于重命名文件。我可以通过在子目录中完成这项工作来解决这个问题,同时保持文件名相同。

1 个答案:

答案 0 :(得分:2)

这是p命令(以及p中的grep来自的位置):

ex -sc '%p|q' file

有点像cat file