说明:适用于linux+vim7.0. 如果是windows是可做修改才能用的。
在默认情况下vim 的tags属性是
./tags,./TAGS,tags,TAGS
很显然vim只会在当前目录下找tags.
但是我们的程序代码分布是树状结构,如
project
| src
| ai
| ui
......
| include
我们一般会在project 目录下生成 tags
生成命令一般是:ctags -R --languages=c++ --c++-kinds=+p --fields=+iaS --extra=+q .
在project下打开文件没有问题,tags能用。
但是如果在ai下打开其中的文件,那project下的那个tags,就不能用了。除非我们把它加入。
你大可以在vim 执行: set tags=..... ... /project/tags
现在给出一个更好方案。
打开任何文件,自然地将打开的文件所在目录路径上查找tags. 如果有则加入 。
如果 现在打开了 /home/xxx/project/src/ai/a.c, project下有tags
将查找 /home/xxx/project/src/ai/ 下是否有tags ,没有!
将查找 /home/xxx/project/src/ 下是否有tags ,没有!
将查找 /home/xxx/project/ 下是否有tags ,有,加入
将查找 /home/xxx/ 下是否有tags ,没有!
将查找 /home/ 下是否有tags ,没有!
将查找 / 下是否有tags ,没有!
则最后 tags=./tags,./TAGS,tags,TAGS,/home/xxx/project/tags
就是实现的效果。
那以下代码copy到 ~/.vimrc . (没有就建一个)
"------------------------------------------------------------------------------
"获取当前路径的上一级的路径
function! GET_UP_PATH(dir)
let pos=len(a:dir)-1
while pos>0
if (a:dir[pos]=="/" )
return strpart(a:dir,0,pos)
endif
let pos=pos-1
endwhile
return ""
endfunction
"设置相关tags
function! s:SET_TAGS()
let dir = expand("%:p:h") "获得源文件路径
"在路径上递归向上查找tags文件
while dir!=""
if findfile("tags",dir ) !=""
"找到了就加入到tags
exec "set tags+=" . dir . "/tags"
endif
"得到上级路径
let dir=GET_UP_PATH(dir)
endwhile
endfunction
autocmd BufEnter * call s:SET_TAGS()
"------------------------------------------------------------------------------