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连接到管道而不是终端).就像在说Run Code Online (Sandbox Code Playgroud)vim /usr/some/dir/50local.policy /usr/local/some/dir/50local.policy
您可以通过不使用参数启动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列表中的下一个文件.
另一种方法是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)