Vim+cscope+ctags+tags阅读源代码 雨点打透心脏的1/2处 2022-06-18 03:43 161阅读 0赞 无意中看到了许振文学长的这篇《vim + csope + ctags + tags阅读源代码》,个人感觉整理的非常有条理。最重要的是,他写了一个脚本文件来生成源码索引文件。可能对于一些学习过shell的朋友来说,这并没有什么困难的,但对于我这种懒人来说,仅仅运行一个脚本就可以完成,是非常方便的一件事情。 linux源代码提供了制作cscope索引文件和tags文件的make命令。 **一,软件安装** **先安装cscope, ctags**: 点击(此处)折叠或打开 1. sudo apt-get install cscope, ctags 也可以安装ctags软件包: http://ctags.sourceforge.net/ 可以使用:ctags –version来查看当前ctags的版本是否是emacs的。 要是安装了emacs的话就必须使用上面这个地址的ctags,vim不支持emacs的ctags,所以要下载安装这个ctags。(这是以前的版本,现在基本上使用apt-get install就可以直接安装) 下载之后在源文件所在目录运行: 点击(此处)折叠或打开 1. helight@helight-desktop:~/Desktop/ctags-5.7$ ./configure 2. helight@helight-desktop:~/Desktop/ctags-5.7$ make 即可生成ctags文件,将这个文件保存到“/usr/bin/”目录下即可。 **二,生成索引文件在源代码目录下** 使用一下两条命令即可生成cscope索引文件和tags文件。 点击(此处)折叠或打开 1. helight@helight-desktop:~/Downloads/linux-2.6.26$ make cscope 2. FILELST cscope.files 3. MAKE cscope.out 4. helight@helight-desktop:~/Downloads/linux-2.6.26$ make tags 5. MAKE tags 6. helight@helight-desktop:~/Downloads/linux-2.6.26$ ls tags -l 7. \-rw-r–r– 1 helight ftp 69274841 2008-09-27 11:04 tags 8. helight@helight-desktop:~/Downloads/linux-2.6.26$ ls cscope.\* -l 9. \-rw-r–r– 1 helight ftp 23814144 2008-09-25 20:08 cscope.in.out 10. \-rw-r–r– 1 helight ftp 609665 2008-09-25 20:06 cscope.list 11. \-rw-r–r– 1 helight ftp 174470617 2008-09-25 20:08 cscope.out 12. \-rw-r–r— 1 helight ftp 124973256 2008-09-25 20:08 cscope.po.out **三,一般源文件中生成索引文件** 为了方便使用, 编写了下面的脚本来更新cscope和ctags的索引文件: 点击(此处)折叠或打开 1. \#!/bin/sh 2. find . -name "\*.h" -o -name "\*.c" -o -name "\*.cc" > cscope.files 3. cscope -bkq -i cscope.files 4. ctags -R 这个命令会生成三个文件:cscope.out, cscope.in.out, cscope.po.out。 其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索引速度。 这个脚本,首先使用find命令,查找当前目录及子目录中所有后缀名为".h", ".c"和".c"的文件,并把查找结果重定向到文件cscope.files中。 然后cscope根据cscope.files中的所有文件,生成符号索引文件。最后一条命令使用ctags命令,生成一个tags文件,在vim中执行":help tags"命令查询它的用法。它可以和cscope一起使用。 上面所用到的命令参数,含义如下: \-R: 在生成索引文件时,搜索子目录树中的代码 \-b: 只生成索引文件,不进入cscope的界面 \-q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度 \-k: 在生成索引文件时,不搜索/usr/include目录 \-i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪儿去找源文件列表。可以使用“-”,表示由标准输入获得文件列表。 \-I dir: 在-I选项指出的目录中查找头文件 \-u: 扫描所有文件,重新生成交叉索引文件 \-C: 在搜索时忽略大小写 \-P path: 在以相对路径表示的文件前加上的path,这样,你不用切换到你数据库文件所在的目录也可以使用它了。 **四,在VIM使用cscope查找,加载cscope.out文件** 在VIM中使用cscope非常简单,首先调用“cscope add”命令添加一个cscope数据库,然后就可以调用“cscope find”命令进行查找了。 VIM支持8种cscope的查询功能,如下:例如,我们想在代码中查找调用work()函数的函数,我们可以输入:“:cs find c work”,回车后发现没有找到匹配的功能,可能并没有函数调用work()。我们再输入“:cs find s work”,查找这个符号出现的位置,现在vim列出了这个符号出现的所有位置。 我们还可以进行字符串查找,它会双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能。 在源代码目录下打开vim。 要使用cscope查找就必须加载cscope.out文件.在vim命令行下执行: 点击( 此处)折叠或打开 1. :cs add cscope.out 在vim命令行下执行: 点击(此处)折叠或打开 1. :cs help 2. cscope commands: 3. add : Add a new database (Usage: add file|dir \[pre-path\] \[flags\]) 4. find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name) 5. c: Find functions calling this function d: Find functions called by this function 6. e: Find this egrep pattern 7. f: Find this file g: Find this definition 8. i: Find files \#including this file s: Find this C symbol 9. t: Find assignments to help : Show this message (Usage: help) 10. kill : Kill a connection (Usage: kill \#) 11. reset: Reinit all connections (Usage: reset) 12. show : Show connections (Usage: show) s: 查找C语言符号,即查找函数名、宏、枚举值等出现的地方 g: 查找函数、宏、枚举等定义的位置,类似ctags所提供的功能 d: 查找本函数调用的函数 c: 查找调用本函数的函数 t: 查找指定的字符串 e: 查找egrep模式,相当于egrep功能,但查找速度快多了 f: 查找并打开文件,类似vim的find功能 i: 查找包含本文件的文 2,使用cscope查找do\_fork函数的定义: 在vim命令行下执行: 点击(此处)折叠或打开 :cs f g do\_fork **五,在VIM中使用tags查找符号:** 在vim命令行下执行: 点击(此处)折叠或打开 1. :tag xxx 即可找到你想找的函数或是数据结构或是函数xxx 关于tags的其它用法可以在vim中执行”:help tags”命令进行查询。 **六,其它命令介绍:** ctrl+]:在函数调用的地方跳转到函数定义的地方 ctrl+t:返回上一个查找的地方 **七,特别注意:** 所生成的cscope.out和tags文件要在打开VIM所在的文件夹,否则VIM无法找到相关符号信息。 来自许振文学长的文章: [http://zhwen.org/?p=articles/cscope-tags][http_zhwen.org_p_articles_cscope-tags] <script>window.\_bd\_share\_config=\{"common":\{"bdSnsKey":\{\},"bdText":"","bdMini":"2","bdMiniList":false,"bdPic":"","bdStyle":"0","bdSize":"16"\},"share":\{\}\};with(document)0\[(getElementsByTagName('head')\[0\]||body).appendChild(createElement('script')).src='http://bdimg.share.baidu.com/static/api/js/share.js?v=89860593.js?cdnversion='+~(-new Date()/36e5)\];</script> 阅读(1213) | 评论(0) | 转发(0) | 0 上一篇:ARM+Linux中断系统详细分析 下一篇:如何用美剧真正提升你的英语水平————转自厦大口译的博客 相关热门文章 * [QEMU源码分析系列(四)...][QEMU_...] * [Python 包管理工具解惑][Python] * [MyBatis 入门(五)--分页查询(...][MyBatis _--_...] * [编写一个GPS串口读取程序...][GPS_...] * [centos6.5 网卡 em\* 改为eth\*...][centos6.5 _ em_ _eth_...] * A sample .exrc file for vi e... * IBM System p5 服务器 HACMP ... * 游标的特征 * DB2 9 应用开发(733 考试)认... * busybox的httpd使用CGI脚本(Bu... * [linux dhcp peizhi roc][] * [关于Unix文件的软链接][Unix] * [求教这个命令什么意思,我是新...][...] * [sed -e "/grep/d" 是什么意思...][sed -e _grep_d_ _...] * [谁能够帮我解决LINUX 2.6 10...][LINUX 2.6 10...] 给主人留下些什么吧!~~ 评论热议 [http_zhwen.org_p_articles_cscope-tags]: http://zhwen.org/?p=articles/cscope-tags [QEMU_...]: http://blog.chinaunix.net/uid-8679615-id-5711363.html [Python]: http://blog.chinaunix.net/uid-30162103-id-5711326.html [MyBatis _--_...]: http://blog.chinaunix.net/uid-261569-id-5711315.html [GPS_...]: http://blog.chinaunix.net/uid-26306178-id-5710472.html [centos6.5 _ em_ _eth_...]: http://blog.chinaunix.net/uid-27086996-id-5709734.html [linux dhcp peizhi roc]: http://ask.chinaunix.net/question/785970 [Unix]: http://ask.chinaunix.net/question/785964 [...]: http://ask.chinaunix.net/question/785935 [sed -e _grep_d_ _...]: http://ask.chinaunix.net/question/785919 [LINUX 2.6 10...]: http://ask.chinaunix.net/question/785702
还没有评论,来说两句吧...