2013-08-05 133 views
0

我有一个vim脚本,我正在采购--cmd "source path/to/file.vim"。完整的命令有点长,最后的命令是像这样退出vim。从Vim捕获标准输出的回显

vim --cmd 'source path/to/file1.vim' [... source other files] --cmd ':q' 

在这些文件中,我做了一些处理,输出信息与echomsg Vim的。我想要将这些消息捕获到stdout

问题是这种处理中的一些需要睡一会儿sleep。但是,执行sleep会导致vim重新绘制屏幕。因此,最初回显的消息在此屏幕重绘中部分清除。

一旦我退出Vim,我可以看到消息在shell中按顺序正确输出,但是间歇性重画使得显示乱了。

我想到的一种解决方法是使用writefile将消息写入文件而不是使用stdout,但后来我失去了显示进度的能力。

有没有更好的方法从vimscript捕获到标准输出的echo'ed消息?我想在消息发生时显示这些消息,因为这些消息都是进度消息。

谢谢。

+0

的可能重复[重定向前命令STDOUT在vim(http://stackoverflow.com/questions/16739300/redirect -EX-命令到标准输出入-VI m) – glts

+0

另请参阅[Vim执行命令并通过stdout发送缓冲区](http://stackoverflow.com/q/17266098)。 – glts

+0

这两个都是很好的答案,但不能解决问题。对于1.我不能使用'-s',因为vimrc抑制。 2. vim退出后,管道将无法工作。我希望屏幕在发送消息时进行更新,以显示进度。主要问题是'睡眠'触发器重绘,清除之前发送的回显消息。 –

回答

0

后来的重画可能使消息消失,所以要避免,你可能会迫使redraw,例如:

:new | redraw | echo "there is a new window" 

或检查lazyredraw而不是按照意见。

要捕获的回声(或其他消息)到标准输出,你可以使用redir命令,如:

$ ex +"redir>>/dev/stdout | echomsg 'foo' | redir END" -scq! 
foo 

如果你感兴趣的信息有关哪些文件来源,使用-V参数,所以您的留言(echomsg)将被显示出来,而无需任何重定向,如:

$ ex -V +"echomsg 'foo'" -scq! 
... 
Searching for "vimfiles/after/plugin/**/*.vim" 
Searching for ".vim/after/plugin/**/*.vim" 
foo