• 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=0            "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 = 0        "window width change off"
    let Tlist_Exit_OnlyWindow = 0        
    let Tlist_Auto_Open = 0            "VIM打开时
    let Tlist_Use_Right_Window = 1

    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 = 8
    
    " // Set 100 ms for refreshing the Source Explorer 
    
    let g:SrcExpl_refreshTime = 100
    
    " // 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 = 0

    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)

    我们还有一个问题是敲 :cs find c closeAllVfds这太不人性了,函数名很长的情况下,要人命。快捷键映射就很重要了。看下我的.vimrc里面的快捷键映射。(关心.vimrc的筒子可以CU的草根老师博客下载那个vimrc的安装包,文章路径在此:配置自己的vim
    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>
        nmap表示在vim的普通模式下映射,当然相对与编辑模式和可视模式而言的,我们不多说。
        =expand("cword")总体是为了得到:光标下的变量或函数。cword 表示:cursor word, 类似的还有:cfile表示光标所在处的文件名。
       这个键在我的vim中对应的是逗号, 所以,上面的意思就 只要光标在我们关心的变量或者函数下,命令行模式敲,sc就相当与执行:cs find c 光标处函数名,注意,只需,sc三个键,不要敲冒号: 其他的键的映射也是类似的。    
        有了这个快捷键,我们使用cscope的效率就提升了,加上ctrl+],ctrl+o,ctrl+t 我们看项目代码基本就比较舒服了。
        有网友bottles在我的博文vim格式化C代码中问到:
    1. 这个插件在不同文件当中都能跳转到定义吗?还有某些文件我想直接输入文件名不输入路径就open这个文件,这个功能用您说的插件能实现吗?我之前就是因为不能跳转到定义才用source insight里去的。
        对于这个问题,答案是肯定的,我们只需要执行:cs find f filename,就可以跳转到名字为filename的文件中去,注意不需要是全路径名。比如我可以从/usr/local/src/pgsrc/postgresql-9.2.3/src/backend/storage/file/fd.c文件中,在命令行模式下敲
    1. :cs find f bgwriter.c
    就会跳转到/usr/local/src/pgsrc/postgresql-9.2.3/src/backend/postmaster/bgwriter.c。尽管他们不在同一路径下。

        对于头文件的跳转,比如fd.c中有如下头文件:
    1. #include "miscadmin.h"
    我们只要将光标置于miscadmin.h处,执行快捷键,sf三个键,就能跳转到miscadmin.h头文件处。只需要三个键,跳转的特别快。
       我的博文vim格式化C代码中,当时没有考虑到makefile,因为makefile的tab键不能展开为4个空格,这次一并在博文中修复了,对makefile做了特殊处理。
       
  • 相关阅读:
    js实现将字符串里包含手机号的中间四位替换为****
    草稿for套for
    js实现将时间戳转换成2017-05-06 09:03:02
    时间日期校验接口
    JS延迟导航nav
    nav导航
    鼠标滚动请求加载
    常用开源Jabber(XMPP) IM服务器介绍(转)
    01.base-v1.js
    Haproxy安装及配置(转)
  • 原文地址:https://www.cnblogs.com/linux-sir/p/4675919.html
Copyright © 2020-2023  润新知