vim+cscope+ctags

1 篇文章 0 订阅
1 篇文章 0 订阅


1. 查看vim是否支持cscope
    $vim --version | grep cscope

2. 编译支持cscope的VIM(--enable-cscope)
    #USE="bash-completion cscope nls perl python-acl -gpm -minimal -ruby -vim-pager-vim-with-x" emerge vim
    #emerge -av dev-util/cscope
    #emerge -av dev-util/ctags
    $which cscope
    $which ctags

3. 查看帮助
    $man cscope
    $man ctags
    :helpcscope (vim command)
    参考[1 http://vimcdoc.sourceforge.net/doc/if_cscop.html


4. 使用cscope[2]

在你的项目根目录运行下面的
命令:下面有示例,这一段看看就行.

$find . -name "*.h" -o -name "*.c" -o -name "*.cc"> cscope.files 或者 find "当前路径的绝对路径"-name "*.h" -o -name "*.c" -o -name "*.cc" >cscope.files

//注意find命令中的当前路径最好换为当前目录的绝对路径.因为当我们由于工作需要,在不同的目录下来回切换时,在原先路径下有效的相对目录,在当前目录可能就无效了。这样vim可能就找不到需要的标签,因

为标签文件里保存的相对路径此时失效了,而绝对路径可以保证在任何目录下都不会失效。


$cscope -bkq -i cscope.files 这个命令会生成三个文件:cscope.out,cscope.in.out以及cscope.po.out。

    其中cscope.out是基本的符号索引,后两个文件是使用"-q"选项生成的,可以加快cscope的索$引速度。

ctags -R
 以上步骤示例如下:
比如我现在在/home/harry/temp/下将代码chekout到src目录下(/home/harry/temp/src)
我可以选择进入/home/harry/temp/,
$cd /home/harry/temp/
$find /home/harry/temp/ -name "*.h" -o -name "*.c" -o -name "*.cc"> cscope.files
$cscope -bkq -i cscope.files
$ctags -R

现在我们已经创建了基本的cscope以及tags库.
接下来的步骤则是打开要查看的文件并且加入cscope库
有两种方式:
1. temp方式:加入库只在此次有效,关闭文件后.库失效
$vim fsdp.c
在vim状态下输入冒号进入最后行模式之后输入
: cscope add/home/harry/temp/cscope.out  此处最好用绝对路径
这样就加入了符号索引库,之后就可以查看相应的函数定义或文件,ctrl+t返回。
    : cscopefind g print
    : cscopefind f cstest.h

 

2.永久方式,只要打开vim则自动加载库
创建相应的快捷键
   将以下内容添加到~/.vimrc中,vim会自动加载当前目录下的符号索引cscope.out,可以使用ctrl+t、ctrl+]等。

"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" cscope setting

if has("cscope")
   setcsprg=/usr/bin/cscope             "指定用来执行 cscope的命令,这里不一定是/usr/bin/cscope,你自己得找到这个位置
  setcsto=1                            "先搜索tags标签文件,再搜索cscope数据库
  setcst                               "使用|:cstag|(:cs findg),而不是缺省的:tag
   setnocsverb                          "不显示添加数据库是否成功
  " add any database in current directory
   iffilereadable("cscope.out")
     cs add cscope.out  "添加cscope数据库,这里用绝对路径,保险. 比如我用"/home/harry/temp/cscope.out"而不直接用cscope.out
  endif
   setcsverb                            "显示添加成功与否
endif

nmap <C-@>s :cs find s<C-R>=expand("<cword>")<CR><CR>
nmap <C-@>g :cs find g<C-R>=expand("<cword>")<CR><CR>
nmap <C-@>c :cs find c<C-R>=expand("<cword>")<CR><CR>
nmap <C-@>t :cs find t<C-R>=expand("<cword>")<CR><CR>
nmap <C-@>e :cs find e<C-R>=expand("<cword>")<CR><CR>
nmap <C-@>f :cs find f<C-R>=expand("<cfile>")<CR><CR>
nmap <C-@>i :cs find i^<C-R>=expand("<cfile>")<CR>$<CR>
nmap <C-@>d :cs find d<C-R>=expand("<cword>")<CR><CR>
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""

   其中<C-@>g是先同时按ctrl+@键,之后再按一个g。功能就是查看当前光标所在符号的定义。

