利用makefile来生成cscope和tags
vim 写程序没有tags很麻烦, 如果你在一个新项目下,那更是麻烦。
本脚本, 利用 gcc 的 -MMD选项生成文件依赖, 这样可以利用工程的makefile来生成 cscope和tags。 真是太强了。
gen_cscope_tag.sh 内容如下:
#!/bin/bash
target="$*"
is_gen_all=1;
CSCOPE_DIR=.cscope
TAGS_DIR=.tags
CFLAGS+=-MMD make $target
export CFLAGS
function get_dep_files()
{
sed -r -e 's/\s+/\n/g' | sed -r -e '/\\$/d; /.o:$/d; /^$/d'
}
function cscope_f()
{
cscope -bk -i $1 -f $2
#rm $2.in
#rm $2.po
}
function ctags_f()
{
ctags --language-force=c++ --c++-kinds=+p --fields=+iaS --extra=+q -L $1 -f $2
}
function gen_total_index()
{
ctags_f cscope.files tags
cscope_f cscope.files cscope.out
}
function gen_every_index()
{
for files in $(find ./ -name '*.d')
do
local name=$(sed -e 's/.d$//g' <<<$files)
cat $files | sort | uniq| get_dep_files > ${name}.files
cscope_f ${name}.files $CSCOPE_DIR/${name}.out
ctags_f ${name}.files $TAGS_DIR/${name}.tags
rm ${name}.files
done
}
FILES=$(find ./ -name '*.d')
if [[ -z $FILES ]]
then
echo "no .d file"
exit 0
fi
cat $FILES | sort | uniq | get_dep_files > cscope.files
if [[ ! -d $CSCOPE_DIR ]]
then
mkdir $CSCOPE_DIR
fi
if [[ ! -d $TAGS_DIR ]]
then
mkdir $TAGS_DIR
fi
gen_total_index
if (( is_gen_all ))
then
gen_every_index
fi
到你工程目录,使用 gen_cscope_tag.sh clean all 就可以生成了。
.cscope 和 .tags 目录下有每个.cpp 文件的 索引。
修改 ~/.vimrc
function s:This_Cscope(file)
let file = a:file
if strlen(file) == 0
let file = s:Get_cur_file()
endif
let file = simplify(file)
let dir = simplify(s:Dirname(file))
let basename=substitute(system("sed -r -e 's/[.].+$//g' <<<$(basename " . file . ")"), "\n", "", "")
let out_name = dir . "/.cscope/" . basename . ".out"
echo out_name
if (filereadable(out_name) && 0 == cscope_connection(4, out_name, file))
execute "cscope add " . out_name . " " . dir
endif
endfunction
command -nargs=? -complete=file ThisCscope call <SID>This_Cscope('<args>')