vim打印意外输出

时间:2015-04-12 16:18:08

标签: macos bash shell vim

在我的脚本中我按照这样运行vim:

$EDITOR hello.c

然后我执行它:

./script.sh hello.c <stdin >>stdout 2>>stderr; echo $? >>errcode

有人知道为什么输出如下:

    [?1049h[?1h=[1;24r[?12;25h[?12l[?25h[27m[m[H[2J[?25l[24;1H"/home/sandbox/ios-15-1/desc1_file/xvysta02/hello.c" 6L, 77C[1;1H[35m#include [m[31m<stdio.h>[m
[32mint[m main()
{
    printf([31m"Hello world[m[35m\n[m[31m"[m);
    [33mreturn[m [31m0[m;
}
[1m[34m~                                                                               [8;1H~                                                                               [9;1H~                                                                               [10;1H~                                                                               [11;1H~                                                                               [12;1H~                                                                               [13;1H~                                                                               [14;1H~                                                                               [15;1H~                                                                               [16;1H~                                                                               [17;1H~                                                                               [18;1H~                                                                               [19;1H~                                                                               [20;1H~                                                                               [21;1H~                                                                               [22;1H~                                                                               [23;1H~                                                                               [m[24;63H1,1[11CAll[1;1H[?12l[?25h[24;1H[?1l>[?1049lVim: Error reading input, exiting...
Vim: Finished.
[24;1H

而不是:

running editor with: /.sanitized./hello.c (hash da427fd)

似乎打印出文件hello.c的内容

这是我的学校项目,所以输出来自测试脚本。

2 个答案:

答案 0 :(得分:1)

您无法在脚本中以交互方式重定向,以交互方式启动Vim。 Vim打印出各种ANSI Escape序列来控制终端,这就是你所看到的。你没有提到你正在使用Vim的内容,所以这里是对脚本中自动化文本操作的一般性介绍:

替代

除非你真的需要特殊的Vim功能,否则最好使用非交互式工具,如sedawk或Perl / Python / Ruby / < em>您最喜欢的脚本语言。

也就是说,你可以非交互式地使用Vim:

无声批处理模式

对于非常简单的文本处理(即使用Vim,如增强型'sed'或'awk',可能只是受益于:substitute命令中增强的正则表达式),请使用 Ex-mode

REM Windows
call vim -N -u NONE -n -i NONE -es -S "commands.ex" "filespec"

注意:静默批处理模式(:help -s-ex)会混淆Windows控制台,因此您可能需要在Vim运行后执行cls清理。

# Unix
vim -T dumb --noplugin -n -i NONE -es -S "commands.ex" "filespec"

注意:如果"commands.ex"文件不存在,Vim将等待输入;更好地检查它的存在!或者,Vim可以从stdin读取命令。您还可以使用从stdin读取的文本填充新缓冲区,如果使用-参数,则从stderr读取命令。

完全自动化

对于涉及多个窗口的更高级处理,以及Vim的真实自动化(您可以与用户交互或让Vim运行以让用户接管),请使用:

vim -N -u NONE -n -c "set nomore" -S "commands.vim" "filespec"

以下是使用过的参数的摘要:

-T dumb           Avoids errors in case the terminal detection goes wrong.
-N -u NONE        Do not load vimrc and plugins, alternatively:
--noplugin        Do not load plugins.
-n                No swapfile.
-i NONE           Ignore the |viminfo| file (to avoid disturbing the
                user's settings).
-es               Ex mode + silent batch mode -s-ex
                Attention: Must be given in that order!
-S ...            Source script.
-c 'set nomore'   Suppress the more-prompt when the screen is filled
                with messages or output to avoid blocking.

答案 1 :(得分:0)

vim正在使用控制字符来制作交互式屏幕。 当你想使用vim重定向时,尝试类似

的东西
vi hello.c >/dev/null 2>@1 <<end
:1,$ s/world/StackOverflow/
:wq
end

带有end的行必须从第一列开始,后面没有空格。 当你想用这种结构玩更多时,你可以进入插入模式, 输入内容并“点击转义键”。使用CTRL-V ESC放置转义的转义键。