Cscope 是一个非常灵巧的工具,但是它仍然需要使用您最顺手的编辑器去发挥它强大的功能。 幸运的是,Vim 已经包含了 Cscope 支持。 This tutorial introduces you both to Vim's built-in Cscope support, and to a
set of maps that make searching more convenient.
--
这篇指导主要介绍了 Vim 内在的 Cscope 支持,以及如何更好的通过已配置的 Map(a set of maps)实现搜索功能。 It is assumed you know the basics of using a vi-style editor, but you don't
need any particular knowledge about Vim (where Vim-specific features--like
multiple windows--are used, a working knowledge of the features is briefly
introduced). You also don't need to know anything about Cscope: the basics are
introduced as we go along.
--
下面假设您有基本的使用类 vi 编辑器的技能 - 不过并不需要 Vim 更特殊和高深的功能(熟悉 ViM 的一些高级功能,比如多窗口等需要一定的精力和时间)。您不需要了解有关 Cscope 的任何信息:这就是我们下面要阐述的。 In a nutshell, Vim's Cscope support is very similar to Vim's ctags features,
in case you've used those. But since Cscope has more search types than ctags,
there are a few differences.
--
万变不离其宗,如果您使用类似功能的软件,比如 Vim 的 ctags,您会发现 Cscope 与其非常的相似。不过有一点不同的是,Cscope 比 ctags 有更多的搜索类型和选项。 This is a hands-on tutorial, so open up a shell, and follow these steps:
--
这是具体步骤的指导,所以请您打开一个终端(shell),并且按照下面的步骤:
Get and install Cscope if you don't have it already on your machine.
Ideally, you will also have Vim 6.x, but you can get most of the
functionality with later versions of Vim 5 (vertical splits don't work, but
horizontal splits will work if you modify the maps as described in the
file's comments).
Note: If your version of Vim wasn't compiled with '--enable-cscope',
you will need to reconfigure and recompile Vim with that flag. Most
Vim binaries that ship with Linux distributions have the Cscope
plugin enabled.
--
如果您的系统还未安装 Cscope ,您第一步需要做的就是获取和安装它。理想上如果您使用 Vim 6.x 版本应该无此问题,不过 Vim 5.x 版本仍然可以获得大部分的功能函数(垂直分割似乎不起作用,不过水平分割通过在文件中指定 Maps 可以使用)。
注意:如果您的 Vim 在编译时没有加入 '--enable-cscope' 选项,请您加入此选项并重新编译安装。大部分 Linux 发行版中 Vim 中的此编译选项是被禁止的。
Download the cscope_maps.vim file, and
arrange for it to be read by Vim at startup time. If you are using Vim 6.x,
stick the file in your $HOME/.vim/plugin directory (or in any other 'plugin'
subdirectory in your 'runtimepath'). If you are using Vim 5.x, you can
either cut and paste the entire contents of the cscope_maps file into your
$HOME/.vimrc file, or stick a "source cscope_maps.vim" line into your .vimrc
file.
--
下载 cscope_maps.vim 文件,并在您的 Vim 启动配置文件中加入此文件。 如果您使用的是 Vim 6.x 版本,您可以将这个文件安排在 $HOME/.vim/plugin 目录下(如果是其他的目录,请您了解您的 'runtimepath' 环境变量)。 如果您正在使用的是 Vim5.x 的版本,您可以将此文件的所有内容加入您的 $HOME/.vimrc 文件中,或者在 .vimrc 中加入 "source cscope_maps.vim" 命令(注,此文件无比在可识别的路径中)。
Go into a directory with some C code in it, and enter 'cscope -R'
(the '-R' makes Cscope parse all subdirectories, not just the current
directory). Since we aren't passing the '-b' flag (which tells Cscope to
just build the database, then exit), you will also find yourself inside
Cscope's curses-based GUI. Try a couple of searches (hint: you use the
arrow keys to move around between search types, and 'tab' to switch between
the search types and your search results). Hit the number at the far left
of a search result, and Cscope will open Vim right to that location.
(unless you've set your EDITOR environment variable to something besides
Vim). Exit Vim, and you'll be right back in the Cscope GUI where you left
off. Nifty.
Alas, the Cscope interface has one big problem: you need to exit Vim each
time you want to do a new search. That's where the Vim plugin comes in.
Hit CTRL-D to exit Cscope.
--
进入有 C 代码的目录,键入 'cscope -R' 命令('-R' 选项指定包含此目录的子目录,而非仅仅是当前目录)。如果我们没有加入 '-b' 参数(此参数告诉 Cscope 生成数据库以后就退出),您会发现您仍然在 Cscope 的界面(curese-based GUI)中。在这里你就可以做一些 搜索操作(提示:您可以使用方向键改变搜索类型,使用 'tab' 建可以在交替搜索类型和搜索结果)。键入搜索列表左边的数字,Cscope 就会使用 Vim 打开对应的地址(如果您指定了 EDITOR 环境变量,那么调用的编辑器可能不是 Vim)。当您退出 Vim,Cscope 又将您带入到其主界面中,非常的好用。
可惜 Cscope 有一个缺陷:您如果打算编辑一个新的搜索结果,那么您必须退出当前的编辑状态。解决这一办法就是 Vim 对应的插件。使用 CTRL-D 推出 Cscope。
Start up Vim. If you want, you can start it with a C symbol (ex:
'vim -t main'), and you should hop right to the definition of that symbol
in your code.
--
打开 Vim,如果您使用 C 代码中已有的标记(symbol)(例如:'vim -t main'),那么 Vim 将跳转到您所希望的地方。
Put the cursor over a C symbol that is used in several places in your
program. Type "CTRL-\ s" (Control-backslash, then just 's') in quick
succession, and you should see a menu at the bottom of your Vim window
showing you all the uses of the symbol in the program. Select one of them
and hit enter, and you'll jump to that use. As with ctags, you can hit
"CTRL-t" to jump back to your original location before the search (and you
can nest searches and CTRL-t will unwind them one at a time).
Mnemonic: the '\' key is right next to the ']' key, which is used for
ctags searches.
--
将 光标移动到程序中的各个 C 标签中。连续的快读的键入 "CTRL - \ S"(就是按下 CRTL - 反斜线,然后再按 'S'),然后你会看见在 Vim 底部弹出一个窗口(Window),它显示了程序中所对应的标记。选择相应的一个并键入回车,就会跳到对应的位置。和 ctags 一样,你可以键入 "CTRL-t" 就可以回到搜索前的位置。
助记符:'\' (反斜线)是在按键 ']' 的右边(它用来对应 ctags 搜索)。
Try the same search, but this time via "CTRL-spacebar s". This time,
your Vim window will split in two horizontally , and the Cscope search
result will be put in the new window. [if you've never used multiple Vim
windows before: move between windows via 'CTRL-W w' (or CTRL-W arrow key, or
CTRL-W h/j/k/l for left/up/down/right), close a window via 'CTRL-W c' (or
good old ':q'), make the current window the only one via 'CTRL-W o', split a
window into two via 'CTRL-W s' (or 'CTRL-W v' for a vertical split), open a
file in a new window via ':spl[it] filename']
Mnemonic: there's now a big, spacebar-like bar across the middle of your
screen separating your Vim windows.
--
继 续做一些同样的搜索,不过这次是使用 "CTRL-空格 s"。这次,Cscope 搜索的结果将出现在 Vim 新分割的水平窗口中。[如果您还未使用过 Vim 的多窗口功能:移动使用 'CTRL-W w'(或者使用 'CTRL-W' 加方向键,或者 CTRL-W h/j/k/l 对应 左/上/下/右),关闭窗口使用 'CTRL-W c'(或者使用办法 ':q'),仅仅使用当前窗口使用 'CTRL-W o',分割两个同样的窗口使用 'CTRL-W s'(或者使用 'CTRL-W v' 垂直分割),在一个新窗口打开文件为 ':spl[it] 文件名']
助记符:各分割条分割了您的 Vim 窗口。
现 在使用 "CTRL-空格 CTRL-空格 s"(按住 CTRL 键同时敲两次空格)执行新的搜索命令。如果您的手指还不是足够的灵活,建议您编辑 cscope_maps.vim 文件更改 Vim 中的 timeout 设置,其在文件中的注释中有说明[事实上,我建议关闭 Vim 中那该死的 timeouts 选项]。如果运气足够好运行成功的话,那么就能看见一个垂直分割的搜索结果窗口(注意:这个功能在 5.x 版本中并不适用,垂直分割是 6.x 版本的新功能)。
Up to now we've only been using the keystroke maps from
'cscope_maps.vim', which all do a search for the term that happens to be
under your cursor in Vim. To do Cscope searches the old-fashioned way
(using Vim's built-in Cscope support), enter ":cscope find symbol foo" (or,
more tersely, ":cs f s foo"). To do the horizontal split version, use
":scscope" (or just ":scs") instead (Vim 6.x only). While it's easier to
use the maps if the word you want to search for is under your cursor, the
command line interface lets you go to any symbol you type in, so you'll
definitely want to use it at times.
--
直 到目前为止,我们所介绍的搜索功能都是来自 'cscope_maps.vim' 文件中定义的一些快捷键。这些快捷键能迅速的找到光标所在的标签所对应所指向的位置(有点拗口)。另外一个常用的方式(使用 Vim 内建的 Cscope 支持),键入":cscope find symbol foo"(更简洁的,"cs f s foo")。执行水平分割的版本,使用 ":scscope"(或者直接使用 ":scs"),不过这仅仅在 6.x 版本下运行。 这样就可以非常容易的指定光标下未指定的标签,命令行的接口允许您指定你想要的任何标签名。我想你肯定有需要它的时候的。
So far we've only been doing one kind of search: 's', for 'find all
uses of symbol X'. Try doing one of Cscope's other searches by using a
different letter: 'g' finds the global definition(s) of a symbol, 'c'
finds all calls to a function, 'f' opens the filename under the cursor
(note: since Cscope by default parses all C header files it finds in
/usr/include, you can open up most standard include files with this).
Those are the ones I use most frequently, but there are others (look in the
cscope_maps.vim file for all of them, and/or read the Cscope man page).
--
目 前介绍的仅仅是对应 's' 的搜索命令,在所有结果中查询使用 'X' 命令。下面我们可以尝试其他的一些 Cscope 搜索命令:'g' 为全局搜索、'c' 为搜索指定的函数名称、'f' 为打开光标对应名称的文件(注意:Cscope 默认在 /usr/include 目录下获取 C 头文件,您使用此规则打开大部分的标准库)。上述这些是本人经常使用的一些功能,不过不仅仅是这些还有其他的(对应的其他功能您可以参阅 cscope_maps.vim 文件或者阅读 Cscope 的参考文档)。
Although Cscope was originally intended only for use with C code,
it's actually a very flexible tool that works well with languages like C++
and Java. You can think of it as a generic 'grep' database,
with the ability to recognize certain additional constructs like function
calls and variable definitions. By default Cscope only parses C, lex, and
yacc files (.c, .h, .l, .y) in the current directory (and subdirectories, if
you pass the -R flag), and there's currently no way to change that list of
file extensions (yes, we ought to change that). So instead you have to make
a list of the files that you want to parse, and call it 'cscope.files' (you
can call it anything you want if you invoke 'cscope -i foofile'). An easy
(and very flexible) way to do this is via the trusty Unix 'find' command:
find . -name '*.java' > cscope.files
Now run 'cscope -b' to rebuild the database (the -b just builds the database
without launching the Cscope GUI), and you'll be able to browse all the
symbols in your Java files. Apparently there are folks out there using
Cscope to browse and edit large volumes of documentation files, which shows
how flexible Cscope's parser is.
For larger projects, you may additionally need to use the -q
flag, and/or use a more sophisticated 'find' command. See our tutorial on using Cscope with large projects for more info.
--
虽然 Cscope 是为 C 语言设计的工具,但其作为富有弹性的工具仍然能够非常好的支持比如 C++ 和 Java 等其他语言。 你可以认为这是一个通用的 'grep' 数据库,同时还具有其他一切额外的功能,比如函数调用和变量定义。 默认情况下 Cscope 只会在当前目录下针对 C、lex 和 yacc(扩展名分别为 .c、.h、.l、.y)程序文件进行解析(如果指定了 -R 参数,则包含其自身的子目录),目前还没有办法让用户自己指定扩展名(是的,我们应该改变这种状况)。作为一个替代的方案,我们可以生成一个名为 'cscope.finds' 的文件列表,并交由 Cscope 读取解析(你可以任何使用通过 'cscope -i foofile' 命令调用)。 在 Unix 系统下你可以非常容易的(而且强大的)使用 'find' 命令生成这个列表:
find . -name '*.java' > cscope.files
现在运行 'cscope -b' 命令重新生成数据库( -b 参数表示仅仅重新生成数据库而不调用 Cscope 前端),然后你就可以浏览 Java 程序中的变量等信息了。显然,这说明 Cscope 解析器是非常灵活的。
在大型项目中,您可能需要 -q 选项,并且(或者)使用功能更强大的 'find' 命令。此方面请您查看 使用 Cscope 进行大型项目管理指南 文档。
尝试配置 $CSCOPE_DB 环境变量指定 Cscope 数据库的存储位置,这样做的好处就是能在不同的目录中调用同一数据库。这功能对于那些设置了不同目录的项目尤其有用。注意:在使用此功能前,请进入绝对路径:cd 到 / 目录,并且运行:
find /my/project/dir -name '*.c' -o -name '*.h' > /foo/cscope.files
然后再在同样的目录使用 Cscope 调用 cscope.files 文件(或者使用 'cscope -i /foo/cscope.files' 命令),然后再设置 $CSCOPE_DB 环境变量(指向 scscope.out 文件的结果):
cd /foo
cscope -b
CSCOPE_DB=/foo/cscope.out; export CSCOPE_DB
(上述的命令是针对 Bourne/Korn/Bash shells 的:我忘记怎么使用 csh-based Shell 来定义全局变量了,我不想在这上面花太多的功夫。)
您现在您本机上的任何目录使用 'vim -t foo' 命令,然后 Vim 会跳转到 'foo' 所定义的正确位置。我曾经尝试编写一些 Shell 脚本(就是定义 CSCOPE_DB 环境变量),用来切换我不同的项目,比如可以简单的使用 'source projectA' 命令。
BUG: Cscope 在 15.4 以前的版本中,有一个非常愚蠢的 BUG。如果数据库名是另外名字而非 'cscope.out' 可能会造成 Vim 假死。解决这个问题的方法就是使用 '-f foo' 参数代替 'foot.out',这样就好了(最新版本已经解决了该问题)。
That's it! Use ":help cscope" (in Vim) and/or "man cscope" (from your
shell) if you've got questions, and to learn the fine points.
--
就是这些了!您可以在 Vim 中使用 ":help cscope" 或者在命令行中键入 "man cscope" 查看更具体的 Cscope 说明。