从Source Insight到Vim

ykrocku at gmail dot com

版权申明

此文使用Google Docs编辑,原文地址如下:
https://docs.google.com/View?id=dgwthwsv_44f5z8pj3c
作者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

转载于:https://my.oschina.net/alphajay/blog/58116

从Source Insight到Vim相关推荐

  1. source insight和vim同时使用

    https://blog.csdn.net/wangn222/article/details/72721993 1.Source Insight中,Options->Custom Command ...

  2. 用vim替代source insight

    在浏览和修改稍微复杂的程序时候,确实source insight是个非常好的工具.转到Linux以后,我一直在找替代工具.最先是等anjuta,结果苦苦等到了一个鸡肋的2.02.然后,认真配置了下wi ...

  3. Source Insight 经典教程

    Source Insight实质上是一个支持多种开发语言(java,c ,c 等等)的编辑器,只不过由于其查找.定位.彩色显示等功能的强大,常被我们当成源代码阅读工具使用. 作为一个开放源代码的操作系 ...

  4. Source Insight技巧收集

    Source Insight技巧收集 1.背景色选择     要改变背景色Options->preference->windows background->color设置背景色 2. ...

  5. 介绍linux下Source Insight强大代码编辑器sublime_text_3

    Centos6.4下安装Sublime Text 3 背景 1 一. 运行环境 1 二.安装环境配置 1 三.创建快捷方式 1 四.配置全局环境 2 五.操作界面 3 背景 在windows操作系统系 ...

  6. source insight快捷键及使用技巧

    2019独角兽企业重金招聘Python工程师标准>>> 原文转自http://lucjn.blog.163.com/blog/static/925911520091116843548 ...

  7. Source Insight 4.0常用设置

    本文以Source Insight 4.00.0086版本为例讲解常用设置. 1.Source Insight简介 Source Insight是一个面向软件开发的代码编辑器和浏览器,它拥有内置的对C ...

  8. source insight 4.0的基本使用方法

    一.项目管理 1.新建一个项目 快捷键Alt+Shift+N可以打开新建项目对话框,然后根据提示填好项目存储位置,源文件位置等,然后会出现添加删除项目文件对话框,选中自己想要编辑和浏览的文件添加即可, ...

  9. Source Insight学习教程

    Source Insight实质上是一个支持多种开发语言(java,c ,c 等等)的编辑器,只不过由于其查找.定位.彩色显示等功能的强大,常被我们当成源代码阅读工具使用. 作为一个开放源代码的操作系 ...

  10. 如何在ubuntu下安装source insight

    最近在学习uboot,大家都知道的,uboot工程下目录多文件多,源码阅读起来非常麻烦,想要用vim去查阅里面的代码,几乎是一件不可能的事情.百度了一下linux下的源码阅读工具,百家纷纭,各有说法, ...

最新文章

  1. 记一次数据库崩溃的恢复
  2. jdbc mysql 函数 慢_java jdbc addBatch()提交mysql速度过慢
  3. Mat 显示到MFC中Pictrue Control的问题
  4. 20个最强的基于浏览器的在线代码编辑器 - OPEN资讯
  5. fork linux 低权限,linux/Unix下python的fork详解及应用举例
  6. 基于PCL的ICP及其变种算法实现
  7. 小米max2 android p,这就是小米Max2?6.4英寸超大屏幕配置大升级
  8. matplotlib散点图笔记
  9. 人工智能人才缺口巨大,是否要从大学生抓起?
  10. 虚拟键码对照表与ASCII对照表的整理
  11. java_day01
  12. C语言编程题:完美的素数
  13. dlibdotnet 人脸相似度源代码_HAAR与DLib的实时人脸检测之实现与对比
  14. 银河麒麟桌面操作系统V10node.js 14安装小助手
  15. MySQL联合索引以及索引顺序优化
  16. CC2530 + RFX2401C Zigbee模块
  17. 今日芯声 | 微软 Xbox 老大:关闭游戏直播平台 Mixer,我没有遗憾
  18. 笔记本电脑周边双屏显示方案
  19. s7400plc运行时关闭服务器,S7-400PLC频繁死机
  20. ubuntu20.04 java 开发环境搭建及 JNI 使用

热门文章

  1. 活动目录实战之六 使用ADMT 3.2迁移用户和计算机
  2. 域用户权限|连接DC终端服务
  3. 转:浅析 Java Thread.join()
  4. did you register the component correctly? For recursive components, make sure to provide the name
  5. 对于JavaScript产生闭包的个人理解
  6. [C# 网络编程系列]:TCP编程
  7. MySQL引擎innodb和mysum_mysql数据库引擎 MyISAM和 InnoDB区别
  8. win10系统下Consul持久化
  9. linux中 」 、」」 的用法
  10. 转载:相同版本的JVM和Java应用,在 x86 和AArch64 平台性能相差30%