转载请务必在显眼的位置注明原文地址
前言php
Source Insight(如下简称SO)的确是一款优秀的代码查看和编辑软件,可是它也有不少缺点:
俗话说得好,不要绑死在一棵树上。笔者用了1年多SO后,下定决心寻找另一棵树。通过一番搜索和总结以后,选择了vim。
在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中的自动补全章节
F8常被用来在当前的代码文件中跳转,F7常被用来根据symbol来打开相应的文件 。这两个功能均可以使用Vim的 tag/ptag命令来实现,且都有tab补全功能 。tag命令是在当前窗口中显示tag,而ptag则是在预览窗口中显示tag。若是不习惯命令行方式,能够考虑安装 FuzzyFinder插件。此插件提供了模糊匹配tag的功能 ,不过不能限制其只在当前文件中匹配(能够考虑跳转到taglist窗口中搜索tag来模拟F8操做)。
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来实现 。
SO中的这个功能很是好用,在代码间跳来跳去时,也能够随时跳回去。Vim中也不缺这个功能,能够 使用C-O/C-I来回到前/后一个点 。不过二者的 跳转方式有些差别 ,可能须要一点时间来适应。
另外 tag栈(C-]/C-T)也提供了一个函数间来回跳转的好方法 。
编辑代码时Vim中使用回车或者是o/O命令添加一行时会自动缩进(须要开启cindent缩进模式)。调整代码时,也可使用 <</>>来缩进(推荐列可视模式下使用)。另外Vim中还有提供"="命令,功能更增强大,再结合indent的话,则可无往不利 。关于在Vim中访问外部程序的功能,能够参见帮助文档中的filter motion(:h filter),灵活使用此功能,定可事半功倍。
用惯了GUI的查找替换窗口,可能须要稍微学习一下Vim提供的命令模式。:%s/teh/the/g 将全部的teh替换成the,这个直接所有替换,不确认。:%s/teh/the/gc 将teh替换成the,并挨个确认。平常编码中,绝大部分的替换工做均可以用这一句命令实现。若是想更深刻的了解Vim的替换功能,能够阅读相关文档。
弹出窗口菜单,再按数字就能够切换到对应打开的文件。SO中同时编辑多个文件时,使用ALT+W n能够快速的在多个文件间切换。 Vim中则可使用ls/bn/bp/b等命令在打开的文件间切换 (注意:须要set hidden开启缓存区隐藏)。ls能够显示全部缓存区,bp/bn跳转到上/下一个缓存区,b 3跳转到第3个缓冲区 。有这几个命令基本够用。若是想更加直观的话,能够安装 bufexplorer插件,它能提供一个窗口显示全部可见的缓存区 。
SO中使用小键盘上的-/+能够在上下一个函数快速切换,也能够用来回到当前函数头(好比须要修改函数注释,则可使用该快捷键跳到函数头)。 Vim中可使用 [[ 和 ]]来实现相同的功能
这个基本上是每一个编辑器必备的功能,Vim中天然是支持的。 Vim可使用100gg或者:100来跳转 。
SO中可使用shift+F8高亮当前的字符串,笔者经常使用此特性来查看变量(通常是局部变量,能在一屏范围内显示完时最合适)在何处被引用或者修改。Vim中能够对搜索命令进行扩展便可实现 一个简单版本 。若是须要更为强大的版本,则能够考虑使用插件 Mark ,它能使用不一样颜色高亮多个字符串(SO中只有一个黄色) 。
SO将项目中全部的文件都显示在项目文件窗口中,输入部分文件名,能够快速的打开对应的文件。Vim最基本的打开文件方式是使用命令e+文件路径,这样子可能输入比较麻烦,并且还不够直观。Vim默认安装了一个颇有用的插件 netrw,它可让Vim成为一个文件管理器(执行e dirname),用户能够很直观的打开想要的文件 。另外, 打开的Buffer(对应文件)也可使用Buffer Exploer插件 迅速定位。
这个是一个很重要的功能,笔者常常用它查看全局变量在那些地方被访问、修改,函数在那些地方被调用……Vim中可使用 自带的vimgrep或者调用外部的grep命令来搜索文件 。不过 这二者都不使用索引文件,若是文件不少,则速度会很慢。比较好的方法是使用cscope ,它相似于ctag,不过它生成的数据库包含更多的信息。能够用它来搜索Symbol的引用,搜索函数的调用关系(CCTree插件就是基于此功能)……
工程功能会保存上次软件退出时的信息信息,下次打开时,能回复到上次退出的状态,该功能在项目开发中很是有用。Vim有两个相关的概念 session和viminfo ,能够用来实现相似功能。
笔者不多使用该功能,感受这个功能比较鸡肋。
笔者2010年6月份开始全面转向Vim,到今天已经有半年,期间基本没有再使用SO。期间笔者最大的感觉就是:
SO和Vim各自阐释了Windows和Unix哲学:Windows是All In One,而Unix则遵循KISS。SO只要安装好,立刻就可使用,它能提供一站式的解决方案;而 Vim则须要配置好vimrc、其余插件、ctags、cscopes、自定义快捷键 。总的来讲,SO容易上手,学习曲线较为平缓,而 Vim则扩展性好,能够配置性高 。
http://www.sourceinsight.com
http://www.vim.org/index.php
http://docs.google.com/View?id=dgwthwsv_45gnbj8dft
http://www.vim.org/scripts/script.php?script_id=1984