搬瓦工主机

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后缀
INCDIR include文件的标准目录(通常为/ usr / include)。

发表评论

Item added to cart.
0 items - ¥0.00