Vim:错误读取输入

Luc*_*rri 4 vim bash shell zsh

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

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

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

#!/bin/sh

filename= test.txt
vim $filename << COMMAND
i
Hello
^[
:x
COMMAND
Run Code Online (Sandbox Code Playgroud)

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

我哪里错了?

Rus*_*nov 6

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

关于Error reading input消息,请阅读 Vim 文档:help E208

Vim: Error reading input, exiting...
Run Code Online (Sandbox Code Playgroud)

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

所以 Vim 认为它读取了一个没有退出 Vim 的脚本。您的脚本进入插入模式,输入Hello,然后Esc,最后调用:x命令。万事大吉,:x命令退出Vim,当然是在命令行区输入的。如果您输入^[Control- V, Esc,则脚本将退出插入模式并:x成功执行命令。因此,您输入^[了两个字符。所以你真正的输入是Hello^[:x(并且脚本没有退出 Vim):

Vim: Error reading input, exiting...
Run Code Online (Sandbox Code Playgroud)

现在如果你用^[实际的转义字符替换这两个字符,并从同一目录执行脚本,它会因为交换文件而失败:

Vim: Warning: Input is not from a terminal
Vim: Error reading input, exiting...
Vim: preserving files...
Vim: Finished.
Run Code Online (Sandbox Code Playgroud)

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

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

Vim: Finished.
Run Code Online (Sandbox Code Playgroud)

这说得通。您实际上不需要 Vim 的交互式版本。所以,你应该使用Ex模式-e可选),或者更确切地说,改善ex模式-E选择): vim -n -E "$filename"

同时,这也是包装在单引号中的值,如果是不应该的内容来解释一个好主意,并在双引号,如果字符串包含shell变量:filename='test.txt'

固定版本:

Vim: Warning: Input is not from a terminal
Run Code Online (Sandbox Code Playgroud)

(^[在 Vim 中使用Control- v,输入Esc)。