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

你可能感兴趣的:(makefile)