使用传递的文件名打开vi

  • 本文关键字:vi 文件名 bash vim
  • 更新时间 :
  • 英文 :


我通常像这样使用

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

再次键入带有位置的文件名会很烦人。

我怎么只用一步就可以做到这一点?

我试过

$ find -name testname.c | xargs vi 

但我失败了。

-exec参数用于find

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

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

要在缓冲区中打开它们,请使用:

$ vi $(find -name testname.c)

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

您可以在bash中使用以下命令:

要么使用

vi `find -name testname.c` 

或者使用

vi $(!!)

如果您已经键入find -name testname.c

编辑:可能的重复:bash-自动将上次执行的命令的输出捕获到变量中

问题是xargs接管了vi在那里的所有输入(并且在没有其他追索权的情况下,将/dev/null传递给vi,因为另一种选择是传递文件列表的其余部分),没有留下任何与它交互的方式。您可能想使用子命令:

$ vi $(find -name testname.c)

遗憾的是,在运行了初始find之后,没有简单的fcr调用可以轻松地为您做到这一点,尽管在之后将字符添加到命令的两端已经足够容易了。

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

:args `find -name testname.c`

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

:args **/testname.c

其将在子目录树中递归地找到。

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

:e **/test

然后按选项卡(重复)在子目录树中的任何匹配文件名之间循环。

对于比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

最新更新