从Source Insight到Vim

从Source Insight到Vim 

ykrocku at gmail dot com

版权申明

  • 此文使用Google Docs编辑,原文地址以下:
  • 做者Blog:
发现错误,能够经过ykrocku at gmail dot com联系笔者,欢迎高手拍砖。
转载请务必在显眼的位置注明原文地址


这篇文章是什么

  • 此文记录了笔者折腾Vim的心得,但愿能为爱好Vim或者想摆脱SO的读者提供一些参考信息,坚决其迁移的信心。
  • 本文重在讨论Vim能实现那些Source Insight的功能,可是并无给出Vim配置细节。互联网上有不少写得很是好的文章帮助你们定制本身的Vim,笔者特别推荐easwy的《Vim使用进阶》系列。也正是他出色的文章让笔者步入了进阶阶段。


前言
php

Source Insight(如下简称SO)的确是一款优秀的代码查看和编辑软件,可是它也有不少缺点:
  • 收费软件,并且不便宜。最新的V3.5须要华丽丽的$239/user(带光盘得$255)。
  • 只能在Windows下使用,不支持其余操做系统。
  • 很容易对其产生很是强的依赖性,致使不使用该软件查阅编辑代码时会感到手足无措!
  • 笔者乃CLI控,并且还极度迷恋快捷键。
俗话说得好,不要绑死在一棵树上。笔者用了1年多SO后,下定决心寻找另一棵树。通过一番搜索和总结以后,选择了vim。


名词解释:

  • Symbol/Tag:二者都是对变量、函数的通称SO使用前者,Vim使用后者。SO在新建项目时会在项目文件中生成symbol的信息,而Vim则是使用的ctags生成的tag文件。
  • 缓存区(Buffer):Vim用来指读入到内存中的文件。
  • 窗口(Window):在SO中能够打开多个文件,而每一个文件在是一个窗口,可使用ALT+TAB切换,也能够用ALT+W n切换(n数字1-9,字幕a-z根据文件打开数目递增);Vim用窗口来呈现文件给用户,这个窗口的概念与GUI中窗口概念不彻底同样


SO经常使用功能以及在Vim中的支持:

  • 当前文件Symbol列表
在SO的左边有一个能显示当前文件中的symbol的窗口,能够鼠标点击其来快速在代码间跳转(可是好像不能用键盘聚焦到这个窗口)。 Vim则可使用taglist插件来实现此功能。taglist不但支持鼠标点击,还可使用键盘在tag间快速跳转。 不过相对于SO来讲,taglist没有显示结构体中的成员,也不显示#if/#else/#endif等宏定义block。 不过这样也让taglist显示的信息更简单明了。
taglist能够根据当前的symbol跳转,只须要在taglist中搜索,在按t/o/enter便可。
taglist能够同时显示多个文件的tag,可是速度会下降。

  • 快速预览窗口
SO的下方有一个预览窗口,显示主窗口光标下的Symbol。 Vim中也有提供预览窗口,CTRL-W }则实现和SO同样的功能 。能够将此快捷键映射成其余按键以减小输入。
若是想作到SO这样 随着光标移动而自动更新 也不难,能够参考Vim中文文档 windows.txt中的预览窗口一节 。或者也能够参考 笔者的vimrc 中的版本,对原始的进行了小修改,使其在有taglist窗口的时候也能工做。
  • 函数调用关系窗口
老实说,笔者不多用这个功能。在使用SO时,这个窗口一直都是被关闭的。这个窗口能显示函数的调用或被调用关系,可能在梳理代码调用关系时有必定做用。Vim自己没有这个功能,可是 cscope带有查看函数调用和被调用关系搜索(cs find c/d)。这个显示的结果只有一级,而不会显示递归调用
有一名为 CCTree 的插件能够提供相似于关系窗口的功能,因为它使用cscope的数据库,因此其准确与否彻底依赖于cscope的数据库的准确性
  • 自动补全
