source insight是windows下的优秀编辑器,适合阅读管理代码,主要有以下功能:

  1. 查找函数,变量或者宏的定义。

  2. 查找函数,变量或者宏的引用位置。

  3. 查找函数被调用的位置

  4. 查找某个符号在工程内的所有匹配

由于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插件安装使用总结的更多相关文章

  1. Linux下beego及beego相关插件安装

    Linux下beego及beego相关插件安装 1.下载及配置go环境看见链接: http://golang.org/dl/ 网盘:链接: https://pan.baidu.com/s/1MveUM ...

  2. 如何将vim打造成Linux下的source insight

    编写者:龙诗科 邮箱:longshike2010@163.com 2016-01-06 众所周知,windows下的source insight是阅读项目代码的神器,其神奇之处在于可以根据当前鼠标所指 ...

  3. Linux下用source insight的另一种方式--Samba

    花了一些时间想找一个在Linux下的类似source insight的东东,网上有人推荐的source navigator,kscope之类,就那么几种颜色(也许没深入设置),也能叫语法高亮?至于其他 ...

  4. windows10下使用source insight出现"source insight program editor已停止工作"的问题

    一.背景 1.1 OS 版本 windows 10 1.2 source insight版本 source insight 3.50.0034 二.解决方案 删除"我的文档"下面的source ins ...

  5. 用Zebra打造Linux下小型路由器

    用Zebra打造Linux下小型路由器 现在的Internet网络相当庞大,不可能在不同的网络之间建立直接的连接,所以这时就必须用路由器为不同网络之间的通信提供路径选择.Linux下搭建路由器价格非常 ...

  6. vim插件安装总结

    vim插件安装总结 vim 插件 vundle 插件对于vim来说是一个杀手级别的神器助手,能自动补全,语法高亮,文件搜索等等,有效地提升了编程效率.下面就个人的一些安装和使用进行一个总结. 自动管理 ...

  7. Linux下以tar包的形式安装mysql8.0.28

    Linux下以tar包的形式安装mysql8.0.28 1.首先卸载自带的Mysql-libs(如果之前安装过mysql,要全都卸载掉) rpm -qa | grep -i -E mysql\|mar ...

  8. Linux下SVN服务器安装配置及客户端安装说明

    原文地址:http://wenku.baidu.com/link?url=h3dVAMx4azpOXEND5HQEE6nliE8-zc0GSQ03yv4cUs1vXMALXF64UsK7kT7kXm_ ...

  9. linux下MySQL 5.6源码安装

    linux下MySQL 5.6源码安装 1.下载:当前mysql版本到了5.6.20 http://dev.mysql.com/downloads/mysql 选择Source Code 2.必要软件 ...

随机推荐

  1. # 20155214 2016-2017-2 《Java程序设计》第9周学习总结

    20155214 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 JDBC架构 JDBC全名Java DataBase Connectivity,是用于执行S ...

  2. python学习day24 项目目录结构

    项目目录结构 脚本 插入模块:先插入内置模块,然后第三方某块,上短下长! 单可执行文件 config 配置相关 db (database) 数据相关 lib (librarie) 公共功能 src 业 ...

  3. 13.56Mhz SI522兼容MFRC522的资料以及对比性能

    (13.56Mhz芯片) SI522是一颗专门替代MFRC522/FM17522,PIN对PIN 完全软硬件兼容.相对于MFRC522,SI522完全替换,不需要做任何更改,同时接受模式下功耗低10m ...

  4. PAT——1037. 在霍格沃茨找零钱

    如果你是哈利·波特迷,你会知道魔法世界有它自己的货币系统 —— 就如海格告诉哈利的:“十七个银西可(Sickle)兑一个加隆(Galleon),二十九个纳特(Knut)兑一个西可,很容易.”现在,给定 ...

  5. Linux下Java性能监控

    Linux下Java性能监控 一.JVM堆内存使用监控 获取thread dump的3种方法: 1)使用$JAVA_HOME/bin/jcosole中的MBean,到MBean>com.sun. ...

  6. Selenium自动化测试之数据驱动及用例管理

    Selenium自动化测试之数据驱动及用例管理 一.TestNg注解介绍 @Test:表示一个测试方法,在运行测试用例过程中,会自动运行@Test注解的方法. 例:

  7. TS流基本概念

    在MPEG-2标准中,有两种不同类型的码流输出到信道:一种是节目码流(Program Stream, PS),适用于没有误差产生的媒体存储,如DVD等存储介质:另一种是传送流(Transport st ...

  8. ASP.NET MVC & WebApi 中实现Cors来让Ajax可以跨域访问 (转载)

    什么是Cors? CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sharing).它允许浏览器向跨源服务器,发出XMLHttpReq ...

  9. 【JavaScript-基础-文件上传】

    Upload 最原始方式 form表单提交 // html <form method="get" action="/test/upload"> &l ...

  10. #leetcode刷题之路30-串联所有单词的子串

    给定一个字符串 s 和一些长度相同的单词 words.找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置.注意子串要与 words 中的单词完全匹配,中间不能有其他字符,但不需要考 ...