从Source Insight到Vim

从Source Insight到Vim 

ykrocku at gmail dot com

版权申明

  • 此文使用Google Docs编辑,原文地址如下:
https://docs.google.com/View?id=dgwthwsv_44f5z8pj3c
  • 作者Blog:
http://hi.baidu.com/yk103/blog
发现错误,可以通过ykrocku at gmail dot com联系笔者,欢迎高手拍砖。
转载请务必在显眼的位置注明原文地址


这篇文章是什么

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


前言

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
  • Easwy《Vim使用进阶》:
    http://easwy.com/blog/archives/advanced-vim-skills-catalog/

  • 笔者根据自己的需求定制的vimrc
http://docs.google.com/View?id=dgwthwsv_45gnbj8dft
  • Vim在线正文手册:
http://vimcdoc.sourceforge.net/doc/help.html
  • ctags主页:
http://ctags.sourceforge.net/
  • taglist插件
http://www.vim.org/scripts/script.php?script_id=273
  • Fuzzyfinder插件
http://www.vim.org/scripts/script.php?script_id=1984

你可能感兴趣的:(从Source Insight到Vim)