zoukankan      html  css  js  c++  java
  • 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做了特殊处理。
       
  • 相关阅读:
    oracle 导入数据时提示只有 DBA 才能导入由其他 DBA 导出的文件
    oracle 常用语句
    android udp 无法收到数据 (模拟器中)
    android DatagramSocket send 发送数据出错
    AtCoder ABC 128E Roadwork
    AtCoder ABC 128D equeue
    AtCoder ABC 127F Absolute Minima
    AtCoder ABC 127E Cell Distance
    CodeForces 1166E The LCMs Must be Large
    CodeForces 1166D Cute Sequences
  • 原文地址:https://www.cnblogs.com/linux-sir/p/4675919.html
Copyright © 2011-2022 走看看