以下是如何以有趣的方式自动化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
错误大约一秒钟,这肯定是由于重命名文件。我可以通过在子目录中完成这项工作来解决这个问题,同时保持文件名相同。
答案 0 :(得分:2)
这是p
命令(以及p
中的grep
来自的位置):
ex -sc '%p|q' file
有点像cat file
。