SO中自动补全的功能基本够用,不过当括号或者引号匹配出错时,可能会使补全工做不正常。Vim自带有的补全功能有:
CTRL+p 利用全部的Buffer中的字符串来提供补全列表,能够应付平常使用中大部分的补全需求。
全能(omni)补全 模式则适合代码补全,Vim自身带有的全能补全好像不能补全嵌套的结构体成员。笔者下载了 OmniCppComplete 插件,能够 完美的支持多级结构体 。不过习惯了图像界面菜单,可能会不适应Vim的补全菜单的操做方式(固然,你是能够本身定义快捷键)。
更多关于Vim补全的内容能够参考Vim文档 insert.txt中的自动补全章节
关于OmniCppComplete的配置, 能够参考easwy的文章
  • F7/F8---查看整个项目/当前文件的symbol
F8常被用来在当前的代码文件中跳转,F7常被用来根据symbol来打开相应的文件 。这两个功能均可以使用Vim的 tag/ptag命令来实现,且都有tab补全功能 。tag命令是在当前窗口中显示tag,而ptag则是在预览窗口中显示tag。
若是不习惯命令行方式,能够考虑安装 FuzzyFinder插件。此插件提供了模糊匹配tag的功能 ,不过不能限制其只在当前文件中匹配(能够考虑跳转到taglist窗口中搜索tag来模拟F8操做)。
  • CTRL+= 和 CTRL+鼠标左键--查看symbol定义
SO中使用CTRL+=和CTRL+鼠标左键单击symbol,就能够跳转到此symbol的定义处 ,这个功能经常使用来查看当前变量的真身。
Vim也支持tag的跳转:
可使用CTRL+]和CTRL+鼠标左键在当前窗口显示tag,也可使用CTRL+w }和CTRL+w ]新建[预览]窗口显示tag,C-T回到上一个tag 。注意:使用鼠标前,须要在 Vim中使用set mouse=a来启用鼠标
虽然SO能支持局部变量,可是因为 tag文件中没有局部变量信息,因此vim没法支持 。另外SO能根据变量类型来跳转,假设有以下代码:
FILE *file;
SO中能够点击file而直接跳转到FILE结构体定义,而Vim只会搜索能 匹配字符串 "file"的tag。纯字符串匹配获得的结果会特别多(参考笔者 这篇Linux流水帐 里的第2条)。固然若是要查看FILE结构体定义有个比较简单的窍门:命令模式输入
:FILE::,再使用tab键自动补全 下,再ENTER就能够跳转到定义FILE结构体的文件。
另外SO中,使用鼠标单击include的文件名,则会打开该文件,Vim也能 靠gf或者C-W f来实现
  • ALT+, ALT+. 上/下一个位置
SO中的这个功能很是好用,在代码间跳来跳去时,也能够随时跳回去。Vim中也不缺这个功能,能够 使用C-O/C-I来回到前/后一个点 。不过二者的 跳转方式有些差别 ,可能须要一点时间来适应。
另外 tag栈(C-]/C-T)也提供了一个函数间来回跳转的好方法
  • F9/F10--减小/增长缩进
编辑代码时Vim中使用回车或者是o/O命令添加一行时会自动缩进(须要开启cindent缩进模式)。调整代码时,也可使用 <</>>来缩进(推荐列可视模式下使用)。另外Vim中还有提供"="命令,功能更增强大,再结合indent的话,则可无往不利 。关于在Vim中访问外部程序的功能,能够参见帮助文档中的filter motion(:h filter),灵活使用此功能,定可事半功倍。
F9/F10的定制可参考 笔者的vimrc
  • F3/F4 --向上/下搜索
这个功能是编辑器必备之一,Vim中用/pattern搜索,而后使用 N/n查找上/下一处 。添加搜索当前光标下字符串的功能也很容易,能够参考 Vim在线wiki上的这篇文章
  • CTRL+H --替换
用惯了GUI的查找替换窗口,可能须要稍微学习一下Vim提供的命令模式。
:%s/teh/the/g     将全部的teh替换成the,这个直接所有替换,不确认。
:%s/teh/the/gc    将teh替换成the,并挨个确认。
平常编码中,绝大部分的替换工做均可以用这一句命令实现。若是想更深刻的了解Vim的替换功能,能够阅读相关文档。
  • ALT+W n--快速切换文件
