2010-10-06 65 views
4

我最近开始在我的项目中使用ctags。我目前有以下设置:VIM中用于多个项目的标签路径

root/tags [contains all non-static tags] 
root/foo/tags [contains static tags for the foo directory] 
root/bar/tags [static] 
root/something/else/tags [etc.] 
... 

我可以set tags=./tags,tags,/path/to/root/tags,一切正常。

但是,我的问题是,我一次在几个项目上工作,所以我有,例如,/path/to/root1,/path/to/root2/path/to/root3一次。我宁愿每次打开文件时都不要手动设置标签;有没有什么办法可以根据我编辑的文件标记到/path/to/rootX? ?(即,如果我编辑/path/to/root3/foo/x.c,使用标签root3/tags

就我而言,我所有的项目都有一个共同的父目录;我真正想要的是一样的东西:

set tags=./tags,tags,substitute("%:p:h", "\(^\/path\/to\/.*/\).*$", "\1", "") 

但编辑:我只是意识到,这将无法正常工作;我实际上不能写入root*。相反,我想存储我的主要ctags文件在~/ctags/root*/tags,其中~/ctags/和01的子目录之间存在1:1的映射[对于那些可能想知道的,这些是ClearCase UCM动态视图;既不/view/XXX/也不/view/XXX/vobs/可写]

回答

2

如果你想要的是:

set tags=./tags,tags,substitute("%:p:h", "\(^\/path\/to\/.*/\).*$", "\1", "") 

尝试:

let &tags = './tags,tags,' . substitute(expand("%:p:h"), "\(^\/path\/to\/.*/\).*$", "\1", "") 

有一个:set命令没有扩展。另外,“%:p:h”不会自动扩展,因此请使用expand()。参见:

:help :let-option 
:help expand()