Vim:错误阅读输入
我已经搜索了这个错误,但是我找不到解决方案。Vim:错误阅读输入
我正在遵循一个加入Linux世界的基本指南,我正在尝试创建一个.txt
文件,在Vim中使用该脚本添加一些文本行。它应该工作,但不是在我的情况。
这里我简单的脚本(我使用的是zsh
,如果它可能是一个重要的信息):
#!/bin/sh
filename= test.txt
vim $filename << COMMAND
i
Hello
^[
:x
COMMAND
脚本失败消息:Vim: error reading input
。
我哪里错了?
在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,如果输入命令行区域。如果你已经进入^[
作为控制 - V,Esc键,该脚本将已经退出插入模式和成功执行: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中输入 - v,Esc键)。
您应该删除filename= test.txt
中的空格,并检查在COMMAND
的最后一行后没有空格。当您希望在第一行显示“Hello”时,请在i
:iHello^[
之后删除名称行。
Did you enter ^[
with CTRL-v ESC
?它必须是一个字符。
谢谢你!我写了'^ ['使用了2个字符。我必须学习更好的Vim命令:) –
比你可以接受的答案。我已经使用了这里的结构来编辑文件,但是我切换到了'sed -i'。对于交互式编辑,我仍然使用vi(m)。 –
你可以这样做:
#!/bin/sh
filename=test.txt
coms="iHello world^[:x ${filename}^M"
vim -c "normal $coms"
沃尔特甲说,你必须分别击中Ctrl-V Esc
和Ctrl-V Return
的coms
变量中,以取代^[
和^M
。
请参阅man vim
,并在Vim :h :normal
获得更多帮助。
非常感谢你,我会把这一切都放在我的脑海里:D –