Vim:错误读取输入

时间:2016-10-29 13:19:08

标签: bash shell vim zsh

我已经搜索过这个错误,但我找不到解决方案。

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

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

#!/bin/sh

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

脚本失败并显示消息:Vim: error reading input

我哪里错了?

3 个答案:

答案 0 :(得分: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,当然。如果您输入^[作为 Control - V Esc ,则脚本将退出插入模式并执行{{ 1}}命令成功。因此,您输入了:x两个字符。所以你真正的输入是^[(并且脚本没有退出Vim):

Hello^[:x

现在,如果用实际的转义字符替换两个字符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的交互式版本。因此,您应该使用 ex模式Vim: Warning: Input is not from a terminal 选项),或者更确切地说改进的ex模式-e选项):-E

如果内容不应该被解释,那么将值包装在单引号中也是一个好主意,如果字符串包含shell变量,则用双引号包装:vim -n -E "$filename"

固定版本:

filename='test.txt'

(使用 Control - v Esc )在Vim中输入filename='test.txt' vim -n -E "$filename" << COMMAND i Hello ^[ :x COMMAND

答案 1 :(得分:0)

您应该删除filename= test.txt中的空格,并检查在COMMAND的最后一行之后没有空格。如果您想在第一行有Hello,请在iiHello^[后删除名称行。

您是否使用^[输入了CTRL-v ESC?它必须是一个字符。

答案 2 :(得分:0)

你可以这样做:

#!/bin/sh

filename=test.txt

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

正如Walter A所说,您必须分别在^[变量中点击^MCtrl-V Esc来替换Ctrl-V Returncoms

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