如何将vim命令的结果输出到shell


11

假设我在shell(bash)中,希望看到:scriptnames可以提供的输出,但是不想启动vim,或者我想将其回显到另一个文件中。

所以我执行

vim +scriptnames

这向我显示了所有脚本,但是如何将其回显到Shell的stdout中呢?

Answers:


10

发生这种情况是因为通常Vim会切换到备用屏幕并在那里工作。退出后,Vim会切换回去,因此您看不到Vim会话中留下的任何东西,但是即使在启动Vim之前执行命令的结果也是如此。

(链接)中解释了此功能:h xterm-screens

因此,您基本上不希望这样做,因此希望将其禁用。您可以通过将:set t_ti= t_te=执行此操作的终端代码设置为空来执行此操作。

放在一起,您将要像这样启动Vim:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

我们正在重置该'more'选项,以使您看不到提示输入的提示。


1
太好了,非常感谢!我实际上怀疑这是否可能。
hgiesel

通过使VimL写入stdout(特别是受虐狂),是否可以将VimL用作完整的系统脚本语言?
shadowtalker '16

1
一个问题是我无法滚动终端。(如果文本长于终端高度,则看不到顶部)。如果我打开vim然后退出,文本也会消失。
FDinoff

@FDinoff这就是传呼机的less用途。只是将其插入不太像这样vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less。布局可能一开始就搞砸了(在我的终端中),但是按<CL>后,一切都很好而且很花哨。
hgiesel

我在运行时看不到任何输出vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!',只有“快速闪烁”,命令退出,代码为0,没有输出。我想念什么吗?
TrungDQ

3

我们还可以使用:redir命令将vim命令的结果重定向到文件中

例如,

vim -c "redir! > vimout | scriptnames | redir END | q"

这会将输出重定向scriptnames到文件“ vimout”


1

我感谢Christian Brabandt提供的答案,但我认为更好的答案是使用另一个-c命令来分隔quit命令,如下所示:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

使用此方法意味着您可以将许多不同的命令串在一起,然后使用最后的'q!'。退出vim。


0

对于需要像手动启动一样完全加载vim的情况,可以这样做:

vim -c "autocmd! CursorHold * <commands to run>"

例如,我想将:mapshell 的输出重定向到一个文件,但是我想捕获vim-airline仅在显示其标签线(顶部的行显示所有缓冲区名称已打开)之后创建的映射。因为它似乎可以这种异步方式,仅运行-c重定向到文件并没有给它时间进行映射。可能有更好的方法,但这对我有用,尤其是因为我已经updatetime设置为100(0.1秒),这会影响CursorHold事件触发的时间。默认情况下,vim将其设置为4秒。

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.