待整理。。。有时间了继续
在vim的世界中,当查看源代码的时候,使用ctags工具可以实现函数方法的跳转,若要在源码中找到对应函数方法在哪些地方进行了调用或在哪儿定义的,只有使用grep命令进行查找得到,这样需要另起一个终端或在同一个终端中使用:!grep fucname ./* -rn | grep tags,这样的切换对于ssh到远程操作的并不那么方便。
那么,有没有更好的插件能够直接完成以上这个功能需求呢? 答案是肯定的,使用cscope工具。它能够完成以上描述的ctags+grep所能够完成的功能。
cscope的安装和配置
我ubuntu下cscope的配置如下:
"-- CScope setting -- if has("cscope") set csprg=/usr/bin/cscope set csto=0 set cst set cscopequickfix=s-,c-,d-,i-,t-,e- set nocsverb if filereadable("cscope.out") cs add cscope.out elseif $CSCOPE_DB != "" cs add $CSCOPE_DB endif set csverb endif map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR> imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR> nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR> nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR> nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<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> :copen<CR><CR>
在需要建立cscope索引的源码目录下,运行“cscope -Rbq . ”命令即可生成cscope索引。
然后,用Vim打开一个c源程序文件,在vim中执行命令“:cs add cscope.out”来加载索引文件(如果运行Vim时所在目录中就有cscope.out,则Vim会自动加载cscope索引)。
:copen 打开 quickfix窗口,可以在后面添加窗口高度参数,如10行,:copen 10
:cclose 关闭 quickfix窗口
Cscope相关命令
所有的cscope命令都是通过向主cscope命令”:cscope”传递参数选项。她最短的缩写是”:cs”。”:scscope”命令也做同样的事情并且同时会横向分隔窗口(简称:”scs”)。
可用的缩写有:
add :增加一个新的cscope数据库/链接库
使用方法:
:cs add {file|dir} [pre-path] [flags]
其中:
[pre-path] 就是以-p选项传递给cscope的文件路径,是为了给以相对路径表示的文件前面加上的前缀path (绝对路径),这样在cscope.out所在目录的子目录下同样可以使用它了,就不需要切换到cscope.out文件所在的目录。
[flags] 你想传递给cscope的额外旗标
生成的cscope.out中保存的是相对路径,而不是绝对路径。这样的话,在cscope 中查找tags的时候,是没法打开相应的包含查找结果的文件的。怎么避免这个问题呢?有如下方法:
【推荐】在:cs add的时候,接一个绝对路径prepend path
:cs add [cscope.out] [pre-path]
实例:
:cscope add /home/user/workspace/project :cscope add ~/workspace/project/cscope.out /home/user/workspace/project【推荐格式】 :cscope add cscope.out /usr/local/vim –C
find :查询cscope。所有的cscope查询选项都可用除了数字5(“修改这个匹配模式”)。
使用方法:
:cs find {querytype} {name}
其中:
{querytype} 即相对应于实际的cscope行接口数字,同时也相对应于nvi命令:
0或者s —— 查找这个C符号
1或者g —— 查找这个定义
2或者d —— 查找被这个函数调用的函数(们)
3或者c —— 查找调用这个函数的函数(们)
4或者t —— 查找这个字符串
6或者e —— 查找这个egrep匹配模式
7或者f —— 查找这个文件
8或者i —— 查找#include这个文件的文件(们)
实例:(#号后为注释)
:cscope find c ftpd_send_resp # 查找所有调用这个函数的函数(们) :cscope find 3 ftpd_send_resp # 和上面结果一样 :cscope find 0 FTPD_CHECK_LOGIN # 查找FTPD_CHECK_LOGIN这个符号
help :显示一个简短的摘要。
使用方法:
:cs help
kill :杀掉一个cscope链接(或者杀掉所有的cscope链接)
使用方法:
:cs kill {num|partial_name}
为了杀掉一个cscope链接,那么链接数字或者一个部分名称必须被指定。部分名称可以简单的是cscope数据库文件路径的一部分。要特别小心使用部分路径杀死一个cscope链接。
假如指定的链接数字为-1,那么所有的cscope链接都会被杀掉。
reset:重新初始化所有的cscope链接。
使用方法:
:cs reset
show:显示cscope的链接
使用方法:
:cs show
假如你在使用cscope的同时也使用ctags,|:cstag|可以允许你在跳转之前指定从一个或另一个中查找。例如,你可以选择首先从cscope数据库中查找,然后再查找你的tags文件(由ctags生成)。上述执行的顺序取决于|csto|的值。
|:cstag|当从cscope数据库中查找标识符时等同于“:cs find g”。
|:cstag|当从你的tags文件中查找标识符时等同于“|:tjump|”。
摘抄 vim技巧
9、[[ 跳到函数头部,]] 跳到函数尾部
10、quickfix是vim的标准插件,vim自带。
quickfix功能将编译过程中产生的错误信息保存到文件中,然后vim利用这些信息跳转到源文件的对应位置,我们就可以进行错误的修正,之后跳到下一个错误重复上述操作,从而极大地提高编译错误的修改效率。
quick常用命令 (也可以配合cscope一起使用):
:cc 显示详细错误信息
:cp 跳到上一个错误
:cn 跳到下一个错误
:cl 列出所有的错误
:copen 打开 quickfix窗口,可以在后面添加窗口高度参数,如10行,:copen 10
:cclose 关闭 quickfix窗口
11、按v进入可视化界面,然后通过左右键选择文本,再按y进行复制,p就可以进行粘帖了
12、不退出vim,直接在vim中执行 “:!gcc file.c -o file” 就可以编译程序了
13、vim中查找特地字符串
/pattern enter
n 朝同一个方向搜索
N 朝反方向搜索
/ pattern enter
要查找单个单词,键入该单词,并在这个单词的两边都加上空格
/^pattern enter
要查找仅出现在行首的单词,请在该单词前面加上^
/pattern$ enter
要查找仅出现在行末的单词,请在该单词的后面加上$
如果要把^和$当作普通的符号,就需要在前面加上\
Reference
vim+ctags+cscope安装与使用总结
Cscope的使用(领略Vim + Cscope的强大魅力)
Vim/Cscope 入门指导
Vim中自动加载cscope.out