2016-10-29 133 views
3

我已经搜索了这个错误,但是我找不到解决方案。Vim:错误阅读输入

我正在遵循一个加入Linux世界的基本指南,我正在尝试创建一个.txt文件,在Vim中使用该脚本添加一些文本行。它应该工作,但不是在我的情况。

这里我简单的脚本(我使用的是zsh,如果它可能是一个重要的信息):

#!/bin/sh 

filename= test.txt 
vim $filename << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

脚本失败消息:Vim: error reading input

我哪里错了?

回答

2

filename变量中有一个错字(额外空格):filename= test.txt。该表达式被解释为调用test.txt命令,filename环境变量设置为空字符串。所以你应该删除=之后的空格。

关于错误读取输入消息时,读出的Vim文档::help E208

Vim: Error reading input, exiting... 

这发生时,同时需要输入的Vim不能读取输入的字符。 Vim卡住了,唯一能做的就是退出。当stdin和stderr被重定向并执行一个不会退出Vim的脚本时,可能会发生这种情况。

所以Vim认为它读了一个没有退出Vim的脚本。您的脚本进入插入模式,输入Hello,然后输入Esc,最后调用:x命令。一切都很好,当然,:x命令退出Vim,如果输入命令行区域。如果你已经进入^[作为控制 - VEsc键,该脚本将已经退出插入模式和成功执行:x命令。因此,您输入^[作为两个字符。所以,你的实际输入为Hello^[:x(和脚本没有退出VIM):如果你的实际转义字符替换两个字符^[,并从同一目录执行脚本

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 
Vim: preserving files... 
Vim: Finished. 

现在,将失败,因为一个交换文件:

Vim: Warning: Input is not from a terminal 
Vim: Error reading input, exiting... 

Vim: Finished. 

(你可以阅读通过运行vim test.txt长描述)。您可以使用-n选项忽略交换文件:vim -n "$filename"。现在输出将是:

Vim: Warning: Input is not from a terminal 

它是有道理的。你实际上不需要Vim的交互式版本。所以你应该使用ex模式-e选项),或者更确切地说改进的ex模式-E选项):vim -n -E "$filename"

如果内容不应该被解释,那么将值包装在单引号中也是一个好主意,如果字符串包含外壳变量,则在双引号中包含值:filename='test.txt'

固定的版本:

filename='test.txt' 
vim -n -E "$filename" << COMMAND 
i 
Hello 
^[ 
:x 
COMMAND 

^[使用控制 Vim中输入 - vEsc键)。

+0

非常感谢你,我会把这一切都放在我的脑海里:D –

0

您应该删除filename= test.txt中的空格,并检查在COMMAND的最后一行后没有空格。当您希望在第一行显示“Hello”时,请在iiHello^[之后删除名称行。

Did you enter ^[ with CTRL-v ESC?它必须是一个字符。

+0

谢谢你!我写了'^ ['使用了2个字符。我必须学习更好的Vim命令:) –

+0

比你可以接受的答案。我已经使用了这里的结构来编辑文件,但是我切换到了'sed -i'。对于交互式编辑,我仍然使用vi(m)。 –

0

你可以这样做:

#!/bin/sh 

filename=test.txt 

coms="iHello world^[:x ${filename}^M" 
vim -c "normal $coms" 

沃尔特甲说,你必须分别击中Ctrl-V EscCtrl-V Returncoms变量中,以取代^[^M

请参阅man vim,并在Vim :h :normal获得更多帮助。