以下是如何以一种有趣的方式自动化 vim:
vim -c '0,$d | r source.txt | 1d | w | q' dest.txt
这使用vim
ex 命令来擦除dest.txt
,读source.txt
入缓冲区,擦除第一行(由于工作方式而最终成为空行r
),写入文件(dest.txt),然后退出。
这(据我所知)跳过了整个 vim 终端 UI 的加载,并且在概念上有点像拥有 vimscript 解释器。
现在我希望能够更进一步地滥用以下功能vim
:我想要一个脚本来查看当前已编辑的已打开文件的更改(作为交互式自动化 shell 脚本的一部分) vim*.swp
交换文件,通过 vim 的命令应用更改recover
,然后获取输出。
当然,使用实际文件是非常有用的,例如 orig_file.txt 正在另一个终端的 vim 中编辑;我的脚本可以在检测到交换文件更改的每一点执行此操作:
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 的配置,这是一个缺点,但它在概念上和计算上会更直接,因为它已经有可供写入的缓冲区内容,而且这样做应该很简单因为我相信存在我们可以使用的自动命令(尽管该自动命令是否在保存交换文件之前运行仍有待观察)。
无论哪种方式,为了完整起见,我很想知道是否存在将内容写入 vim 的 STDOUT 的 ex 命令。或者,如果这甚至有任何意义。
我认为这可能没有意义,因为 STDOUT 必然是实际的终端,例如 vim 将其 UI 和缓冲区的“视图”以及所有内容发送到终端的地方。因此,例如,如果任何vim -c 'vimscript commands'
命令产生 vim 错误,我将看到 vim 的终端输出以通过 STDOUT 显示这些错误。
因此,仅使用文件可能是可行的。但也许有一些像!tee /dev/fd/3
我一样的疯狂?
另外,这种迂回的做法有一个问题,就是vimWarning: Original file may have been changed
在亮红色背景文本中出现错误大约一秒钟,这肯定是由于重命名文件造成的。我可以通过在子目录中执行此工作同时保持文件名相同来解决此问题。