如何让vim伪装成复杂树中的平面源目录?

时间:2017-12-07 11:50:16

标签: vim autocomplete workflow development-environment

我经常发现自己在目录结构类似的项目中工作:

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

3 个答案:

答案 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>