“为什么?”;找到文件名“xargs vim”;导致奇怪的终端行为?

“为什么?”;找到文件名“xargs vim”;导致奇怪的终端行为?,vim,terminal,xargs,Vim,Terminal,Xargs,当我执行“定位50local.policy | xargs vim”时,我得到错误“vim:Warnung:Die Eingabe kommt nicht von einem Terminal”(翻译:vim:Warning:输入不是来自终端) 我可以用vim成功地编辑,但在我关闭它之后,我的终端行为异常(我无法键入字母,当我点击enter时,shell提示符就会重复出现)。 当我使用“xargsgedit”时,它不会产生这些问题 我将Ubuntu 11.10与Gnome 3和Gnome终端3.

当我执行“定位50local.policy | xargs vim”时,我得到错误“vim:Warnung:Die Eingabe kommt nicht von einem Terminal”(翻译:vim:Warning:输入不是来自终端)

我可以用vim成功地编辑,但在我关闭它之后,我的终端行为异常(我无法键入字母,当我点击enter时,shell提示符就会重复出现)。 当我使用“xargsgedit”时,它不会产生这些问题


我将Ubuntu 11.10与Gnome 3和Gnome终端3.0.1一起使用。

Vim希望连接到真实的终端,并发送相应的代码

使用以下命令重置终端:

reset
最简单的解决方法:

locate 50local.policy | xargs gvim
基本原理gui vim不需要终端

否则:

vim $(locate 50local.policy)
基本原理vim直接连接到终端启动(而不是作为
xargs
下的子进程,后者在子shell中运行,stdin/stdout连接到管道而不是终端)。这就像

或者 通过不使用参数启动vim,而是添加vim!中的参数,可以避免这个问题。事实上,vim在运行Shell时比Shell在运行vim时要好得多

在vim期间:

:args `locate 50local.policy`
:rewind
这会将参数列表设置为刻度之间shell命令返回的文件;:倒带然后转到该列表中的第一个文件。 如果要编辑多个匹配项,请尝试以下操作:

:w|next

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

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

-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
xargs sh-c'vim“$@”
在“重置”修复问题的同时,您还可以通过以下方式明确地重新激活回声行为:

stty echo

只是好奇:
vim$(…)之间有什么区别
OP在做什么?@sidyll在-post@sidyllOP正在使用
xargs
创建
vim
进程,而在另一种情况下,该进程是从shell创建的。@sidyll问题是xargs在stdin/out未连接到终端的情况下执行它(做
echo hello | vim-
也有同样的问题)。@empe584感谢您的帮助编辑。我无法对其进行投票,但我会:)
stty echo