vim插件cscope使用详解

简介

  cscope 是一个 C语言的浏览工具,通过这个工具可以很方便地找到某个函数或变量的定义位置、被调用的位置等信息。目前支持 C 和 C++。cscope 自身带一个基于文本的用户界面,不过 gvim 提供了cscope接口,因此可以在 gvim 中调用 cscope,方便快捷地浏览源代码。

  cscope是一个类似ctags的工具。 你可以把它想作是超过频的ctags,因为它功能比ctags强大很多。 在 Vim里,通过cscope查询结果来跳转就象跳转到其他的标签完全一样;它被保存在标签栈里。这样你就可以象使用tags一样在函数等等之间便捷的跳转。在VIM中使用cscope非常简单,首先调用cscope add cscope.out命令添加一个cscope数据库,然后就可以调用cscope find命令进行查找了。VIM支持8种cscope的查询功能,然后列出目标出现的所有位置。我们还可以进行字符串查找,它会在双引号或单引号括起来的内容中查找。还可以输入一个正则表达式,这类似于egrep程序的功能。

安装

  • 手动编译安装
    • http://cscope.sourceforge.net/下载源码
    • 解压后进入源码根目录
    • 配置:./configure --with-flex (注:如果平台是Linux,最好带上 –with-flex选项)
    • 编译:make (注:我没有遇到错误)
    • 安装:make install
  • 下载已编译的二进制包
    • sudo apt install cscope

注意:cscope即可以单独使用,也可以在作为vim的一个插件来使用,但要求vim编译时配置了--enable-cscepe特性。可以使用$ vim --version |grep cscepe来查看是否支持。

配置

  • 修改vim配置文件vimrc.你可以修改/etc/vimrc使用所有用户都使用本配置文件,当然你还可以修改~/.vimrc
  • 下载配置文件:cscope_map.vim
  • 把cscope_map.vim里从 if has(“cscope”) 到 endif里边的内容复制到/etc/vimrc里边去,也可以自行修改。

使用

建立数据库:cscope -Rbq

进入vim

添加数据库: :add file|dir [pre-path] [flags])

搜索: :find {querytype} {name},除了 4 和 6 之外的类型忽略 name之前的空格。4 和 6 在 querytype和name 之间只能有一个空格分隔。多余的空格是 name}的一部分。

0 或 s: 查找本 C 符号

1 或 g: 查找本定义

2 或 d: 查找本函数调用的函数

3 或 c: 查找调用本函数的函数

4 或 t: 查找本字符串

6 或 e: 查找本 egrep 模式

7 或 f: 查找本文件

8 或 i: 查找#include本文件的文件

9 或 a: 查找此符号被赋值的位置

显示帮助: :help

断开连接: :kill #

重置连接::reset

显示连接::show

除了 4 和 6 之外的类型忽略 {name} 之前的空格。4 和 6 在 {querytype} 和 {name} 之间只能有一个空格分隔。多余的空格是 {name} 的一部分。 

命令详解

概要和描述

命令

cscope [-bCcdehkLlqRTUuVvX] [-Fsymfile] [-freffile] [-Iincdir] [-inamefile] [-0123456789pattern] [-pn] [-sdir] [files] 

描述:cscope是一个交互式的,面向屏幕的工具,允许用户浏览C源文件以获取指定的代码元素。默认情况下,cscope检查当前目录中的C(.c和.h),lex(.l)和yacc(.y)源文件。可以在命令行上指明源文件。cscope会搜索头文件目录。 cscope使用交叉引用符号(默认情况下称为cscope.out)来定位文件中的函数,函数调用,宏,变量和预处理器符号。cscope将在首次浏览程序源文件时构建交叉引用符号数据库。在后续调用中,仅当源文件已更改或源文件列表不同时,cscope才会重建交叉引用。重建交叉引用时,将从旧的交叉引用复制未更改文件的数据数据库,这使得重建速度比初始构建更快。

选项

  • -I,-c,-k,-p,-q和-T选项也可以位于cscope.files文件中。
