打造linux下的source insight——vim插件安装使用总结
source insight是windows下的优秀编辑器,适合阅读管理代码,主要有以下功能:
查找函数,变量或者宏的定义。
查找函数,变量或者宏的引用位置。
查找函数被调用的位置
查找某个符号在工程内的所有匹配
由于unix哲学主张一个工具只做好一件事情,所以linux下并没有这种集多样功能于一体的软件。vim是非常优秀的编辑器,本文介绍如何通过安装插件将vim武装成和source insight一样甚至更强大的工具。
我的环境是ubuntu12.04 LTS+vim version 7.3
1. ctags
ctags插件用来查找函数,变量或者宏的定义,ubuntu下可以非常方便的安装,
sudo apt-get install exuberant-ctag
在源文件目录下执行命令
ctags -R
会生成一个tags文件,里面包含了所有源文件的符号信息。在vim中,快捷键ctrl+]会跳到当前函数的定义处。为了方便生产tags,设置快捷键F5生成tag,将下面命令加入到~/.vimrc
nnoremap <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
nnoremap 表示vim普通模式的键映射,
--c++-kinds=+p : 为标签添加函数原型(prototype)信息
--fields=+iaS : 为标签添加继承信息(inheritance),访问控制(access)信息,函数特征(function Signature,如参数表或原型等)
--extra=+q : 为类成员标签添加类标识
如果项目有多层文件结构,一般只在根目录生成一个tag文件,那么子目录访问不到tag文件,在子目录中直接打开源文件将找不到函数的tag,一个方便的做法是在.vimrc中将tag加到tags的查找路径中,每个项目一项。
“project1”
set tags+=/project1/tags
ctags的快捷键:
ctrl+] 切换到定义处
g+ctrl+] 如果多处匹配,列出匹配tag列表供选择
count+ctrl+t 后退count个tag
:count+tag 前进count个tag
:ts 列出匹配tag列表,存在多个匹配时
:tn 跳到下一处匹配tag
:tp 跳到上一处匹配tag
:tf 跳到地一个匹配tag
:tl 跳到最后一个匹配tag
:set tags? 查看tags文件路径
2.
cscope
Ctags只能找到符号定义的地方,如果要像source
insight一样,具备查找类似函数调用查找,符号引用查找等高级功能,就要借助于cscope了。Cscope是类似于ctags的工具,不过它的功能比ctags强大多了。
在当前源文件目录下执行
cscope
–Rbq
其中
-R
:递归处理子层目录
-b
:生成数据库后自动退出
-q
:生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
vim打开源文件后,增加cscope数据库到当前环境中
:cs
add cscope.out
可以发现执行后没有反应,那是因为没有打开cscopeverbose选项,打开后增加数据库后会显示成功还是失败信息,默认是关闭的,我们把它打开。
:set
csverb
想要查看当前已经加载了哪些cscope数据库
:cs
show
想要删除某个数据库
:cs
kill #
安装ctags和cscope后,就有两种数据库了,默认会同时查看cscope和ctag数据库,这个行为由cst控制,默认是打开的。
:set
cst
Csto控制查看数据库的顺序,等于0时优先查看cscope数据库,再查看ctags数据库
:set
csto=0
为了方便,我们可以在.vimrc中自动增加当前路径下的cscope数据库
if has("cscope")
set csprg=/usr/local/bin/cscope
set csto=
set cst
set csverb
if filereadable("cscope.out")
cs add cscope.out
elseif $CSCOPE_DB != ""
cs add $CSCOPE_DB
endif
set csverb
endif
配置好以后就可以使用cscope的强大的查找功能了,cscope查找命令
:cs find type name
Type包括
0或者s —— 查找name在这个工程中出现的位置
1或者g —— 查找name的定义
2或者d —— 查找name调用的函数
3或者c —— 查找调用name的函数
4或者t —— 查找name字符串
6或者e —— 查找egrep匹配模式
7或者f —— 查找文件
8或者i —— 查找#include 文件名为name的文件
我在平常使用的最多是查找定义和调用当前函数的函数,所以在.vimrc中配置成F3和F4快捷键,自动查找光标下符号。
nmap <F3> :cs find 3 <C-R>=expand("<cword>")<CR><CR>
nmap <F4> :cs find 0 <C-R>=expand("<cword>")<CR><CR>
3.taglist
source insight左边是当前文件的所有符号窗口,包括include的头文件,函数和变量。这个功能可以由taglist实现。Ubuntu下安装非常方便,
vim-addons install taglist
vim-addons是vim的插件管理程序,如果没有安装的话可以执行以下命令安装
sudo apt-get install vim-addon-manager
sudo apt-get install vim-scripts
vim-addons status可以看到当前插件的安装状态
vim-addons install 安装插件
vim-addons remove 删除插件
安装好taglist后,可以自己打开和关闭taglist窗口,
:TlistToggle
可以设置成F8快捷键,不过等后面安装了winmanager后也不需要手动控制了。
nnoremap <silent> <F8> :TlistToggle<CR> F8
几个比较实用的选项需要打开:
let Tlist_Auto_Open=1 “打开文件时自动打开taglist
let Tlist_Exit_OnlyWindow=1 “关闭文件时自动关闭taglist
let Tlist_File_Fold_Auto_Close=1 “taglist window中折叠非当前文件
let Tlist_Process_File_Always=1 “taglist始终解析文件
需要查看更多选项请help
:help taglist.txt
Ctrl-w-w 跳到taglist窗口,Taglist窗口中也有快捷键,
<enter> 跳到光标下的tag定义的位置
u 更新taglist
zo 打开折叠
zc 关闭折叠
<tab>或]] 跳到下一个文件
<BS>或[[ 跳到上一个文件
4.NERDTree
Source insight右边是文件列表窗口,显示了工程的所有文件名。文件管理插件NERDTree具有类似的功能,该插件可以显示当前目录下所有文件和目录,并方便地浏览和操作文件。
Vim addon manager没有NERDTree插件,需要自己下载NERDTree,下载后将plugin/NERD_tree.vim 和doc/NERD_tree.txt分别复制到.vim的相应目录下
为了让winmanager顺利打开NERDTree窗口,在.vimrc中增加下面代码,
let g:NERDTree_title='[NERD Tree]'
function! NERDTree_Start()
exec 'NERDTree'
endfunction
function! NERDTree_IsValid()
return
endfunction
5.winmanager
为了像source insight一样同时显示多个窗口,需要winmanager插件。
vim-addons install winmanager
同时在winmanager中显示NERDTree和taglist窗口,默认在左边,
let g:winManagerWindowLayout='NERDTree|TagList'
设置快捷键wm打开winmanager,
nmap wm :WMToggle<cr> wm命令打开
设置窗口转换快捷键,不过在用了MiniBufExplorer后有更方便的选择,
map <c-w><c-b> :BottomExplorerWindow<cr> 跳到下面窗口
map <c-w><c-f> :FirstExplorerWindow<cr> 跳到上面窗口
最好打开vim时会自动打开winmanager窗口,
let g:AutoOpenWinManager = 1
同时修改winmanager.vim
"set auto open Winmanager
if g:AutoOpenWinManager
autocmd VimEnter * nested call s:StartWindowsManager()|3wincmd w|q
endif
其中3表示打开后光标在第3个窗口,即源文件窗口。1,2分别表示NERDTree和taglist窗口。
因为winmanager总会打开一个没有用的空窗口,不知道为什么,需要最后加q关闭它。如果是用WMToggle打开winmanager的话,要关闭这个空窗口就需要在winmanager.vim的ToggleWindowsManager函数中增加q。
function! <SID>ToggleWindowsManager()
if IsWinManagerVisible()
call s:CloseWindowsManager()
else
call s:StartWindowsManager()
"close empty window
exe 'q'
end
endfunction
更多请查看
:help winmanager
6.MiniBufExplorer
写程序的时候肯定会多个源文件同时编辑,像source insight就有个window list,保存了最近打开过的所有源文件。Vim通过buffer来达到类似的作用,buffer的命令操作包括
:ls 显示当前打开的所有文件
:bn 跳到下一个文件
:bp 跳到上一个文件
:bd 删除一个buffer
MiniBufExplorer插件提供了更直观的方式,将buffer显示在最上端的窗口内,窗口操作包括
<Tab> 向前循环切换到每个buffer名上
<S-Tab> 向后循环切换到每个buffer名上
<Enter> 在打开光标所在的buffer
d 删除光标所在的buffer
为了只在在源码窗口打开选中的buffer,需要设置miniBufExplModSelTarget,默认是关闭的,
let g:miniBufExplModSelTarget = 1
不过MiniBufExplorer还有个更重要的功能是可以实现用CTRL键加h|j|k|l方便地切换窗口,
let g:miniBufExplMapWindowNavVim = 1 用<CTRL-h|j|k|l>切换到上下左右窗口
7.OmniCppComplete
大部分IDE都支持自动补全功能,vim作为linux下优秀的编辑器当然不缺少,不过vim自带的补全功能,ctrl+n,ctrl+p可以再当前源文件中实现简单的补全功能,但这是远远不够的。OmniCppComplete利用了Ctags生成的tag数据库,实现了文件间名字补全,包括
命名空间(namespace),类(class),结构(struct)和联合(union)补全
函数属性成员和返回值类型补全
"this"指针成员补全
C/C++类型转换(cast)对象补全
类型定义(typedef)和匿名类型(anonymous types)补全
安装好后输入时键入ctrl+x ctrl+o就会补全当前名字,使用过IDE的同学都知道补全只要一个tab键就行了,按这么多键太麻烦了。这就需要supertab插件的帮助了,
Vim-addons install supertab
安装好后,设置以下选项,
let g:SuperTabRetainCompletionType=2
let
g:SuperTabDefaultCompletionType="<C-X><C-O>"
SuperTabDefaultCompletionType设置tab键对应的命令,
SuperTabRetainCompletionType表示
0
- 不记录上次的补全方式
1
- 记住上次的补全方式,直到用其他的补全命令改变它
2
- 记住上次的补全方式,直到按ESC退出插入模式为止
8.surround
在在编程时会遇到大量的匹对符号,如“,(,{
等等,高效地处理这些符号可以大大地提高编程效率,Surround正是处理这些符号的非常优秀等等插件。
Surround的使用非常简单明了(*代表当前光标位置):
插入符号
Hello
w*orld! ysiw) Hello (world)!
或者
Hello
w*orld! veS) Hello (world)!
替换
"Hello
*world!" cs"' 'Hello world!'
删除
"Hello
*world!" ds" Hello world!
总结
至此,在安装了以上插件后,vim已经具备了强大的编辑功能。当然,这里只是列出一些基本插件,还有很多其他有趣又好用的插件,比如注释用的NERD_commenter.vim,高亮书签的VisualMark,头文件切换的a.vim等等,以后有机会再研究。
打造linux下的source insight——vim插件安装使用总结的更多相关文章
- Linux下beego及beego相关插件安装
Linux下beego及beego相关插件安装 1.下载及配置go环境看见链接: http://golang.org/dl/ 网盘:链接: https://pan.baidu.com/s/1MveUM ...
- 如何将vim打造成Linux下的source insight
编写者:龙诗科 邮箱:longshike2010@163.com 2016-01-06 众所周知,windows下的source insight是阅读项目代码的神器,其神奇之处在于可以根据当前鼠标所指 ...
- Linux下用source insight的另一种方式--Samba
花了一些时间想找一个在Linux下的类似source insight的东东,网上有人推荐的source navigator,kscope之类,就那么几种颜色(也许没深入设置),也能叫语法高亮?至于其他 ...
- windows10下使用source insight出现"source insight program editor已停止工作"的问题
一.背景 1.1 OS 版本 windows 10 1.2 source insight版本 source insight 3.50.0034 二.解决方案 删除"我的文档"下面的source ins ...
- 用Zebra打造Linux下小型路由器
用Zebra打造Linux下小型路由器 现在的Internet网络相当庞大,不可能在不同的网络之间建立直接的连接,所以这时就必须用路由器为不同网络之间的通信提供路径选择.Linux下搭建路由器价格非常 ...
- vim插件安装总结
vim插件安装总结 vim 插件 vundle 插件对于vim来说是一个杀手级别的神器助手,能自动补全,语法高亮,文件搜索等等,有效地提升了编程效率.下面就个人的一些安装和使用进行一个总结. 自动管理 ...
- Linux下以tar包的形式安装mysql8.0.28
Linux下以tar包的形式安装mysql8.0.28 1.首先卸载自带的Mysql-libs(如果之前安装过mysql,要全都卸载掉) rpm -qa | grep -i -E mysql\|mar ...
- Linux下SVN服务器安装配置及客户端安装说明
原文地址:http://wenku.baidu.com/link?url=h3dVAMx4azpOXEND5HQEE6nliE8-zc0GSQ03yv4cUs1vXMALXF64UsK7kT7kXm_ ...
- linux下MySQL 5.6源码安装
linux下MySQL 5.6源码安装 1.下载:当前mysql版本到了5.6.20 http://dev.mysql.com/downloads/mysql 选择Source Code 2.必要软件 ...
随机推荐
- # 20155214 2016-2017-2 《Java程序设计》第9周学习总结
20155214 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC架构 JDBC全名Java DataBase Connectivity,是用于执行S ...
- python学习day24 项目目录结构
项目目录结构 脚本 插入模块:先插入内置模块,然后第三方某块,上短下长! 单可执行文件 config 配置相关 db (database) 数据相关 lib (librarie) 公共功能 src 业 ...
- 13.56Mhz SI522兼容MFRC522的资料以及对比性能
(13.56Mhz芯片) SI522是一颗专门替代MFRC522/FM17522,PIN对PIN 完全软硬件兼容.相对于MFRC522,SI522完全替换,不需要做任何更改,同时接受模式下功耗低10m ...
- PAT——1037. 在霍格沃茨找零钱
如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...
- Linux下Java性能监控
Linux下Java性能监控 一.JVM堆内存使用监控 获取thread dump的3种方法: 1)使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun. ...
- Selenium自动化测试之数据驱动及用例管理
Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:
- TS流基本概念
在MPEG-2标准中,有两种不同类型的码流输出到信道:一种是节目码流(Program Stream, PS),适用于没有误差产生的媒体存储,如DVD等存储介质:另一种是传送流(Transport st ...
- ASP.NET MVC & WebApi 中实现Cors来让Ajax可以跨域访问 (转载)
什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...
- 【JavaScript-基础-文件上传】
Upload 最原始方式 form表单提交 // html <form method="get" action="/test/upload"> &l ...
- #leetcode刷题之路30-串联所有单词的子串
给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置.注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考 ...