弹出窗口菜单,再按数字就能够切换到对应打开的文件。
SO中同时编辑多个文件时,使用ALT+W n能够快速的在多个文件间切换。 Vim中则可使用ls/bn/bp/b等命令在打开的文件间切换 (注意:须要set hidden开启缓存区隐藏)。
ls能够显示全部缓存区,bp/bn跳转到上/下一个缓存区,b 3跳转到第3个缓冲区 。有这几个命令基本够用。
若是想更加直观的话,能够安装 bufexplorer插件,它能提供一个窗口显示全部可见的缓存区
  • 小键盘-/+  --上/下一个函数
SO中使用小键盘上的-/+能够在上下一个函数快速切换,也能够用来回到当前函数头(好比须要修改函数注释,则可使用该快捷键跳到函数头)。 Vim中可使用 [[ 和 ]]来实现相同的功能
  • CTRL+g --跳转到某一行
这个基本上是每一个编辑器必备的功能,Vim中天然是支持的。 Vim可使用100gg或者:100来跳转
  • Shift+F8 --高亮当前字符串
SO中可使用shift+F8高亮当前的字符串,笔者经常使用此特性来查看变量(通常是局部变量,能在一屏范围内显示完时最合适)在何处被引用或者修改。Vim中能够对搜索命令进行扩展便可实现 一个简单版本 。若是须要更为强大的版本,则能够考虑使用插件 Mark ,它能使用不一样颜色高亮多个字符串(SO中只有一个黄色)
  • CTRL+o --快速打开文件
SO将项目中全部的文件都显示在项目文件窗口中,输入部分文件名,能够快速的打开对应的文件。Vim最基本的打开文件方式是使用命令e+文件路径,这样子可能输入比较麻烦,并且还不够直观。Vim默认安装了一个颇有用的插件 netrw,它可让Vim成为一个文件管理器(执行e dirname),用户能够很直观的打开想要的文件
另外, 打开的Buffer(对应文件)也可使用Buffer Exploer插件 迅速定位。
  • CTRL+/ --搜索Symbol在项目中全部被引用的位置
这个是一个很重要的功能,笔者常常用它查看全局变量在那些地方被访问、修改,函数在那些地方被调用……Vim中可使用 自带的vimgrep或者调用外部的grep命令来搜索文件 。不过 这二者都不使用索引文件,若是文件不少,则速度会很慢。比较好的方法是使用cscope ,它相似于ctag,不过它生成的数据库包含更多的信息。能够用它来搜索Symbol的引用,搜索函数的调用关系(CCTree插件就是基于此功能)……
更加详解的介绍能够参考 easwy的文章
  • 工程管理和会话保存
工程功能会保存上次软件退出时的信息信息,下次打开时,能回复到上次退出的状态,该功能在项目开发中很是有用。Vim有两个相关的概念 session和viminfo ,能够用来实现相似功能。
笔者写了一个 简陋的脚本 来自动生成ctag/cscope之类的文件,加上vimrc的设置,也算是能够省心一点。
  • CTRL-M --书签功能
笔者不多使用该功能,感受这个功能比较鸡肋。

总结:

笔者2010年6月份开始全面转向Vim,到今天已经有半年,期间基本没有再使用SO。期间笔者最大的感觉就是:
    • 多练习,孰能生巧
    • Vim自带的帮助是最好最好最好的帮助
    • Vim的学习曲线着实是很是很是很是的陡峭
SO和Vim各自阐释了Windows和Unix哲学:Windows是All In One,而Unix则遵循KISS。SO只要安装好,立刻就可使用,它能提供一站式的解决方案;而 Vim则须要配置好vimrc、其余插件、ctags、cscopes、自定义快捷键
总的来讲,SO容易上手,学习曲线较为平缓,而 Vim则扩展性好,能够配置性高

参考:

  • Source Insight主页:
http://www.sourceinsight.com
  • Vim主页:
http://www.vim.org/index.php
http://docs.google.com/View?id=dgwthwsv_45gnbj8dft
  • Vim在线正文手册:
  • ctags主页:
  • taglist插件
  • Fuzzyfinder插件
http://www.vim.org/scripts/script.php?script_id=1984
相关文章
相关标签/搜索