19

当我执行“locate 50local.policy | xargs vim”时,我收到错误“Vim: Warnung: Die Eingabe kommt nicht von einem Terminal”(翻译:Vim:警告:输入不是来自终端)。

我可以用 vim 成功编辑,但是在我关闭它之后,我的终端表现得很奇怪(我无法输入字母,当我点击输入时,shell 提示只会重复。当我使用“xargs gedit”进行操作时,它不会产生这些问题。

我使用带有 Gnome 3 和 Gnome-Terminal 3.0.1 的 Ubuntu 11.10。

4

3 回答 3

32

Vim 期望连接到一个真实的终端并发送相应的代码。

重置终端

reset

最简单的解决方法:

locate 50local.policy | xargs gvim

基本原理gui vim 不需要终端

除此以外:

vim $(locate 50local.policy)

基本原理vim 直接连接到终端启动(而不是作为子进程在xargs子shell 中运行,stdin/stdout 连接到管道而不是终端)。这就像说

vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy

或者

您可以通过不使用参数启动 vim 而是添加来自 vim 的参数来躲避这个问题!事实上,Vim 在运行 shell 方面比 shell 在运行 vim 方面要好得多。

在 vim 中:

:args `locate 50local.policy`
:rewind

这会将参数列表设置为在刻度之间从 shell 命令返回的文件;:rewind 然后转到该列表中的第一个文件。如果您正在编辑多个匹配项,请尝试以下操作:

:w|next

这一系列命令(由 | 分隔)将当前缓冲区写入文件,然后转到 args 列表中的下一个文件。

于 2011-11-22T15:00:05.587 回答
6

另一种选择是xargs使用该-o选项执行。从手册页:

-o      Reopen stdin as /dev/tty in the child process before executing
        the command.  This is useful if you want xargs to run an interac-
        tive application.

注意,-o是 xargs 的 BSD 扩展。

实现相同效果的更便携的方法是:

xargs sh -c 'vim "$@" < /dev/tty' vim
于 2012-11-13T12:08:53.547 回答
2

虽然“重置”解决了问题,但您还可以通过以下方式明确重新激活回声行为:

stty echo
于 2020-09-04T09:01:42.487 回答