我使用 find 搜索了一些文件,并且想在 Vim 的选项卡中打开所有文件。所以我尝试了这个:
find . | xargs fgrep -l myExpression | xargs vim -p
这很有效,除了当我完成并退出 Vim 时,我在 vim 中输入的所有内容都是不可见的,并且退格键不起作用(所以当我输入ls<backspace><backspace>exit
结果历史记录时,它ls^?^?exit
不是exit
。它还警告我,我的管道不是从终端。
不过,当我重新启动 shell 时,一切都恢复正常了。这总是可重现的。
重击版本:
GNU bash, version 3.2.25(1)-release (x86_64-redhat-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.
Vim 版本:
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 14 2015 05:43:37)
Included patches: 1-699
答案1
命令行程序可以通过两个来源获取用户的输入:来自 stdin(您正在通过管道传输到的),以及直接连接到 TTY。当这些混合在一起时,就会发生不好的事情。 Vim 不想从管道读取输入,它需要你(用户)直接读取输入。所以让我们把真正的标准输入返回给它。
作为解决方案,我们可以使用命令替换直接将文件作为参数传递给 Vim:
vim -p $(find . | xargs fgrep -l myExpression)
请注意,由于 shell 执行的扩展,这将不是正确处理名称中带有空格的文件,但我的 Bash-fu 太弱,无法找到简单的修复方法。
另外,find options | xargs some command
可以写成find options -exec some command {} +
,这可能会被认为更优雅。