Vim:读取输入错误
Vim: error reading input
我已经搜索过这个错误,但找不到解决方案。
我正在按照基本指南加入 Linux 世界,我正在尝试创建一个 .txt
文件,使用该脚本在 Vim 中添加一些文本行.它应该可以,但对我来说不行。
这是我的简单脚本(我正在使用 zsh
,如果它可能是重要信息的话):
#!/bin/sh
filename= test.txt
vim $filename << COMMAND
i
Hello
^[
:x
COMMAND
脚本失败并显示消息:Vim: error reading input
。
我哪里错了?
您应该删除 filename= test.txt
中的 space,并检查您在最后一行 COMMAND
之后没有 space。如果您希望在第一行显示 Hello,请删除 i
之后的名称行:iHello^[
。
您输入 ^[
和 CTRL-v ESC
了吗?必须是一个字符。
你可以这样做:
#!/bin/sh
filename=test.txt
coms="iHello world^[:x ${filename}^M"
vim -c "normal $coms"
正如 Walter A 所说,您必须通过在 coms
变量中分别点击 Ctrl-V Esc
和 Ctrl-V Return
来替换 ^[
和 ^M
。
请参阅 man vim
,并在 Vim :h :normal
中获取更多帮助。
在对 filename
变量的赋值中有一个拼写错误(一个额外的 space):filename= test.txt
。此表达式被解释为 使用设置为空字符串 的 filename
环境变量调用 test.txt
命令。所以你应该在 =
.
之后删除 space
关于 读取输入错误 消息,请阅读 Vim 文档::help E208
:
Vim: Error reading input, exiting...
This occurs when Vim cannot read typed characters while input is required. Vim got stuck, the only thing it can do is exit. This can happen when both stdin and stderr are redirected and executing a script that doesn't exit Vim.
所以 Vim 认为它读取了一个没有退出的脚本 Vim。你的脚本进入插入模式,输入Hello
,然后Esc,最后调用:x
命令。万事大吉,:x
命令退出Vim,如果在命令行区输入,当然可以。如果您输入 ^[
作为 Control - 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"
.
如果内容不应该被解释,用单引号将值括起来也是一个好主意,如果字符串包含 shell 个变量,则用双引号括起来:filename='test.txt'
.
固定版本:
filename='test.txt'
vim -n -E "$filename" << COMMAND
i
Hello
^[
:x
COMMAND
(^[
使用 Control 在 Vim 中输入 - v, Esc ).
我尝试了上面的例子,我发现对于vim vim -e
或vim -E
的ex 模式,你应该添加一个'.'。当您认为插入已完成或无法工作时。代码如下。 ^[
是 Ctrl-V Esc
#!/bin/sh
filename='test.txt'
vim -n -E "$filename" << COMMAND
i
Hello
.
^[
:x
COMMAND
我已经搜索过这个错误,但找不到解决方案。
我正在按照基本指南加入 Linux 世界,我正在尝试创建一个 .txt
文件,使用该脚本在 Vim 中添加一些文本行.它应该可以,但对我来说不行。
这是我的简单脚本(我正在使用 zsh
,如果它可能是重要信息的话):
#!/bin/sh
filename= test.txt
vim $filename << COMMAND
i
Hello
^[
:x
COMMAND
脚本失败并显示消息:Vim: error reading input
。
我哪里错了?
您应该删除 filename= test.txt
中的 space,并检查您在最后一行 COMMAND
之后没有 space。如果您希望在第一行显示 Hello,请删除 i
之后的名称行:iHello^[
。
您输入 ^[
和 CTRL-v ESC
了吗?必须是一个字符。
你可以这样做:
#!/bin/sh
filename=test.txt
coms="iHello world^[:x ${filename}^M"
vim -c "normal $coms"
正如 Walter A 所说,您必须通过在 coms
变量中分别点击 Ctrl-V Esc
和 Ctrl-V Return
来替换 ^[
和 ^M
。
请参阅 man vim
,并在 Vim :h :normal
中获取更多帮助。
在对 filename
变量的赋值中有一个拼写错误(一个额外的 space):filename= test.txt
。此表达式被解释为 使用设置为空字符串 的 filename
环境变量调用 test.txt
命令。所以你应该在 =
.
关于 读取输入错误 消息,请阅读 Vim 文档::help E208
:
Vim: Error reading input, exiting...
This occurs when Vim cannot read typed characters while input is required. Vim got stuck, the only thing it can do is exit. This can happen when both stdin and stderr are redirected and executing a script that doesn't exit Vim.
所以 Vim 认为它读取了一个没有退出的脚本 Vim。你的脚本进入插入模式,输入Hello
,然后Esc,最后调用:x
命令。万事大吉,:x
命令退出Vim,如果在命令行区输入,当然可以。如果您输入 ^[
作为 Control - 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"
.
如果内容不应该被解释,用单引号将值括起来也是一个好主意,如果字符串包含 shell 个变量,则用双引号括起来:filename='test.txt'
.
固定版本:
filename='test.txt'
vim -n -E "$filename" << COMMAND
i
Hello
^[
:x
COMMAND
(^[
使用 Control 在 Vim 中输入 - v, Esc ).
我尝试了上面的例子,我发现对于vim vim -e
或vim -E
的ex 模式,你应该添加一个'.'。当您认为插入已完成或无法工作时。代码如下。 ^[
是 Ctrl-V Esc
#!/bin/sh
filename='test.txt'
vim -n -E "$filename" << COMMAND
i
Hello
.
^[
:x
COMMAND