1. 程式人生 > >如何在vim中輕鬆閱讀程式碼

如何在vim中輕鬆閱讀程式碼

有時候在vim中閱讀程式碼十分的方便,特別是閱讀c/c++程式碼。通過一定的配置,可以使vim具有ide的閱讀體驗。

安裝ctags和cscope

第一步安裝vim需要的工具。ctags和cscope這是兩個古老而又強大的為程式碼建立索引的工具,在redhat系列的linux系統下(例如:redhat,centos,fedra等)安裝非常方便。

sudo yum install ctags
sudo yum install cscope

若還有問題,可以在網上查一下,一般都能解決。

建立自己的外掛函式

建立一些常用的外掛函式方便以後的對映。這些函式包括:檢視函式定義,檢視函式呼叫情況,查詢字串出現的地方,等等。下面我們就來建立這樣的檔案:
在/home/username/下建立一個資料夾 .vim/plugins 或 .vim/plugin(vim的版本不同,目錄不同,一般是在.vim/plugin下),注意:是在使用者的home目錄下進行建立,而且是隱藏資料夾。

cs_search_string.vim

該檔案的內容如下:

"cs search word
func CS_Search_Word()
    let w = expand("<cword>")
    exe "cs f s" w
    exe "copen"
endfunc

" find the define
func CS_Search_define()
    let w = expand("<cword>")
    exe "cs f g" w
    exe "copen"
endfunc

" find call what funcs 
func CS_Search_whatfunc()
    let w = expand("
<cword>") exe "cs f d" w endfunc " find called func func CS_Search_calledfunc() let w = expand("<cword>") exe "cs f c" w endfunc " find where file the func is func CS_Search_funcfiles() let w = expand("<cword>") exe "cs f i" w endfunc

search_word.vim

"search word
func Search_Word()
    let w = expand("
<cword>") exe "vimgrep" w "./**/*.c ./**/*.h" exe "copen" endfunc

建立.vimrc檔案

在使用者自己的home目錄下建立自己的.vimrc檔案。注意,以下檔案是我的配置,你可以修改成你的配置,我在相關的對映上都加上了註釋。該檔案的內容如下:

set nu
set tabstop=4
set et
set fo-=r
set noautoindent
syntax on
" 把游標放到一個函式上,按f5就可以開啟該函式的定義視窗
map <F5> <C-w>]
" 按f6關閉定義視窗
map <F6> <C-w>c
" 按f4可以檢視括號的匹配
map <F4> <S-%>
" 在插入模式下輸入zz,即可退出編輯狀態
imap zz <Esc>
set sw=4
"map <F2> :s/$/\=   strftime("    %Y-%m-%d %H:%M:%S")<Enter>
" 在游標所在行的末尾插入日期,這個可以按自己的需要去留
map <F2> :s/$/\=   strftime(" %Y-%m-%d")<Enter>
" 在專案級別查詢單詞所在的地方,並彈出視窗
map <F9> :call Search_Word()<CR>
" 按<檢視前一項內容
map < :cprevious<CR>
" 按>檢視後一項內容
map > :cnext<CR>
" 只是檢視函式被呼叫的地方,而不是字串搜素
map <F7> :call CS_Search_Word()<CR>
" 關閉彈出視窗
map <F8> :cclose<CR>

if has("cscope")
        set csprg=/usr/bin/cscope
        set csto=0
        set cst
        set nocsverb
        " add any database in current directory
        if filereadable("./cscope.out")
            cs add ./cscope.out
        " else add database pointed to by environment
        elseif $CSCOPE_DB != ""
        "if $CSCOPE_DB != ""
            cs add $CSCOPE_DB
        endif
        set csverb
endif

set cscopequickfix=e-,i-,s-,t-
" 檢視函式被呼叫的地方
map <F11> :call CS_Search_calledfunc()<CR>
" 檢視函式定義
map <F12> :call CS_Search_whatfunc()<CR>
hi Comment ctermfg=6

set nocompatible
"filetype indent on
"set autoindent
"set ic
set hls 
"set lbr 
colorscheme delek

建立建立索引命令

需要建立索引時可以通過ctags命令和cscope命令單獨建立,我這裡自己寫了一個指令碼,用起來比較方便。該指令碼叫:ctcs。指令碼建立完成後,把指令碼放到/usr/local/bin/下即可。

#!/bin/bash
#
# ctcs

star()
{
    ctags -R *   
    if [ $? -eq 0 ]; then
        echo "ctags successfully!"
    fi  
    cscope -qbR 
    if [ $? -eq 0 ]; then
        echo "cscope successfully!"
    fi  
}

del()
{
    if [ -f tags -o -f cscope.out -o -f cscope.po.out -o -f cscope.in.out ]; then
        rm -f tags  && echo "clean tags ok!"
        rm -f cscope.* && echo "clean cscope.* files ok!"
    fi  
}

case "$1" in
    -r) 
        del 
        star
        ;;  
    -d) 
        del 
        ;;  
    *)  
        echo "usage : ctcs -r|-d"   
        exit 1
esac

exit 0

如何使用

(1) 進入專案原始碼根目錄
(2) 執行ctcs -r命令
(3) vim xxx.c
(4) 把游標放到一個函式上,按f7試一試,是否能看到函式被呼叫的列表

$ cd redis-4.0.1
$ ctcs -r
$ vim src/server.c