分类: LINUX
2012-11-20 11:14:20
Vim允许指定从当前路径开始,逐级向上查找文件的方式。因此一种更好的方法是
以上配置指定Vim从当前打开文件所在文件夹下开始,并逐级向自动查找tags文件,直至找到标签或到达根路径('/')。(当然还有一另一个固定的标签文件~/.vim/tags/linux/ctags/tags)。
以上就是设置多个tags标签的基本模式,可套用。
自动更新标签文件
Vim中的au[tocmd]命令,可以设定用事件来触发执行用户指定命令。此外,Vim也支持脚本的使用。结合Vim脚本和au命令,可以完成代码修改后自动更新标签文件定义的功能。
如果代码标签文件位置固定(如~/.vim/tags/usr/ctags/tags),则可以在Vim配置中进行如下设置:
以上配置当"*.cpp,*.h,*.c,*.def"文件在完成保存操作后(BufWritePost),自动调用系统命令(system)去执 行ctags命令,并指定ctags以相对路径("--tag-relative")、追加("-a")方式将当前文件(expand("%:p"))的 标签生成至目标文件(~/.vim/tags/usr/ctags/tags)中。
如果我们使用了上面将标签文件存放在项目根路径下、Vim从当前打开文件所在路径开始逐级向上查找标签文件的方式,则需要额外定位所使用标签文件所在位置。
RegenTag()函数中,我们使用了Vim内置函数findfile()从当前路径开始逐级向上去查找是否存在tags文件。如果找到,则将当 前文件的标签定向到此文件;如未找到,则在当前打开文件所在文件夹下新建标签文件tags。RegenTag() 被"*.cpp,*.h,*.c,*.def"类型文件的保存完成事件自动触发。
完整配置
最终,Vim配置文件中,tags相关设置如下:
最终我自己的机器上的配置为;
"让vim去自动搜索并加载标签文件
set tags=./tags;
"自动向上20层寻找标签文件的目录
function RegenTag()
let i = 0
while i < 20
if filereadable("cscope.out")
let db = getcwd()
"echo db
let $CSCOPE_DB = db
silent! execute "!vimbuildproject ./"
let i = 25
else
cd ..
let i += 1
endif
endwhile
endfunction
"设置自动关联,保存C++,头文件,C文件的时候调用 RegenTag()
au BufWritePost,FileWritePost *.cpp,*.h,*.c,*.def call RegenTag()
将cscope_maps.vim 插件做下修改,让 vim 自動尋找正確的 cscope 產生出來的 CSCOPE_DB(通常為 cscope.out ),它只会沿着当前目录向上找,找20层为止。
一,cscope_maps.vim 设置
這邊預設的目錄深度為 20 層,所以如果你的 source code 的目錄深度大於 20 請自行修正 i 的值
if has("cscope")
......
" add the database pointed to by environment variable
" Search database for each project, you can switch different projects easily, :)
let i = 1
while i < 20
if filereadable("cscope.out")
let db = getcwd() . "/cscope.out"
"echo db
let $CSCOPE_DB = db
cs add $CSCOPE_DB
let i = 20
else
cd ..
let i += 1
endif
endwhile
" show msg when any other cscope db added
二、Create goproj.sh and put it in ~/bin
這是為了方便建立 cscope.out (CSCOPE_DB)而寫的 goproj.sh,內容如下,為了方便起見可放在 ~/bin 下面。
Content of goproj.sh
#!/bin/bash
CSCOPE_FILE=cscope.out
if [ -n "$1" ]; then
echo "Source code directory: " $1
echo "Create file map : " $CSCOPE_FILE
find $1 -name "*.h" -o -name "*.c" -o -name "*.cpp" > $CSCOPE_FILE
cscope -bkq -i $CSCOPE_FILE
# cscope -Rbkq
ctags -R
else
echo "Please key-in path of project"
fi
使用範例,以 kernel source
# tar zxvf kernel-2.6.29.tar.gz
# cd kernel-2.6.29
# goproj.sh `pwd`
# vim xxx.c
[ Ctrl + \ + s ] : 搜尋游標上的 function 哪邊參考到
[ Ctrl + \ + c ] : 搜尋游標上的 function 哪邊呼叫到
[ Ctrl + \ + g ] : 搜尋游標上的 function 是在哪邊定義的
[ Ctrl + \ + t ] : 跳回下一個位置
[ Ctrl + \ + o ] : 跳回上一個位置
另外由於 cscope_maps.vim 中有定義 Ctrl + ] 的作用,會取代原本 TAG 裡面的定義,所以如果不喜歡的話可以把 cscope_maps.vim 中的這行 (set cscopetag) 移除 。
参考
以上配置/脚本,更详细的信息可参考Vim帮助
:help function