我最近开始在我的项目中使用ctags。我目前有以下设置:
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 一切正常。
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 ?
/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* . 相反,我想把我的主要CTAG文件存储在 ~/ctags/root*/tags ,其中的子目录之间有1:1的映射 ~/ctags/ 和 /path/to/ [对于那些可能想知道的人,这些都是ClearCaseUCM动态视图;两者都不是 /view/XXX/ 也不 /view/XXX/vobs/ 可写的
root*
~/ctags/root*/tags
~/ctags/
/path/to/
/view/XXX/
/view/XXX/vobs/
如果你想要的是:
尝试:
let &tags = './tags,tags,' . substitute(expand("%:p:h"), "\(^\/path\/to\/.*/\).*$", "\1", "")
在一个 :set 命令。另外,“%:p:h”不会自动展开,因此使用 expand() . 见:
:set
expand()
:help :let-option :help expand()