没有ctrlpNERDTree之类的插件,在项目树深处查找和打开文件的最有效方法是什么?

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

是否可以设置路径以一种聪明的方式,使其仅包含git ls-files之类的文件?

#1 楼

以下是我设置的相关部分:



启用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>



这是它的样子:



评论


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

–user489
15年3月14日在18:04

#2 楼

请参见: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通配符中的参数传递给*来进行过滤。

评论


这是一个绝妙的把戏

–user489
15年3月17日在6:23

#3 楼

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

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


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

vimf some_file.c