短选项描述
-h帮助
-V查看版本号
-b只创建数据库,然后退出。否则进入查找界面
-C搜索时忽略字母大小写。
-c在数据库中只使用ASCII字符,即不压缩数据。
-d不更新数据库
-e禁止文件之间的 -e命令提示符。
-k“Kernel Mode”,在创建数据库时禁用默认的头文件目录(/usr/ include)
-L与-num pattern选项一起使用时进行单次搜索,然后使用命令行模式进行输出
-l命令行模式
-npattern进入指定的搜索模式,并搜索pattern。n为[0-9]
-Ppath在预先建立数据库中的相对文件名前加上路径path,这样不必更改工作目录到数据库所在目录。仅与-d联用有效
-pn显示最后n个文件路径而不是最后1个。0不显示文件名。
-q通过反向索引启用快速符号查找。除普通数据库外,cscope会创建2个文件(默认为cscope.in.outcscope.po.out)。
-R在搜索源文件期间递归子目录。
-sdir在dir中查找其他源文件。 如果在命令行上提供源文件,则忽略此选项。
-T仅使用前八个字符匹配C符号。除.之外的长度大于8的正则表达式不会匹配任何标识符
-U检查文件时间戳。 即使没有更改文件,此选项也将更新数据库上的时间戳。
-u无条件地构建交叉引用数据库(假设所有文件都已更改)。
-v建立数据库时,可见详细过程
-X退出时删除cscope数据库和逆序数据库
files要操作的文件名列表。
-f reffile使用reffile作为生成的数据库的文件名而不是默认的“cscope.out”。
-F symfile从symfile中读取数据库。(由重定向>或>>输出,也可用<读入)
-I incdir在indir中搜索#include引入的头文件(包括#include<xx.h>#include"xx.h"),查找名称不以/开头并且未在命令行或-i选项中列出的文件。 如果出现多次出现-I,则按照出现的顺序搜索目录。
-i namefile浏览namefile列出的源文件而不是名为cscope.files的默认文件(文件名由空格,制表符或换行符分隔)。
如果指定了此选项,则cscope将忽略命令行中出现的任何文件名namefile为“ – ”表示接受标准输入。
文件名由空格必须用“双引号”括起来。双引号和反斜杠必须转义。
      
长选项描述
–help等效于-h
–version等效于-V

初始搜索请求

  • 交叉索引数据库准备就绪后,cscope将显示以下菜单:

    • Find this C symbol——找到这个C符号
    • 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——找到这个egrep pattern:
    • Find this file——找到这个文件:
    • Find files #including this file——查找文件#include文件
    • Find assignments to this symbol——查找此符号的赋值
  • 反复按<up><down>键移动到所需的输入字段,键入要搜索的文本,然后按<return>键搜索。如果搜索成功,则可以使用以下任何单字符命令:

发出后续请求

  • 搜索成功后可以使用下例命令
按键描述
0-9A-ZA-Z编辑给定行号的文件。
<space>显示下一组匹配行。
<TAB>在菜单和匹配行列表之间交替显示
<up>移动到上一个菜单项(光标在菜单中)或移动到上一个匹配行(光标在匹配的行列表中。)
<Down>移动到下一个菜单项(光标在菜单中)或移动到下一个匹配的行(光标在匹配的行列表中。)
+显示下一组匹配的行。
显示上一组匹配行。
ctrl+e按顺序编辑显示的文件。
>将显示的行列表写入文件。
>>将显示的行列表添加到文件中。
<从由>或>>创建的数据库文件中读取行,就像-F选项一样。
^通过shell命令过滤所有行并显示结果,替换已存在的行。
|将所有行传递给shell命令并原封不动的显示它们。
  • 在任何时候,可以使用这些单字符命令:
按键描述
<ENTER>移至下一个输入字段。
ctrl+n移动到下一个输入字段。
ctrl+p移至上一个输入字段。
ctrl+y使用键入的最后一个文本进行搜索。
ctrl+b移至上一次输入的字段和搜索模式。
ctrl+f移动到下一次输入的字段和搜索模式。
ctrl+c在搜索时切换忽略/使用字母大小写。
ctrl+r重建交叉引用数据库
启动交互式shell(键入ctrl+d以返回到cscope)。
ctrl+l重绘屏幕。
提供有关cscope命令的帮助信息。
ctrl+d退出cscope。

