Vim代码浏览插件-cscope(1)

来源:互联网 发布:java中的scanner类 编辑:程序博客网 时间:2024/04/29 08:19

Vim代码浏览插件-cscope(1)

cscope是一款为开发人员浏览代码而设计的软件,并可以以插件形式工作在Vim或其他编辑器中。官方网址:cscope,当前最新版本为15.7a。

cscope的特性有

  • 提供以下代码查找方式:
    • 所有对指定符号的引用
    • 全局定义
    • 某个函数中所调用的其他函数
    • 调用了指定函数的所有函数
    • 字符串
    • 正则表达式模式
    • 文件
    • 包含了指定文件的所有文件
  • 基于curses库的文本屏幕
  • 生成信息库用以提供快速查找和引用
  • 为C语言设计的模糊分析器,同时支持对C++和Java进行语法分析,并可以用作通用"数据检索器"(用以浏览大块头的文本文档)
  • 提供命令行模式,可用在脚本之中,或作为GUI/命令行前端应用的后台功能模块
  • 可应用于所有类Unix平台及大多数独占控制模式的操作系统

1. ctags和cscope的简单比较

cscope和ctags的功能有些相似。

ctags中的标签提供的信息主要有:文件中有哪些对象(宏/变量/函数/类型定义等),对象的位置(在哪一个文件的哪一行,用于Vim实现对象快速定位功能);而ctags除对象自身信息外更进一步提供了对象间引用/调用关系的信息。

但ctags也有着自己的优点,除了更简洁好用的优势外,ctags扩展更多,如taglist基于ctags提供了直观的标签列表窗口,omnicppcomplete基于ctags提供了智能代码补全功能....

所以,萝卜萝卜白菜白菜...

2. 安装

官网下载源代码,编译,安装。乌斑兔的话,可以使用apt-get命令在命令行安装或使用新立得软件管理器下载安装。

3. cscope命令行交互模式

命令行交互模式是cscope的模准工作模式。

缺省,cscope运行时会检查当前目录之下的C(.c,.h),lex(.l), 和yacc(.y)源文件;也可以在命令行中指定cscope的目标文件列表。无论哪一种情况,cscope还会自动搜索系统标准包含路径以寻找#include语句中所包含的、不在当前路径下的引用文件。缺省情况下,cscope使用符号交叉引用库-cscope.out定位函数/函数调用/宏/变量/预处理符号表。

3.1 cscope命令

语法

cscope [-bcCdehklLqRTuUvV] [-f file] [-F file] [-i file] [-I dir] [-s dir]
[-p number] [-P path] [-[0-8] pattern] [source files]

