用传递的文件名打开vi

时间:2012-04-06 02:31:13

标签: bash vim

我通常像这样使用

$ find -name testname.c
./dir1/dir2/testname.c
$ vi ./dir1/dir2/testname.c

再次输入位置文件名是很烦人的。

我怎么能只用一步呢?

我试过

$ find -name testname.c | xargs vi 

但我失败了。

5 个答案:

答案 0 :(得分:10)

-exec参数用于find

$ find -name testname.c -exec  vi {} \;

如果您的find返回多个匹配项,则会按顺序打开这些文件。也就是说,当你关闭一个时,它会打开下一个。你不会把它们全部排在缓冲区中。

要将它们全部打开缓冲区,请使用:

$ vi $(find -name testname.c)

顺便说一下,这真的是vi,而不是Vim,现在vi经常被别名?

答案 1 :(得分:6)

您可以使用bash中的以下命令执行此操作:

使用

vi `find -name testname.c` 

或使用

vi $(!!)

如果您已输入find -name testname.c

编辑:可能重复:bash - automatically capture output of last executed command into a variable

答案 2 :(得分:4)

问题是xargs接管了vi的所有输入(并且没有其他追索权,然后将/dev/null传递给vi,因为替代方案是传递文件列表的其余部分),无法与之交互。您可能想要使用子命令:

$ vi $(find -name testname.c)

遗憾的是,在您运行初始fc之后,没有简单的rfind调用可以轻松地为您执行此操作,尽管将两个字符添加到两端都很容易事后的命令。

答案 3 :(得分:3)

我最喜欢的解决方案是使用vim本身:

:args `find -name testname.c`

顺便说一句,VIM扩展了shell globbing内置,所以你可以说

:args **/testname.c

将在子目录树中递归查找。

也不是,VIM在命令行上有文件名完成,所以如果你知道你真的在寻找一个文件,那就试试

:e **/test

然后按 Tab (重复)在子目录树中的任何matchin文件名之间循环。

答案 4 :(得分:1)

对于比vi $(find -name testname.c)之类更强大的东西,以下内容将防止具有空格和其他解释的shell字符的文件名(如果您的文件名中嵌入了换行符,上帝帮助您)。将此函数注入shell环境:

# Find a file (or files) by name and open with vi.
function findvi()
{
    declare -a fnames=()
    readarray -t fnames < <(find . -name "$1" -print)
    if [ "${#fnames[@]}" -gt 0 ]; then
        vi "${fnames[@]}"
    fi
}

然后使用

$ findvi Classname.java