利用makefile来生成cscope和tags

vim 写程序没有tags很麻烦, 如果你在一个新项目下,那更是麻烦。

本脚本, 利用 gcc 的 -MMD选项生成文件依赖, 这样可以利用工程的makefile来生成 cscope和tags。 真是太强了2.gif

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>')

posted @ 2011-05-06 19:36  napoleon_liu  阅读(2080)  评论(0编辑  收藏  举报