ctrlp
和NERDTree
之类的插件,在项目树深处查找和打开文件的最有效方法是什么? 将
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>
这是它的样子:
#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
评论
哇,这些都是很棒的映射和设置。感谢您的详细回答。
–user489
15年3月14日在18:04