在项目树深处查找和打开文件的有效方法?


12

如果没有像ctrlp和这样的插件NERDTree,在项目树深处查找和打开文件的最有效方法是什么?

将设置为path**/*导致在.git其他隐藏目录中无用的文件,因此这似乎是不可能的。

有没有一种方法可以聪明地设置路径,使其仅包含文件git ls-files或其他内容?

Answers:


24

这是我的设置的相关部分:

  • 启用wildmenu,

    set wildmenu
    
  • 使文件名完成跳过这些文件和目录,

    set wildignore+=*.swp,*.bak
    set wildignore+=*.pyc,*.class,*.sln,*.Master,*.csproj,*.csproj.user,*.cache,*.dll,*.pdb,*.min.*
    set wildignore+=*/.git/**/*,*/.hg/**/*,*/.svn/**/*
    set wildignore+=*/min/*
    set wildignore+=tags,cscope.*
    set wildignore+=*.tar.*
    
  • 使其不区分大小写,

    set wildignorecase
    
  • 列出文件,然后让用户选择Wildmenu,

    set wildmode=list:full
    
  • 将当前文件的目录以及工作目录下的每个目录添加到Vim的目录中path

    set path=.,**
    

    警告!路径选项非常有用。上面的值- .,**我来说有效,但是我使用的语言没有标准库。在正确的价值完全取决于你的需求。

  • 一堆:find映射,大写变体从当前文件的目录开始搜索,以提高性能,

    nnoremap ,f :find *
    nnoremap ,F :find <C-R>=expand('%:p:h').'/**/*'<CR>
    nnoremap ,s :sfind *
    nnoremap ,S :sfind <C-R>=expand('%:p:h').'/**/*'<CR>
    nnoremap ,v :vert sfind *
    nnoremap ,V :vert sfind <C-R>=expand('%:p:h').'/**/*'<CR>
    

这是它的样子:

:找


1
哇,这些都是很棒的映射和设置。感谢您的详细回答。

3

看到 :h :command-completion-custom

我们可以使最后一个示例适应仅完成git列出的文件。

command! -nargs=1 -bang -complete=customlist,GitFindComplete
      \ GitFind edit<bang> <args>

function! GitFindComplete(ArgLead, CmdLine, CursorPos)
  let search_pattern = "*" . a:ArgLead . "*"
  let shell_cmd = "git ls-files " . shellescape(search_pattern)
  return split(system(shell_cmd), "\n")
endfunction

现在,您可以使用自动完成功能来打开git列出的文件:

:GitFind ome_f<Tab>

请注意,在自定义完成功能中,我们要做的不只是简单列出可以完成的文件。我们还必须过滤相对于当前命令行参数的列表ArgLead。在此示例中,我们要求git通过传递包装在*通配符中的参数来为我们进行过滤。


这是一个绝妙的技巧

1

我的方法在其中包括以下shell函数~/.bash_profile

vimf() {
  vim $(find . -name $1)
}

然后要打开项目树深处的任何文件,只需键入:

vimf some_file.c
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.