总结一下:
对于方式一:
$cd /home/harry/temp/
$find /home/harry/temp/ -name "*.h" -o -name "*.c" -o -name "*.cc"> cscope.files
$cscope -bkq -i cscope.files
$ctags -R
$vim fsdp.c
: cscope add /home/harry/temp/cscope.out
这样就加入了符号索引库,之后就可以查看相应的函数定义或文件,ctrl+t返回。
    : cscopefind g print
    : cscopefind f cstest.h
对于方式二:
再将方式二的内容添加到.vimrc后,
则:
$cd /home/harry/temp/
$find /home/harry/temp/ -name "*.h" -o -name "*.c" -o -name "*.cc"> cscope.files
$cscope -bkq -i cscope.files
$ctags -R
$vim fsdp.c
就可以查看相应的函数定义或文件,ctrl+t返回。不用这步了: cscope add/home/harry/temp/cscope.out
   

 : cscope find g print
    : cscopefind f cstest.h 

      
    #注意#所生成的cscope.out和tags文件要在打开VIM所在的文件夹,否则VIM无法找到相关符号信息。哈哈,这个问题是因为前面没有用绝对路径.用了绝对路径就可以找到相关符号信息了.你就可以在任何目录下vim文件了.


6. vim阅读代码
    添加cscope符号索引数据库后,可以调用"cscopefind"命令进行查找,vim支持8种cscope的查询功能。如在代码中查找调用work()函数的函数,可以在vim命令状态下输入":csfind cwork",回车即可。还可以进行字符串查找,它会对双引号或单引号括起来的内容查找。还可以输入一个正则表达式,这类似于egrep程序的功能。
    :cshelp (vim command下查询)

    s查找C语言符号,即查找函数名、宏、枚举值等出现的地方
    g查找函数、宏、枚举等定义的位置,类似ctags所提供的功能
    d查找本函数调用的函数
    c查找调用本函数的函数
    t查找指定的字符串
    e查找egrep模式,相当于egrep功能,但查找速度快多了
    f查找并打开文件,类似vim的find功能
    i查找包含本文件的文件


7. 查看阅读c++代码[3]
    cscope缺省只解析C文件(.c和.h)、lex文件(.l)和yacc文件(.y),虽然它也可以支持C++以及Java,但它在扫描目录时会跳过C++及Java后缀的文件。如果希望cscope解析C++或Java文件,需要把这些文件的名字和路径保存在一个名为cscope.files的文件。当cscope发现在当前目录中存在cscope.files时,就会为cscope.files中列出的所有文件生成索引数据库。
    下面的命令会查找当前目录及子目录中所有后缀名为".h",".c", "cc"".cpp"的文件,并把查找结果重定向到文件cscope.files中。然后cscope根据cscope.files中的所有文件,生成符号索引文件。最后一条命令使用ctags命令,生成一个tags文件,在vim中执行":helptags"命令查询它的用法。它可以和cscope一起使用。

    $find . -name "*.h" -o-name "*.c" -o -name"*.cc" -o"*.cpp" >cscope.files
    $cscope -bkq -i cscope.files
    $ctags -R