注意:如果要搜索的文本的第一个字符与上述命令之一匹配,请先键入(反斜杠)以将其转义。

  • 用新文本替换旧文本:键入要被改变的文本后,cscope将提示输入新文本,然后显示包含旧文本的行。 使用这些单字符命令选择要更改的行
按键描述
0-9A-ZA-Z标记或取消标记要更改的行。
*标记或取消标记要更改的所有显示行。
<space>显示下一组。
+显示下一组。
显示上一组。
a标记或取消标记要更改的所有行。
ctrl+d更改标记的行并退出。
<Esc>退出而不更改标记的行。
启动交互式shell(键入^d以返回到cscope)。
ctrl+l重绘屏幕。
?提供有关cscope命令的帮助信息。

特殊键:如果终端具有在vi中工作的箭头键,则可以使用它们在输入字段中移动。 向上箭头键可用于移动到上一个输入字段,而不是重复使用<Tab>键。如果您有<CLEAR><NEXT><PREV>键,它们将分别充当^l,+和 – 命令。

注:一直没有搞明白这个是怎么使用的

命令行模式

  • -l选项允许您在面向屏幕的界面不会有用的情况在使用cscope,例如,来自另一个面向屏幕的程序。
  • 当cscope准备输入以字段编号(从0开始计数)后立即跟随搜索模式的输入行时,它将提示>>,例如,lmain找到主函数的定义。
  • 如果您只想要单个搜索,请使用-L和-num模式选项,
  • 而不是-l选项,并且不会获得>>提示。
  • 对于-l,cscope输出参考行数 cscope:2行
  • 对于每个找到的索引,cscope输出文件名,函数名,行号,行文本,用空格隔开
  • 请注意,与面向屏幕的界面不同,不会调用编辑器来显示单个引用。
  • 您可以使用c命令在搜索时忽略/使用字母大小写。
  • 您可以使用r命令重建数据库。
  • 当cscope检测到文件结束时,或者当输入行的第一个字符是“^d”或“q”时,它将退出。

环境变量

环境变量描述
CSCOPE_EDITOR覆盖EDITOR和VIEWER变量。在cscope中使用不同于EDITOR/VIEWER变量指定的编辑器
CSCOPE_LINEFLAG编辑器行号的格式。cscope默认通过editor +N file来调用编辑器,N是编辑器应跳转到的行号。emacs和vim都使用此格式。如果您的编辑器需要不同的方式,请在此变量中指定此项,并使用“%s”作为行号的占位符。例如:editor -#103 file,应将此变量设置为-#%s
CSCOPE_LINEFLAG_AFTER_FILE如果需要在要编辑的文件名后使用行号选项调用编辑器,请将此变量设置为“yes”。例如:editor file +#number
EDITOR首选编辑器,默认为vi。
HOME主目录,自动设置为登录。
INCLUDEDIRS以冒号分隔的目录列表,用于搜索#include文件。
SHELL首选shell,默认为sh。
SOURCEDIRS以冒号分隔的目录列表,用于搜索其他源文件。
TERM终端类型,必须是屏幕终端。
TERMINFO终端信息目录的完整路径名。
TMPDIR临时文件目录,默认为/var/tmp。
VIEWER首选文件显示程序(如less),它会覆盖EDITOR(见上文)。
VPATH以冒号分隔的目录列表,每个目录下面都有相同的目录结构。 如果设置了VPATH,cscope将搜索指定目录中的源文件; 如果未设置,则cscope仅在当前目录中搜索。

文件

文件描述
cscope.files包含-I,-p,-q和-T选项的默认文件以及源文件列表(由-i选项覆盖)。
cscope.out交叉索引数据库(由-f选项覆盖),如果无法在当前目录中创建,则放在主目录中。
cscope.in.out、cscope.po.out默认的反向索引数据库(由-q选项建立)。如果使用-f选项重命名数据库文件(cscope.out), 则会在加上.in和.po后缀
INCDIRinclude文件的标准目录(通常为/ usr / include)。

留下评论