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