Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix Vim执行命令并通过标准输出发送缓冲区_Unix_Vim - Fatal编程技术网

Unix Vim执行命令并通过标准输出发送缓冲区

Unix Vim执行命令并通过标准输出发送缓冲区,unix,vim,Unix,Vim,以下是如何以有趣的方式自动化vim: vim -c '0,$d | r source.txt | 1d | w | q' dest.txt 这将使用vimex命令擦除dest.txt,将source.txt读入缓冲区,擦除第一行(由于r的工作方式,第一行最后变成空行),写入文件(dest.txt),然后退出 这(据我所知)跳过了整个vim终端UI的加载,在概念上有点像有一个vimscript解释器 现在,我希望能够进一步利用vim的功能:我想要一个脚本来查看vim*.swp交换文件中存在的已打

以下是如何以有趣的方式自动化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
的功能:我想要一个脚本来查看vim
*.swp
交换文件中存在的已打开文件的当前编辑更改(作为交互式自动化shell脚本的一部分),通过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的配置,这是一个缺点,但在概念上和计算上会更简单,因为它已经有了可供编写的缓冲区内容,而且这样做应该更简单,因为我相信我们可以使用自动命令(尽管在保存交换文件之前是否运行自动命令仍有待观察)

不管是哪种方式,为了完整性,我很想知道是否存在一个ex命令来向vim的STDOUT写入内容,或者这是否有意义

我认为这可能没有意义,因为STDOUT必然是实际的终端,例如,它是vim发出“视图”的地方例如,如果任何
vim-c'vimscript commands'
命令产生vim错误,我将看到vim的终端输出,通过STDOUT显示这些错误

因此,使用一个文件可能是切实可行的,但可能会有一些疯狂,比如
!tee/dev/fd/3
我能做什么


此外,这种迂回的方法还有一个缺点,那就是vim提出了一个
警告:原始文件可能在鲜红色背景文本中被更改了大约一秒钟,这肯定是由于重命名了文件。我可能可以通过在子目录中执行此操作来解决这个问题,同时保留filenames相同。

这是
p
命令(以及
grep
p
的来源):


这可能有点像猫的文件,这很好。这并不是我所能预见到的。可能是重复的,或者虽然问题是重复的,但斯蒂芬·查泽拉斯下面的回答是对这两个问题给出的最基本的答案。这个评论实际上更像是一个自我提醒。这个问题的目的是构建一个系统的组件,我在Vim中编码,在另一个终端会话中,我有一个自动过程(我猜是在计时器上)复制并应用未撤销文件,以便临时获得文件的“实时版本”。然后,我生成一个diff,这样我就可以实时查看正在编写的代码的diff。然而,我发现没有必要使用这样的工具(以及它可能带来的CPU开销),因为它很容易跟踪事情。这是我想念MSV的一件事。
ex -sc '%p|q' file