﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-kenwell-随笔分类-vim</title><link>http://www.cppblog.com/kenwell/category/14678.html</link><description>自己学习所用</description><language>zh-cn</language><lastBuildDate>Sat, 21 Aug 2010 14:44:52 GMT</lastBuildDate><pubDate>Sat, 21 Aug 2010 14:44:52 GMT</pubDate><ttl>60</ttl><item><title>工欲善其事必先利其器--打造vim-cscope/ctags工具链(转载）</title><link>http://www.cppblog.com/kenwell/archive/2010/08/21/124226.html</link><dc:creator>c++ 学习</dc:creator><author>c++ 学习</author><pubDate>Sat, 21 Aug 2010 14:28:00 GMT</pubDate><guid>http://www.cppblog.com/kenwell/archive/2010/08/21/124226.html</guid><wfw:comment>http://www.cppblog.com/kenwell/comments/124226.html</wfw:comment><comments>http://www.cppblog.com/kenwell/archive/2010/08/21/124226.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/kenwell/comments/commentRss/124226.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/kenwell/services/trackbacks/124226.html</trackback:ping><description><![CDATA[<p>Source Insight的强大的代码分析功能让所有windows下的众生受益菲浅。</p>
<p>而Source insight的价格即使是面对Windows Vista也不逞多。嘿嘿。东西是好东西。</p>
<p>个人认为它也对得起这个价格。可惜没米。用不起呀。</p>
<p>咋办呢。用vim，cscope打造一个免费的吧。<br></p>
<p><br></p>
<p>1安装cscope</p>
<p>cscope的编译和安装没有特别之处，./configure - make - make install即可。<br> 安转完毕后先阅读说明: vi /usr/share/vim/vim63/doc/if_cscop.txt.gz<br> 网上也有中文版本：http://vcd.gro.clinux.org/doc/if_cscop.html<br> 在vim中使用并不需要进行太多的设置，不过首先vim编译时必须加入了cscope的支持<br> <br> $ vim --version | grep cscope<br> +cryptv +cscope +dialog_con +diff +digraphs -dnd -ebcdic +emacs_tags +eval<br> <br> <br> 嗯，我用的这个版本的vim是支持cscope的。<br> </p>
<p>按 照vim里cscope的参考手册(在vim中执行":help
cscope"命令)，把cscope功能加到.vimrc里后(需要你的vim在编译时选择了"--enable-cscope"选项，否则你需要重新
编译vim)，配置就算完成了。然后用下面的命令生成代码的符号索引文件：<br> <br> </p>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background-color: #e6e6e6; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 50%; -moz-background-size: auto auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: #0000ff;">cscope</span> -Rbkq</span></div>
</div>
<br> 这个命令会生成三个文件：cscope.out, cscope.in.out, cscope.po.out。<br> 其中cscope.out是基本的符号索引，后两个文件是使用"-q"选项生成的，可以加快cscope的索引速度。<br> 上面所用到的命令参数，含义如下：<br> <br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background-color: #e6e6e6; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 50%; -moz-background-size: auto auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #000000;"><span style="color: #0000ff;">-R</span>: 在生成索引文件时，搜索子目录树中的代码<br> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">-b</span>: 只生成索引文件，不进入cscope的界面<br> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">-k</span>: 在生成索引文件时，不搜索</span><span style="color: #000000;">/</span><span style="color: #000000;">usr</span><span style="color: #000000;">/</span><span style="color: #000000;">include目录<br> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">-q</span>: 生成cscope</span><span style="color: #000000;">.</span><span style="color: #000000;">in</span><span style="color: #000000;">.</span><span style="color: #000000;">out和cscope</span><span style="color: #000000;">.</span><span style="color: #000000;">po</span><span style="color: #000000;">.</span><span style="color: #000000;">out文件，加快cscope的索引速度</span></div>
</div>
<br> <br> 接下来，就可以在vim里读代码了。<br> 不
过在使用过程中，发现无法找到C++的类、函数定义、调用关系。仔细阅读了cscope的手册后发现，原来cscope在产生索引文件时，只搜索类型为
C, lex和yacc的文件(后缀名为.c, .h, .l,
.y)，C++的文件根本没有生成索引。不过按照手册上的说明，cscope支持c++和Java语言的文件。<br> 于是按照cscope手册上提供的方法，先产生一个文件列表，然后让cscope为这个列表中的每个文件都生成索引。<br> 为了方便使用，编写了下面的脚本来更新cscope和ctags的索引文件：<br> <br>
<div style="border: 0.5pt solid windowtext; padding: 4px 5.4pt; background-color: #e6e6e6; background-image: none; background-repeat: repeat; background-attachment: scroll; background-position: 0% 50%; -moz-background-size: auto auto; -moz-background-clip: -moz-initial; -moz-background-origin: -moz-initial; -moz-background-inline-policy: -moz-initial; width: 95%;">
<div><img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="color: #0000ff;" alt="" align="top"><span style="color: #000000;"><span style="color: #008080;">#!/bin/sh</span><br> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><br> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">find</span> . -name "*.h" -o -name "*.c" -o -name "*.cc" &gt; cscope.files<br> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" alt="" align="top"><span style="color: #0000ff;">cscope</span> -bkq -i cscope.files<br style="color: #000000;"> <img  src="http://images.csdn.net/syntaxhighlighting/OutliningIndicators/None.gif" style="color: #000000;" alt="" align="top"><span style="color: #000000;"><span style="color: #0000ff;">ctags</span> -R</span></span><br> </div>
</div>
<br> 这个脚本，首先使用find命令，查找当前目录及子目录中所有后缀名为".h", ".c"和".cc"的文件，并把查找结果重定向到文件cscope.files中。<br> 然后cscope根据cscope.files中的所有文件，生成符号索引文件。<br> 最后一条命令使用ctags命令，生成一个tags文件，在vim中执行":help tags"命令查询它的用法。它可以和cscope一起使用。<br> <br> 目前只能在unix系列操作系统下使用cscope，虽然也有windows版本的cscope，不过还有很多bug。在Linux技术中坚站上看到有作者在win2000上成功运行了gvim + cscope，详情可以参阅：<br> <a  href="http://www.chinalinuxpub.com/bbs/showthread.php?t=30185" style="color: #0000ff;" target="_blank"><u>http://www.chinalinuxpub.com/bbs/showthread.php?t=30185</u></a><br> <br> <br> <br> cscope的主页在：<a  href="http://cscope.sourceforge.net/" style="color: #0000ff;" target="_blank"><u>http://cscope.sourceforge.net/</u></a><br> <br> 在vim的网站上，有很多和cscope相关的插件，可以去找一下你有没有所感兴趣的。搜索结果在这里：<br> <a  href="http://www.vim.org/scripts/script_search_results.php?keywords=cscope&amp;script_type=&amp;order_by=rating&amp;direction=descending&amp;search=search" style="color: #0000ff;" target="_blank"><u>点这里</u></a><br> <br> <br>
<pre>为了方便地使用cscope，我们还需要下载cscope的键盘映射设置，<br>这样就可以在gvim中简单地通过快捷键来使用 cscope，而不必敲复杂的命令了。键盘映射可以从<br>这里下载：<a  href="http://cscope.sourceforge.net/cscope_maps.vim">http://cscope.sourceforge.net/cscope_maps.vim</a></pre>
<pre>将下载到的 cscope_maps.vim  <br></pre>
<table style="border-collapse: collapse;" width="360" align="center" border="1" bordercolor="#dddddd" cellpadding="0" cellspacing="0">
    <tbody>
        <tr height="60">
            <td width="60" align="center"><img  src="http://blog.chinaunix.net/fileicon/zip.gif" alt="" border="0"></td>
            <td>
            <table style="border-collapse: collapse;" width="100%" border="0" cellpadding="0" cellspacing="0">
                <tbody>
                    <tr height="20">
                        <td width="40" align="center">文件:</td>
                        <td>cscope_maps.vim.tar.gz</td>
                    </tr>
                    <tr height="20">
                        <td width="40" align="center">大小:</td>
                        <td>2KB</td>
                    </tr>
                    <tr height="20">
                        <td width="40" align="center">下载:</td>
                        <td><a  href="http://blog.chinaunix.net/upfile/061226133444.gz">下载</a></td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
    </tbody>
