我经常发现自己在目录结构类似的项目中工作:
a/
x/
file1.h
y/
file2.h
z/
file3.h
b/
u/
file4.cpp
file5.h
v/
file6.cpp
file7.cpp
w/
其中源文件分布在所有目录中。
我有一个快捷方式,说Ctrl + n打开一个:tabnew
提示符,但我仍然觉得通过输入/自动完成目录找到我想要的文件很麻烦,因为我必须记住我要打开的特定文件的位置。
我可以让vim假装整个目录结构是扁平的,或者更确切地说是查找然后打开?我还想自动完成。 当然,理论上可能存在名称冲突,但在大多数情况下,即使技术上可行,也不会在不同的目录中包含相同名称的文件。
所以我想要的是源目录看起来像这样:
file1.h
file2.h
file3.h
file4.cpp
file5.h
file6.cpp
file7.cpp
允许我输入类似:magiccommand f<TAB>2<TAB>
的内容以打开a/y/file2.h
。
答案 0 :(得分:3)
有几个模糊探测器可以帮助实现这一目标 - 我甚至在很久以前写过一个。
你也可以坚持使用香草Vim并使用 starstar ::sp **/f*2<tab>
。
如果您正确设置'path'
,您也可以输入:find +sp f<tab>
(但它似乎不能与:tabedit
一起使用。)
答案 1 :(得分:1)
:help 'path'
在你的情况下,像这样:
:set path=/path/to/a/**,/path/to/b/**
然后:tabf file4.cpp
。因此,将快捷方式更改为:tabfind
而不是:tabnew
。
我还建议您考虑使用ctags
,因为这样您就可以使用:tag MyExcellentFunction
(或:stag ..
或{直接跳转到项目中任何文件中的符号{1}})。
如果你最终使用标签并将:tab stag ...
文件放在项目根目录中,那么这将帮助你:
tags
(这也可以修改为查找.git或.svn目录,如果这是您的荣幸。)
答案 2 :(得分:0)
我使用受dash-tom-bang答案启发的解决方案,最终独立于项目及其树结构。
map <C-b> :tabfind
imap <C-b> <C-o><C-b>
set path=.,,**,/usr/include
缺点是我不应该在我的主目录或类似的完整目录中使用<C-b>
。但为此,我建议回归:
map <C-n> :tabnew
imap <C-n> <C-o><C-n>