当我“找到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。
答案 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