</table>
<pre><br>放在gvim的插件目录里，如 C:\Program Files\Vim\vimfiles\plugin 中。Linux用户可以放在 <br>$HOME/.vim/plugin 中。</pre>
<pre>&#8593;<br>建立符号数据库 &#8224;<br>我们假设我们要阅读的代码放在 D:\src\myproject 下。然后打开命令行，进入源代码所在的目录，<br>为 cscope 建立搜索文件列表。在命令行中执行以下命令：</pre>
<pre>dir /s /b *.c *.h  &gt; cscope.files<br>如果你的源代码是C++，则可以将 cpp 等扩展名也加入到上面的命令中。</pre>
<pre>dir /s /b *.c *.h *cpp *.hpp  &gt; cscope.files<br>如果是Linux用户，则可以使用 find 命令实现同样的功能：</pre>
<pre>find $(pwd) -name "*.[ch]"<br>然后执行以下命令：</pre>
<pre>cscope -b<br>执行结束后你可以在当前目录下发现 cscope.out 文件，这就是 cscope 建立的符号数据库。</pre>
<pre>上面这个命令中，-b参数使得cscope不启动自带的用户界面，而仅仅建立符号数据库。</pre>
<pre>&#8593;<br>浏览源代码 &#8224;<br>使用 gvim 打开你的源代码目录中任意一个C程序文件。然后在gvim中执行如下命令：</pre>
<pre>:cscope add D:\src\myproject\cscope.out<br>由于在 gvim 中可以使用命令缩写，因此上面的命令可以写成：</pre>
<pre>:cs a D:\src\myproject\cscope.out<br>这样就打开了刚刚建立的符号数据库。通过下面的命令可以检查数据库连接的存在。</pre>
<pre>:cscope show<br>该命令可以缩写为</pre>
<pre>:cs s<br>现在将光标移动到源代码中的某个函数名上，依次按下一下组合键：</pre>
<pre>s<br>稍等片刻之后你会在屏幕下放看到如下的字样*1：</pre>
<pre>Cscope tag: display<br>&nbsp;&nbsp;  #&nbsp;&nbsp;  line  filename / context / line<br>&nbsp;&nbsp;  1&nbsp;&nbsp;&nbsp;  342  D:\src\myproject\src\global.h &lt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  void display(void );<br>&nbsp;&nbsp;  2&nbsp;&nbsp;&nbsp;  616  D:\src\myproject\src\command.c &lt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  display();<br>&nbsp;&nbsp;  3&nbsp;&nbsp;&nbsp;  138  D:\src\myproject\src\display.c &lt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  display(void )<br>&nbsp;&nbsp;  4&nbsp;&nbsp;&nbsp;  385  D:\src\myproject\src\main.c &lt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  display();<br>&nbsp;&nbsp;  5&nbsp;&nbsp;&nbsp;  652  D:\src\myproject\src\main.c &lt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  display();<br>&nbsp;&nbsp;  6&nbsp;&nbsp;&nbsp;  663  D:\src\myproject\src\main.c &lt;&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  display();<br>Enter nr or choice ( to abort):<br>这里显示出的就是整个工程中使用到了 display 这个标识符的位置。此时输入 4，回车，<br>即可跳转到 main.c 的 385 行调用 display() 函数的地方进行浏览。浏览结束后按 或者 <br>可以回到跳转前的位置。</pre>
<pre>然后将光标移动到源代码某个函数名上，迅速地依次安下面的组合键：</pre>
<pre>s<br>其中 按 Ctrl-2 即可输入。同样，屏幕上出现了一排结果，选择之后你会发现，<br>跳转到的文件将在水平方向的新窗口中打开。</pre>
<pre>然后将光标移动到源代码某个函数名上，迅速地依次安下面的组合键：</pre>
<pre>s<br>选择之后你会发现，跳转到的文件将在垂直方向的新窗口中打开。</pre>
<pre>以上我们简单介绍了cscope的使用方法，其中我们只用到了一个 s 命令，即跟在 和 后面的 s 键。<br>同样，我们可以使用以下的功能键实现不同的跳转功能。</pre>
<pre>c: 查找该函数被调用的位置 <br>d: 查找该函数调用了哪些函数 <br>e: 查找指定的正规表达式 <br>f: 查找指定的文件 <br>g: 查找指定标识符的定义位置 <br>i: 查找该文件在哪些地方被包含 <br>s: 查找指定标识符的使用位置 <br>t: 查找指定的文本字符串<br>&#8593;<br>命令行使用说明 &#8224;<br>除了上述通过快捷键映射的方式使用cscope之外，也可以直接在gvim命令行中使用cscope。这样就可以<br>随意定义查找字符串，而不必局限于源代码中已有的标识符。命令格式如下：</pre>
<pre>:cscope find  &lt;关键字&gt;<br>该命令可以缩写为</pre>
<pre>:cs f  &lt;关键字&gt;<br>一个比较实用的技巧是使用cscope打开文件。使用以下命令即可直接打开名为display.c的文件，<br>而不必先切换到display.c所在的目录。</pre>
<pre>:cs f f display.c<br>cscope也支持正规表达式。如果记不清某个函数的名称，可以用下面的方式来找到该函数的定义位置。</pre>
<pre>:cs f g .*SetConfiguration.*<br>&#8593;<br>版权 &#8224;<br>Cscope虽然不是GPL版权，但是Cscope是开放源码的自由软件，使用Cscope无须支付任何费用。</pre>
<pre>&#8593;<br>参考 &#8224;<br>Cscope官方主页, <a  href="http://cscope.sourceforge.net/">http://cscope.sourceforge.net/</a> <br>The Vim/Cscope tutorial, <a  href="http://cscope.sourceforge.net/cscope_vim_tutorial.html">http://cscope.sourceforge.net/cscope_vim_tutorial.html</a> <br>Cscope on Win32, <a  href="http://iamphet.nm.ru/cscope/">http://iamphet.nm.ru/cscope/</a> <br>Vim中关于 cscope 的帮助，使用 :help cscope 命令查看</pre><img src ="http://www.cppblog.com/kenwell/aggbug/124226.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/kenwell/" target="_blank">c++ 学习</a> 2010-08-21 22:28 <a href="http://www.cppblog.com/kenwell/archive/2010/08/21/124226.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>