为什么"locate filename | xargs vim"导致奇怪的终端行为?

Kon*_*ner 18 vim terminal xargs

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

我可以用vim成功编辑但是在我关闭之后我的终端表现得很奇怪(我不能输入字母,当我点击进入shell提示只是重复.当我用"xargs gedit"做它时它不会产生那些问题.

我使用Ubuntu 11.10与Gnome 3和Gnome-Terminal 3.0.1.

seh*_*ehe 29

Vim希望连接到一个真正的终端,并发送适合该终端的代码.

使用重置终端

reset
Run Code Online (Sandbox Code Playgroud)

最简单的解决方法:

locate 50local.policy | xargs gvim
Run Code Online (Sandbox Code Playgroud)

理由 gui vim不需要终端

除此以外:

vim $(locate 50local.policy)
Run Code Online (Sandbox Code Playgroud)

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

vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy
Run Code Online (Sandbox Code Playgroud)

另外

您可以通过不使用参数启动vim来避免问题,但是从vim添加参数!实际上,Vim在运行shell时要比运行vim时更好.

在vim中:

:args `locate 50local.policy`
:rewind
Run Code Online (Sandbox Code Playgroud)

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

:w|next
Run Code Online (Sandbox Code Playgroud)

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

  • @sidyll OP使用`xargs`来创建`vim`进程,而在另一种情况下,进程是从shell创建的. (2认同)
  • @sidyll重点是xargs执行它_with stdin/out没有连接到terminal_(做`echo hello | vim -`有同样的问题). (2认同)

mko*_*tee 5

另一种方法是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.
Run Code Online (Sandbox Code Playgroud)

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

实现相同效果的更便携手段是:

xargs sh -c 'vim "$@" < /dev/tty' vim
Run Code Online (Sandbox Code Playgroud)