我已经搜索过这个错误,但我找不到解决方案。
我正在遵循加入Linux世界的基本指南,我正在尝试创建一个.txt
文件,使用该脚本在Vim中添加一些文本行。它应该有效,但不是我的情况。
这是我的简单脚本(我使用zsh
,如果它可能是重要信息):
#!/bin/sh
filename= test.txt
vim $filename << COMMAND
i
Hello
^[
:x
COMMAND
脚本失败并显示消息:Vim: error reading input
。
我哪里错了?
答案 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
。
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,请在i
:iHello^[
后删除名称行。
您是否使用^[
输入了CTRL-v ESC
?它必须是一个字符。
答案 2 :(得分:0)
你可以这样做:
#!/bin/sh
filename=test.txt
coms="iHello world^[:x ${filename}^M"
vim -c "normal $coms"
正如Walter A所说,您必须分别在^[
变量中点击^M
和Ctrl-V Esc
来替换Ctrl-V Return
和coms
。
请参阅man vim
,并在Vim :h :normal
中获取更多帮助。