新入公司的电脑卡到爆,编译服务器居然是8核的。想用vim,没有安装权限,也不能联网。无奈只能自己在家里的虚拟机鼓捣好了,再上传到编译服务器,顺便记录一下过程。相关文件已经打包上传,可以直接免积分下载。
1. 安装依赖应用
1.1 cscope 和 ctags
可以直接安装,对于离线环境,可以直接复制安装号的文件运行。免费下载链接.。
2. 使用方法
2.1 cscope
2.1.1 创建数据库
cscope -Rbqk
-R:为当前目录下所有子目录创建数据库
-b:生成数据库之后退出,不启动自带界面
-q:生成cscope.in.out和cscope.po.out,加快搜索速度
-k:跳过/usr/include目录
-I dir :在-I选项指出的目录中查找头文件
-u:扫描所有文件,重新生成交叉索引文件;
-C:在搜索时忽略大小写;
i: 如果保存文件列表的文件名不是cscope.files时,需要加此选项告诉cscope到哪里去找源文件列表;
编写脚本:
#!/bin/sh
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files
ctags -R
-o 是连接find之间的内容。
执行之后,会生成如下文件:
e0005055@ibudev01:~/gst_eswin$ ll
total 264920
-rw-r--r-- 1 e0005055 eswin 13639680 8月 23 11:40 cscope.in.out
-rw-r--r-- 1 e0005055 eswin 107462409 8月 23 11:40 cscope.out
-rw-r--r-- 1 e0005055 eswin 150046752 8月 23 11:40 cscope.po.out
2.1.2 编辑vim配置
if has("cscope")
set csprg=/home/aero/Documents/usr_env/cscope "此处需要填写实际路径,因为我没有系统权限,所以cscope是放在自己的目录下"
set csto=0
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
" else add database pointed to by environment
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
nmap <C-\>s :cs find s <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>c :cs find c <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>t :cs find t <C-R>=expand("<cword>")<CR><CR>
nmap <C-\>e :cs find e <C-R>=expand("<cword>")<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>
nmap <C-\>d :cs find d <C-R>=expand("<cword>")<CR><CR>
endif
2.1.3 使用cscope搜索跳转
因为文件索引是当前目录的相对路径,以上命令需要在cs生成cscope.out文件时候的源目录下执行,否则会提示找不到文件。
可以直接在vim命令行输入cs help查看cscope帮助:
cscope commands:
add : Add a new database (Usage: add file|dir [pre-path] [flags])
find : Query for a pattern (Usage: find a|c|d|e|f|g|i|s|t name)
a: Find assignments to this symbol
c: Find functions calling this function 查找调用本函数的函数
d: Find functions called by this function 查找本函数调用的函数,光标需要落在函数名上。
e: Find this egrep pattern
f: Find this file跳转光标位置声明的文件,如有多个匹配项则输入序号
g: Find this definition 跳转到定义
i: Find files #including this file 搜索包含该头文件的文件
s: Find this C symbol 搜索该对象出现的所有位置,之后输入序号查看
t: Find this text string
help : Show this message (Usage: help)
kill : Kill a connection (Usage: kill #)
reset: Reinit all connections (Usage: reset)
show : Show connections (Usage: show)
以函数function_name为例,cscope 查询方式如下:
- 跳转定义等
ctrl+] # 光标在function_name上,按下ctrl键的同时按下’]’键
:tag function_name # 需要安装ctag
:cs f g function_name # 需要配置vimrc的escope
ctrl+\ 之后按下g #需要配置vimrc中[cs find g]的映射
- 返回跳转之前的文件位置:
ctrl+t #按下ctrl键的同时按下t键
总结常用操作:
跳转到该定义: ctrl+\ 之后按下g ctrl+]
跳转到该文件: ctrl+\ 之后按下f ,file
跳转到被调用处: ctrl+\ 之后按下c,caller
搜索该对象所有位置 ctrl+\ 之后按下s,symbol
搜索全部字符串
ctrl+\ 之后按下t,txt
s是仅仅搜索对象,比如每个变量或者函数名。t是搜索所有字符串,包含的内容会更多。1
一步步学cscope高级使用:
https://blog.csdn.net/freelyc/article/details/4022511
2.2 插件
下载对应的vimx文件,离线环境可以直接拷贝现存的文件。免费下载链接.
2.2.1 F2 显示/隐藏标签和文件列表
2.2.2 在头文件和源文件之间切换
命令模式输入:A
2.2.3 自动补全
插入模式按下:Ctrl+X Ctrl+O
2.3 多窗口操作
在调用出其它窗口后,可以通过ctrl+W,然后使用前后左右移动来选择窗口。关闭窗口和在单个窗口模式下一样的,使用:q可以直接关闭某个窗口。
:qall -- 关闭所有窗口,退出vim。
:wall -- 保存所有修改过的窗口。
:only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
:close -- 关闭当前窗口,CTRL-W c能实现同样的功能。
(象 :q :x同样工作 )