2013-06-23 57 views
1

这里是如何在一个有趣的方式自动完成VIM:Vim中执行一个命令,发送缓冲区在标准输出

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

它使用vim前命令来删除dest.txt,读source.txt入缓冲区,擦除第一线(由于r工作方式的缘故,它最终以空行结束),写入文件(dest.txt),然后退出。

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

现在我希望能够进一步采取这一行动来滥用vim的功能:我希望脚本能够对当前编辑的打开文件的更改进行同步(作为交互式自动化shell的一部分脚本)其中存在的vim *.swp swapfiles,apply通过vim的recover命令进行更改,然后获取输出。

当然,使用实际文件是完全有用的,例如,在另一个终端的vim中正在编辑orig_file.txt;我的脚本可以在被检测的交换文件来改变每个点做到这一点:

cp orig_file.txt orig_file_ephemeral.txt 
cp .orig_file.txt.swp .orig_file.txt_ephemeral.txt.swp 
vim -c 'recover | w | q' 

此时orig_file_ephemeral.txt应包含在其中编辑正在发生的其他过程vim的缓冲区的内容,并且我们获得了这个数据而不需要与所述过程直接交互。这是整洁。

当然,为了实际的目的,做到这一点可能更有意义,并且只让主vim参与进程。它会将脚本的功能拆分为vim的配置,这是一个缺点,但它在概念和计算上会更直接,因为它已经有缓冲区内容可供写入,并且它应该很直接因为我相信存在一个我们可以使用的自动命令(尽管该自动命令是否在保存交换文件之前运行或者还没有被看到)。

无论哪种方式,为了完整起见,我很想知道是否存在ex命令将内容写入vim的标准输出。或者,如果这甚至是有道理的。

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

因此,使用文件可能是实用的。但也许有一些像我可以做的!tee /dev/fd/3疯狂吗?

此外,这种迂回方法有一个皱纹,那就是vim在明亮的红色背景文本中出现Warning: Original file may have been changed错误大约一秒钟,这肯定是由于重命名该文件造成的。我可以通过在子目录内部完成这项工作来解决这个问题,同时保持文件名相同。

+0

尝试'0r source.txt' – kev

+0

哦,那很好。并不是说我会预见它会利用这一点。 ;-) –

+1

[重定向ex命令到vim中的标准输出](http://stackoverflow.com/questions/16739300/redirect-ex-command-to-stdout-in-vim)或[写入缓冲区内容to stdout](http://stackoverflow.com/questions/3219479/vim-write-buffer-content-to-stdout) –

回答

2

这就是p命令(凡在grepp来自):

ex -sc '%p|q' file 

将是一个有点像cat file

相关问题