Saturday, December 6, 2008

关于使用ctags浏览代码的一些笔记

2010.11.22 10:20更新: 今天才发现我当初是没有弄清楚Vim寻找tags文件的方式, 现在看来, 只需要在源码根目录执行"ctags -R", 然后每次都使用这一个tags文件即可. 因此下面的做法相当于画蛇添足, 现仅留作存档.

2010.11.22凌晨更新: 下面的脚本中由于find用到了扩展的POSIX正则表达式, 因此请注意检查你系统中的find是否支持, 比如BSD系统自带的find就只支持标准的正则表达式.

昨天本来想看下xlockmore的源码的, 开始以为Vim + Tag List就差不多了, 后来发现不行的, 源码里面包含了一些include文件中的类型定义啊, 函数定义啊这些的, 想去看下原型都不行.

于是想到了ctags, 在我正在查看的源文件的目录下生成了一个tags文件. 这下好了, 可以跳转查看了, 不过马上新的麻烦又来了. 我还想在这个新跳转的文件中继续跳转, 但由于它同刚才的不在同一个目录, 所以Vim找不到相应的tags文件. 真是麻烦, 看来必须在每一个目录下都生成一个tags文件才行, 不过我很懒, 不想手动进入每一个目录, 然后重复执行那行命令. 查了一会儿ctags的man page, 没找到想要的功能, 又Google了一下, 还是没找到, 倒是找到了和我遇到相同麻烦的人, 呵呵~ 问了下joy, 貌似他也不是很清楚, 于是我就干脆写个脚本算了. 把这个脚本放在包含所有源码的根目录执行就行了.
#!/bin/bash

if which ctags > /dev/null; then
    echo "Hey, I get it!" > /dev/null
else
    echo "ctags is needed"
    exit 1
fi

base_dir=`pwd`
extension="\([cC]\|[cC][pP][pP]\|[hH]\)"

cd "$base_dir"
for dir in `find . -type d`; do
    cd "$dir"
    file=`find . -maxdepth 1 -regex ".*\.${extension}" -execdir echo 'found' \; -quit`
    if [ -n "$file" ]; then
        echo "$dir"
        ctags -R "$base_dir"
    fi
    cd "$base_dir"
done

exit 0
顺便记下在Vim中通过tags文件跳转的命令:
g^]  跳转
^T 跳回

然后还有个cscope, 可以用来搜索源码, 还没怎么用过.

P.S. xlockmore的源码看着真是费劲, n多的宏定义和typedef, 害得我头都看晕了...

No comments:

Post a Comment