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

时间:2011-11-22 14:55:53

标签: 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。

3 个答案:

答案 0 :(得分:29)

Vim希望连接到真实终端并发送适合该终端的代码。

使用

重设终端
reset

最简单的解决方法:

locate 50local.policy | xargs gvim
  

理由 gui vim不需要终端

否则:

vim $(locate 50local.policy)
  

基本原理 vim直接连接到终端(而不是xargs下的子进程,后者又在stdin / stdout的子shell中运行连接到管道而不是终端)。 就像说

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

替代地

你可以通过不用参数启动vim来避免这个问题,但是从vim添加参数!实际上,运行shell时,Vim比运行vim时更好。

在vim中:

:args `locate 50local.policy`
:rewind

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

:w|next

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

答案 1 :(得分: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.

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

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

xargs sh -c 'vim "$@" < /dev/tty' vim

答案 2 :(得分:1)

虽然“重置”解决了该问题,但是您也可以使用以下方式明确地重新激活回显行为:

stty echo