VIM使用(二) 浏览内核源代码
为了实现类似SourceInsight功能,通过VIM+Ctags+Cscope+Taglist+Source Explore +NERD Tree实现.
一, 安装插件
1)安装Ctags 和Cscope
Ubuntu下可以直接通过命令安装:
sudo apt-get install ctags cscope
注:cscope与ctags功能类似,但能补充Ctags的不足,二者结合便能兼具ctags的便利,双能用cscope补充ctags的局限,算得上是Linux内核代码分析的强大工具.
2)安装taglist :
通过向.vimrc中添加:
Bundle 'taglist.vim'
Bundle "scrooloose/nerdtree"
Bundle "wesleyche/SrcExpl"
Bundle "majutsushi/tagbar"
再执行:BundleInstall命令即可自动安装.
3)
二,配置和使用插件
在Linux内核已经自带ctags和cscope的标签数据库的生成脚本,在内核源代码目录下通过命令可生成相应的数据库文件:
make ctags
make cscope
注:前者,生成一个92M的tags文件,后者会生成cscope.files(分析文件的目录)和其它文件数据库.
配置ctags和cscope的数据库与VIM联动:
""" ctags database path """""""
set tags=/home/magc/workspace/linux-2.6.32.67/tags """ cscope database path """""""
set csprg=/usr/bin/cscope "whereis cscope
set csto= "cscope DB search first
set cst "cscope db tag DB search
set nocsverb "verbose off
"cs db path
cs add /home/magc/workspace/linux-2.6.32.67/cscope.out
set csverb "verbos off
taglist插件配置:
""""""""tag list setting """"""""
filetype on
nmap <F7> :TlistToggle<CR> "F7 Key = Tag list Toggling
let Tlist_Ctags_Cmd = "/usr/bin/ctags" " whereis ctags
let Tlist_Inc_WinWidth = "window width change off"
let Tlist_Exit_OnlyWindow =
let Tlist_Auto_Open = "VIM打开时
let Tlist_Use_Right_Window =
Source Explorer 插件配置:
""""""" Source Explorer Setting """""" nmap <F4> :SrcExplToggle<CR>
"control+h进入左边的窗口
nmap <C-H> <C-W>h
"control+j进入下边的窗口
nmap <C-J> <C-W>j
"control+k进入上边的窗口
nmap <C-K> <C-W>k
"control+l进入右边的窗口
nmap <C-L> <C-W>l let g:Srcexpl_winHeight = " // Set 100 ms for refreshing the Source Explorer let g:SrcExpl_refreshTime = " // Set "Enter" key to jump into the exact definition context let g:SrcExpl_jumpKey = "<ENTER>" " // Set "Space" key for back the definition context let g:SrcExpl_gobackKey = "<SPACE>"
let g:SrcExpl_isUpdateTags =
NERD Tree插件配置:
""""" NERD Tree Setting """"""""" let NERDTreeWinPos="left" nnoremap <F2> :NERDTreeToggle<CR>
注:上面设置中包含的快捷键有:
- F7打开Taglist
- F4打开Source Explorer
- F2打开Nerd Tree
- control+h进入左边的窗口
- control+k进入上边的窗口
- control+j进入下边的窗口
- control+l进入右边的窗口

三,代码浏览方法
类似SourceInsight的用法,只不过这里有些窗口需要手动打开,通过F2,F4,F7打开如上图的,先在左侧的NERD文件树中找到你要查看的文件,中间大窗口是源码窗口,当光标在某变量或函数名上时,下面就会显示它的定义,右侧是当前文件的标签(变量,函数名等)
注:这里标签的来源是cscope和ctags两个数据库,有关Cscope的详细命令使用方法可参考:http://blog.csdn.net/dengxiayehu/article/details/6330200

有关Cscope在大工程中的使用要参考:Using Cscope on large projects (example: the Linux kernel)
附加1 Cscope搜索跳转技巧:(参考:http://blog.chinaunix.net/uid-24774106-id-3556337.html)
nmap <leader>sa :cs add cscope.out<cr>
nmap <leader>ss :cs find s <C-R>=expand("")<cr><cr>
nmap <leader>sg :cs find g <C-R>=expand("")<cr><cr>
nmap <leader>sc :cs find c <C-R>=expand("")<cr><cr>
nmap <leader>st :cs find t <C-R>=expand("")<cr><cr>
nmap <leader>se :cs find e <C-R>=expand("")<cr><cr>
nmap <leader>sf :cs find f <C-R>=expand("")<cr><cr>
nmap <leader>si :cs find i <C-R>=expand("")<cr><cr>
nmap <leader>sd :cs find d <C-R>=expand("")<cr><cr>
=expand("cword")总体是为了得到:光标下的变量或函数。cword 表示:cursor word, 类似的还有:cfile表示光标所在处的文件名。
这个键在我的vim中对应的是逗号, 所以,上面的意思就 只要光标在我们关心的变量或者函数下,命令行模式敲,sc就相当与执行:cs find c 光标处函数名,注意,只需,sc三个键,不要敲冒号: 其他的键的映射也是类似的。
有网友bottles在我的博文vim格式化C代码中问到:
- 这个插件在不同文件当中都能跳转到定义吗?还有某些文件我想直接输入文件名不输入路径就open这个文件,这个功能用您说的插件能实现吗?我之前就是因为不能跳转到定义才用source insight里去的。
对于这个问题,答案是肯定的,我们只需要执行:cs find f filename,就可以跳转到名字为filename的文件中去,注意不需要是全路径名。比如我可以从/usr/local/src/pgsrc/postgresql-9.2.3/src/backend/storage/file/fd.c文件中,在命令行模式下敲
- :cs find f bgwriter.c
就会跳转到/usr/local/src/pgsrc/postgresql-9.2.3/src/backend/postmaster/bgwriter.c。尽管他们不在同一路径下。
对于头文件的跳转,比如fd.c中有如下头文件:
- #include "miscadmin.h"
我们只要将光标置于miscadmin.h处,执行快捷键,sf三个键,就能跳转到miscadmin.h头文件处。只需要三个键,跳转的特别快。
我的博文vim格式化C代码中,当时没有考虑到makefile,因为makefile的tab键不能展开为4个空格,这次一并在博文中修复了,对makefile做了特殊处理。
VIM使用(二) 浏览内核源代码的更多相关文章
- 如何切入 Linux 内核源代码
Makefile不是Make Love 从前在学校,混了四年,没有学到任何东西,每天就是逃课,上网,玩游戏,睡觉.毕业的时候,人家跟我说Makefile我完全不知,但是一说Make Love我就来劲了 ...
- 编译Android4.3内核源代码
--------------------------------------------------------------------------------------------------- ...
- 在windows下解压缩Linux内核源代码出现重复文件原因
在windows下解压缩Linux内核源代码出现重复文件原因 2009年06月30日 13:35 来源:ChinaUnix博客 作者:embededgood 编辑:周荣茂 原因一.因为在Lin ...
- 在Ubuntu上下载、编译和安装Android最新内核源代码(Linux Kernel)
文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6564592 在前一篇文章提到,从源代码树下载下 ...
- Linux内核源代码
说明:只供学习交流 一,目录结构 Linux内核源代码采用树形结构进行组织,非常合理地把功能相关的文件都放在同一个子目录下,使得程序更具有可读性. 二,目录结构 arch目录 arch是archite ...
- Linux内核源代码获取教程
Linux内核源代码获取方法 什么叫Linux 什么叫Linux内核 Linux内核源代码的获取 什么叫Linux? Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UN ...
- [转]ubuntu(12.04)下, 命令 ,内核 源代码的获取
[转]ubuntu(12.04)下, 命令 ,内核 源代码的获取 http://blog.chinaunix.net/uid-18905703-id-3446099.html 1.命令:例如:要查看l ...
- Linux内核源代码情景分析系列
http://blog.sina.com.cn/s/blog_6b94d5680101vfqv.html Linux内核源代码情景分析---第五章 文件系统 5.1 概述 构成一个操作系统最重要的就 ...
- Linux内核源代码解析——TCP状态转移图以及其实现
本文原创为freas_1990,转载请标明出处http://blog.csdn.net/freas_1990/article/details/10223581 TCP状态转移的原理并不高深,但是处理逻 ...
随机推荐
- C语言学习笔记(一)_hello world程序中涉及的c语言元素
#include <stdio.h> //使用printf函数之前必须include<stdio.h> int main() { int i; //声明一个变量 printf( ...
- php 快速排序
快速排序是以其中一个数为比较标准,其他比较的数分块处理,应用递归按相同想法处理数据 比如:4 3 6 2 1 7 8 以4为比较对象 排序为 3 2 1 6 7 8 左边为 3 2 1 右边 为 6 ...
- 网络TCp数据的传输设计(黏包处理)
//1.该片为引用别人的文章:http://www.cnblogs.com/alon/archive/2009/04/16/1437599.html 解决TCP网络传输"粘包"问题 ...
- logback 常用配置详解(二) <appender>
logback 常用配置详解(二) <appender> <appender>: <appender>是<configuration>的子节点,是负责写 ...
- 自适应UITableView的Cell高度问题
1.自己计算Cell的高度返回: 1>model中计算: // // InfoModel.h // OCDemo // // Created by 思 彭 on 16/12/27. // Cop ...
- Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 64 bytes) in D
Fatal error: Allowed memory size of 524288000 bytes exhausted (tried to allocate 64 bytes) in D 从数据库 ...
- (转载)自动化基础普及之selenium是啥?
转载:http://www.cnblogs.com/fnng/p/3980093.html Selenium 并不像QTP那样让人一下子就明白是什么?它是编程人员的最爱,但它却对测试新手产生了很大的阻 ...
- django单元测试
django 单元测试小结 django 测试 从前很少写单元测试了,特别是web应用.最近不知不觉喜欢起来这个事情了,发现单元测试对于软件的模块,正交性有很大促进作用,因为函数,模块写的不合 ...
- js-url打开方式
引用自 : 老张的博客 *.location.href 用法: top.location.href="url" 在顶层页面打开url(跳出框架) self.loc ...
- display:table-cell介绍
一.display:table-cell属性简述 display:table-cell属性指让标签元素以表格单元格的形式呈现,类似于td标签.目前IE8+以及其他现代浏览器都是支持此属性的,但是IE6 ...