参数说明:

  • 选项
    • -h, --help : 帮助信息
    • -V, --version : 在屏幕首行打印cscope版本信息
    • -b : 仅创建交叉引用库,而不进入交互模式
    • -C : 查找时忽略大小写
    • -c :在交叉引用库中仅使用ASCII字符(不压缩)
    • -d : 不要更新交叉引用库
    • -e : 在文件之间禁止-e命令提示
    • -F symfile : 从symfile中读取符号引用
    • -f reffile : 使用reffile替代缺省的cscope.out作为交叉引用库
    • -I incdir : 指定除附加包含文件搜索路径。对源代码中#include语句所包含的文件(无率是使用双引号'"'还是尖括号'<''>'),cscope会按照以下顺序进行查找:当前路径、设定的附加路径、标准路径($INCDIR,一般为/usr/include)。如果在命令行中多次使用-I选项设定了多个附加搜索路径,则cscope会按照这些路径出现的先后依次进行查找
    • -i namefile : 设定cscope源文件列表。文件之间可以使用空格/制表符/换行符分隔。如未指定,cscope缺省使用cscope.files文件中所指定的文件。namefile可设定为'-',表示从标准输入设备获取文件列表。带有空格的文件名需包含在双引号'"'之中,文件名中的双引号/反斜杠需要使用反斜杠进行转义(即,文件名中的'"'需写为'\"', '\'需写为'\\')
    • -k : 内核模式,构建数据信息时关闭对默认系统包含路径(通常为/usr/include)的使用。这是因为内核代码树不会使用系统包含路径下的代码。
    • -L : 与-num模式选式一起使用时,进行单次查找并以行为单位输出信息
    • -l : 行模式界面
    • -[0-9]pattern : 跳转到输入的第num个字段(从零开始计数),查找指定模式
    • -P path : 在交叉引用数据库中相对路径文件名之前添加指定的path, 这样就不再需要切换至生成交叉引用库文件的路径下。仅当"-d"配合使用时有效
    • -p n : 显示最后n个文件路径。n为0时不显示任何文件名
    • -q : 允许使用反向索引进行快速符号查找。此选项将会使cscope除cscope.out之外生成cscope.in.out和cscope.po.out两个文件,用以提高cscope符号查找速度
    • -R : 递归遍历子目录
    • -s dir : 在指定的dir路径下查找额外的源文件。如在命令行指定了源文件,此选项将被忽略
    • -T : 仅使用符号名中的前8个字符进行匹配。如正则表达式中包含有除句号('.')以外的其他字符,将不能匹配最短长度大于8个字符的任何符号
    • -U : 检查文件时间戳。即使没有文件更改,此选项也会更新数据库的时间戳
    • -u : 无条件新建交叉引用文件(假定所有文件都有改动)
  • files : ctags待扫描文件列表

3.2 cscope交互模式界面

完成目标源文件符号数据库的构建后,cscope显示以下功能项:

Find this C symbol:
Find this function definition:
Find functions called by this function:
Find functions calling this function:
Find this text string:
Change this text string:
Find this egrep pattern:
Find this file:
Find files #including this file:

使用'↑'或'↓'键移动光标到需要的功能的输入区域,输入想查找的关键字,<Enter>执行查找。

3.3 快捷命令

cscope提供了以下单字符命令:

  • 应于用搜索结果的命令
    • [0-9a-zA-Z] : 打开匹配项所在文件并跳转到指定的代码行进行编辑
    • <Space> : 显示下一组匹配行
    • <Tab> : 在搜索结果和功能菜单项之间切换
    • <Up> : 若光标位于功能菜单区,移动光标至上一功能项;如光标位于搜索结果区域,移动到上一匹配结果
    • <Down> : 移动光标至下一功能项/匹配结果
    • + : 显示下一组匹配结果
    • - : 显示上一组匹配结果
    • Ctrl-e : 依次编辑所有匹配文件
    • > : 将当前所显示的匹配结果输出到文件
    • >> : 将当前所显示的匹配结果追加到文件
    • < : 从符号引用文件(由上面'>"或'>>"命令生成)中读取内容,类似于cscope命令行中的-F选项
    • ^ : 用shell命令过滤,并显示结果,替换已存在的行
    • | : 将结果中所有行放入管道发送给一个shell命令,并显示结果
  • 以下命令可在任何时候使用
    • <Return> : 移动光标到下一个输入域
    • Ctrl-n : 移动光标到下一个输入域
    • Ctrl-p : 移动光标到上一个输入域
    • Ctrl-y : 查找最后输入的文字
    • Ctrl-b : 移动到前一个输入域并查找模式
    • Ctrl-f : 移动到后一个输入域并查找模式
    • Ctrl-c : 切换忽略大小写开关状态
    • Ctrl-r : 重新构建交叉引用库
    • ! : 启动一个交互的shell(Ctrl-d返回cscope)
    • Ctrl-l : 刷新屏幕
    • ? : 给出cscope命令帮助
    • Ctrl-d : 退出cscope

    *如果搜索的首字母为以上命令字符之一,输入时需要使用反斜杠'\'进行转义。

  • 文本替换命令
    • [0-9a-zA-Z] : 标记/或取消要改动的行
    • * : 标记/取消当前所显示的所有行
    • <Space> : 显示下一组匹配行
    • + : 显示下一组匹配行
    • - : 显示上一组匹配行
    • a : 标记或取消标记所有行
    • Ctrl-d : 改动标记行并退出
    • <ESC> : 不改动标记行,退出
    • ! : 启用一个交互式shell(Ctrl-d退出)
    • Ctrl-l : 重绘屏幕
    • ? : 给出cscope帮助信息

3.4 cscope环境变量

  • CSCOPE_EDITOR : 覆盖EDITOR和VIEWER变量。如果要让cscope使用EDITOR/VIEWER变量指定以外的编辑器,可能过CSCOPE_EDITOR来设定
  • CSCOPE_LINEFLAG : 设定编辑器的行号标志格式。缺省,cscope以"youreditor +N filename"的形式调用编辑器,N为想让编辑器跳转到的行的编号。vi和emacs均使用这样的格式。如果用户编辑器需要使用其他格式来控制跳转的行号,可以通过指定CSCOPE_LINEFLAG变量来实现。变量设定中,可使用”%s"作为行号的占位符。例:如果需要以"youreditor -#103 filename"的形式来打开编辑器,可以将此变量设定为"-#%s"。
  • CSCOPE_LINEFLAG_AFTER_FILE : "yes",如果编辑器打开命令中需要将行号放置在文件名之后(如"youreditor filename +18")
  • EDITOR : 用户偏好的编辑器;缺省为"vi"
  • HOME : 用户根目录,一般在登录时由系统自动设定
  • INCLUDEDIRS : 用来查找#include所包含文件的目录列表,项目间用':'隔开
  • SHELL : 用户偏好的shell,缺省为sh
  • SOURCEDIRS : 用来查找附加源文件的目录列表,项目间使用':'隔开
  • TERM : 终端类型,必须为屏幕设备
  • TERMINFO : 终端信息目录全路径名
  • TMPDIR : 临时文件目录,缺省为/var/tmp
  • VIEWER : 偏好的文件显示程序,会被EDITOR覆盖
  • VPATH : 由':'分隔的目录列表,这些目录拥有相同的目录结构。如果设置了VPATH,cscope将会在指定的路径下查找源文件;如果未设置,则cscope仅在当前目录下查找源文件

3.5 cscope使用的文件

  • cscope.files : 默认包含-I, -p, -q, -T选项和源文件列表(会被-i选项覆盖)
  • cscope.out : 符号交叉引用文件(会被-f选项覆盖), 如查不能在当前目录下生成此文件,cscope将会把它放置到用户根目录下
  • cscope.in.out,cscope.po.out : 默认包含用于快速符号查找(-q选项)的反向索引信息。如果使用了-f选项设定了交叉引用文件名(不使用默认的cscope.out),反向索引文件的名字也将会随之改变为用户设定文件名+.in/.po。例:使用-f xyz设定引用文件名为xyz,则相应反向索引文件名则为xyz.in和xyz.po
  • INCDIR : 标准系统包含路径,用来查找#include文件(通常为/usr/include)

4. 其他

cscope尽管支持多种语言,但缺省情况下仅为.h/.c/.x/.y文件生成交叉引用信息,.cpp/.java等等文件将被忽略。尽管-i选项可以指定要处理的源文件,但对于多文件类型的情况还是有些麻烦。

实际使用中,可以如下使用系统的find命令结合grep命令,将我们感兴趣的源文件(c/c++文件)列表重定向到一个文件中,然后再使用cscope的-i选项生成交叉引用数据库。

  1. #!/bin/bash  
  2. find |grep -E "\.(c|cc|cp|cpp|cxx|c\+\+|h|h\+\+|hh|hp|hpp|hxx)$" >cscope.files  
  3. cscope -bq -i ./csope.files  
此条目发表在 others, Unix-like 分类目录,贴了 plugin, vim 标签。将固定链接加入收藏夹。
原创粉丝点击