8. 在vim中使用tags查找符号

    查看ctags帮助
    $man ctags
    :helpctags  (vim command)
    :helptags   (vim command)
    
    在源代码根目录下执行ctags -R命令用来为程序源代码生成标签文件,其-R选项表示递归操作,同时为子目录也生成标签文件。vim利用生成的标签文件,可以进行相应检索、并在不同的文件C语言元素之间来回切换。
    $ctags -R

    A) vim中使用":tagxxx"跳到函数或数据结构xxx处。使用tag命令时,可以使用TAB键进行匹配查找,继续按TAB键向下切换。
    某个函数有多个定义时
    :tag
    跳到第一个定义处,优先跳转到当前文件
    :tnext
    跳到第一个
    :tfirst
    跳到前count个
    :[count]tprevious
    跳到后count个
    :[count]tnext
    跳到最后一个
    :tlast
    你也可以在所有tagname中选择:
    :tselecttagname
    如果想跳到包含block的标识符":tag/block" 然后用TAB键来选择。这里'/'就是告诉vim 'block'是一个语句块标签。

    B) "ctrl+]"快捷键,跳转到光标所在函数标识符的定义处。

    C) 使用"ctrl+t"退回上层。如果想在以write_开头的标识符中选择一下,:tselect /^write_ 这里,'^'表示开头,同理,'$'表示末尾。

    D) 运行vim的时候,必须在"tags"文件所在的目录下运行。否则,运行vim的时候还要用":settags=xxx"命令设定"tags"文件的路径,这样vim才能找到"tags"文件(这儿我们已经设置过了"settags=tags;",在子目录中也可以使用)。

    E) 在函数中移动光标的快捷键:
    [{转到上一个位于第一列的"{"
   }] 转到下一个位于第一列的"{"
    {转到上一个空行
    }转到下一个空行
    gd转到当前光标所指的局部变量的定义
    *转到当前光标所指的单词下一次出现的地方
    #转到当前光标所指的单词上一次出现的地方


9. taglist插件使用[4]
    该插件可以像SourceInsight那样将当前文件中的宏、全局变量、函数等tag显示在Symbol窗口,用鼠标点上述tag,就跳到该tag定义的位置;可以按字母序、该tag所属的类或scope,以及该tag在文件中出现的位置进行排序;如果切换到另外一个文件,Symbol窗口更新显示这个文件中的tag。taglist依赖于ctags。

    要使用taglist插件,必须满足:
    1).打开VIM的文件类型自动检测功能;
    2).系统中装了Exuberantctags工具,并且taglist能够找到此工具(因为taglist需要调用它来生成tag文件);
    3).你的VIM支持system()调用;

    安装taglist插件
    #emerge -av app-vim/taglist

    查看帮助
    :helphelptags
    :helptaglist
    :helptaglist-intro

    打开tag窗口
    :TlistToggle

    .vimrc中配置如下
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" ctags setting
set tags=./tags,./../tags,./*/tags;

" Tag list (ctags)

filetypeon                            "文件类型自动检测

if MySys() =="windows"                "设定windows系统中ctags程序的位置
   let Tlist_Ctags_Cmd ='ctags'
elseif MySys() == "linux"              "设定linux系统中ctags程序的位置
   let Tlist_Ctags_Cmd ='/usr/bin/ctags'
endif

let Tlist_Show_One_File = 1            "不同时显示多个文件的tag,只显示当前文件的
let Tlist_Exit_OnlyWindow = 1          "如果taglist窗口是最后一个窗口,则退出vim
let Tlist_Use_Right_Window = 1        "在右侧窗口中显示taglist窗口

 
map <silent><F8>:TlistToggle<cr>    "在映射F8键打开tags窗口
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""


10. 建立索引数据库、查看内核源码[5]
liuby@liuby ~/git/kernel/linux-2.6.30.5 $ makecscope
  GEN    cscope
liuby@liuby ~/git/kernel/linux-2.6.30.5 $ make tags
  GEN    tags
liuby@liuby ~/git/kernel/linux-2.6.30.5 $ ls tags-l
-rw-r--r-- 1 liuby liuby 89648962 03-12 06:12 tags
liuby@liuby ~/git/kernel/linux-2.6.30.5 $ lscscope.* -l
-rw-r--r-- 1 liubyliuby    40390103-12 06:02 cscope.files
-rw-r--r-- 1 liuby liuby 182562815 03-12 06:04 cscope.out
-rw-r--r-- 1 liuby liuby  23011328 03-12 06:04cscope.out.in
-rw-r--r-- 1 liuby liuby 133571208 03-12 06:04 cscope.out.po



参考文献:
[1] http://vimcdoc.sourceforge.net/doc/if_cscop.html
[2] http://easwy.com/blog/archives/advanced-vim-skills-cscope/
[3] http://easwy.com/blog/archives/vim-cscope-ctags/
[4] http://easwy.com/blog/archives/advanced-vim-skills-taglist-plugin/
[5] http://www.kongove.cn/web/doc/vim-ctags-cscope-source.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值