Source Insight for Linux

windows下的source insight, Mac下的sublime以及linux下的vim,在我个人看来是最优秀的源码阅读环境。简洁与效率,我想对于开发者来说,绝对是件好事。

本文旨在将linux下的vim打造成windows下的source insight,甚至让开发者比在source insight下阅读源码更加有欲望。 个人现在基本上只用linux和mac系统, 一些必须用到windows的功能也可以通过虚拟机来完成。 至于Mac下sublime该如何配置,可以参考写的下一篇文章。

函数、变量的定义以及函数在哪里被调用应该是阅读源码最关心的事情。首先,放一张图,如果你对图上的这种环境还感兴趣,可以继续阅读,不然,就跳过吧。

vimtest

ctags
干嘛用的? 下面会用到。首先确保系统已经安装ctags, 以ubuntu系统为例

apt-get install ctags

taglist
干什么?taglist插件是基于ctags的,需要用到ctags来生成tags文件,其效果实现的就是上图左上角窗口的功能,可以列出项目中的某文件中的函数以及变量。

怎么用? 可以在此处下载taglist.vim插件,将其解压后的./plugin/taglist.vim拷贝到/usr/share/vim/vim73/plugin目录下,此处的/usr/share/vim/vim73是你系统上相应vim所在的路径。下文还要用到的SrcExpl,Trinity插件配置的方式类似。

SrcExpl
干什么?实现的是上图中最下方窗口的功能,显示函数或者变量的定义,可以把光标移到最下方窗口跳转到相应的定义处。

怎么用? 在此处下载SrcExp.viml插件,将其解压后的./plugin/srcexpl.vim拷贝至上述vim所在的路径的plugin文件夹中。

Trinity
干什么?里面有两个插件NERD_tree.vim以及NERD_tree.vim。 NERD_tshang’wshangweree实现上图右上角功能,显示项目的文件树。trinity.vim用来管理taglist.vim,SrcEcpl.vim,NERD_tree.vim此三个插件,控制其快速开关。

怎么用?在此处下载,将其解压后的NERD_tree.vim,NERD_tree.vim拷贝至上述vim所在的路径的plugin文件夹中。

上述利器弄好了之后,再稍作配置就可以实现函数、变量定义的跳转功能了,效果图和上图一模一样。

配置
修改/etc/vim/vimrc 文件,在末尾添加以下内容:

" Open and close all the three plugins on the same time 
nmap <F8>   :TrinityToggleAll<CR> 

" Open and close the srcexpl.vim separately 
nmap <F9>   :TrinityToggleSourceExplorer<CR> 

" Open and close the taglist.vim separately 
nmap <F10>  :TrinityToggleTagList<CR> 

" Open and close the NERD_tree.vim separately 
nmap <F11>  :TrinityToggleNERDTree<CR> 

 set mouse=a

配置中的功能键是打开相应插件功能的快捷键,如,按F9就可以直接打开SrcExpl插件,实现最下方窗口个效果,set mouse =a,是以便用鼠标点击能相应窗口处,当然没有鼠标,双击触屏一样的效果,按空格键便可以返回之前位置。也可以查看SrcExpl作者的github了解更多内容。

配置了这些还不够,因为最基础的ctags还没有配置。
在你的项目文件夹中运行 ctags -R 会以递归的查找方式,在根目录下生成相应的tags文件,其中存放了各函数、变量的定义tags用来跳转。

当然基于上述的插件,只要将光标移到函数、变量处,最下方便会显示其定义,跟source insight效果一样。如果不想用到这些插件,使光标在函数、变量处,Ctrl + ]键也可以实现跳转,Ctrl+t用来返回之前位置。

好了,除了找到函数、变量的定义,还有一个重要的功能就是要找到函数的调用者,这时候cscope就要排上用场了,尽管cscope的功能可不仅仅能跳转到函数调用者上。

cscope

apt-get install cscope

在项目根目录下执行: cscope -Rbq, 在目录下生成了cscope.out,cscope.in.out,cscope.po.out文件
其中

-R :递归处理子层目录
-b :生成数据库后自动退出
-q :生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度

用vim打开源文件,输入 :cs add cscope.out,将数据库添加到源文件中,之后只要在源文件中输入::cs find type yourfunction/yourvariable,就可以实现cscope的所有功能了。
其中的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的文件

比如要找出函数调用关系,只要输入:cs find c yourfunction.

为了每次打开源文件时能自动将cscope.out文件自动加载,可以修改/etc/vim/vimrc文件

if has("cscope")
   set csprg=/usr/local/bin/cscope
   set csto=0
   set cst
   set csverb
 if filereadable("cscope.out")
    cs add cscope.out
 elseif $CSCOPE_DB != ""
    cs add $CSCOPE_DB
 endif
  set csverb
endif

一个linux系统下完整的source insight环境就这样组装好了。

完。

Ackonwledgement

本文遵守Attribution-NonCommercial-NoDerivatives 4.0 International License (CC BY-NC-ND 4.0)

仅为学习使用,未经博主同意,请勿转载

本文地址: http://www.chongh.wiki/blog/2016/05/25/sourceinsight-linux/

作者 新浪微博:@diting0x