VIM打造成IDE

1.安裝git

由於VIM的包管理軟件Vundle需要Git支持,所以第一步我們先安裝git

sudo apt-get install git

2.安裝Vundle

Vundle是VIM的包管理軟件,我們的插件大部分是通過這個包管理軟件進行安裝的,還有一部分是系統自帶的,使用系統命令安裝即可

2.1下載

執行git clone命令進行下載

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

2.2配置.vimrc文件

將如下內容放在.vimrc文件中,該內容是由Readme中的內容刪減的

set nocompatible              
filetype off                                                     

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'

call vundle#end()            
filetype plugin indent on    
" :PluginList       
" :PluginInstall   
" :PluginSearch foo 
" :PluginClean  

這裏粘貼的時候會因爲自動註釋和自動換行,導致粘貼的內容混亂,可以先使用

set paste

進入粘貼模式,將內容粘貼完畢後,再使用

set nopaste

恢復即可

2.3VIM常規配置

syntax on            " 支持語法高亮
set tabstop=4        " 設置製表符(tab鍵)的寬度
"set softtabstop=4   " 設置按退格鍵的時候退回縮進的長度   
set expandtab	     " 使用空格代替Tab
set ai		     " 設置自動縮進
set shiftwidth=4     " (自動) 縮進使用的4個空格
set hls		     " 打開搜索高亮
set nu		     " 顯示行號

"設置Ctrl + K/J/H/L的映射
nmap <C-K> <C-W><C-K>
nmap <C-J> <C-W><C-J>
nmap <C-H> <C-W><C-H>
nmap <C-L> <C-W><C-L>

"按F8高亮當前單詞
nmap <F8> :let @/=expand('<cword>')<cr>

3.NERDTree

NERDTree插件時VIM的目錄樹插件,安裝之後你可以查看工程的目錄結構

3.1NERDTree安裝

vundle配置中添加

Plugin 'scrooloose/nerdtree'

執行PluginInstall即可,如果安裝後目錄樹顯示是

"�~V�"

請將~/.vim/bundle/nerdtree/plugin/NERD_tree.vim中的如下代碼

if !nerdtree#runningWindows() && !nerdtree#runningCygwin()
    call s:initVariable("g:NERDTreeDirArrowExpandable", "�~V�")
    call s:initVariable("g:NERDTreeDirArrowCollapsible", "�~V�")
else
    call s:initVariable("g:NERDTreeDirArrowExpandable", "+")
    call s:initVariable("g:NERDTreeDirArrowCollapsible", "~")
endif

改爲

"if !nerdtree#runningWindows() && !nerdtree#runningCygwin()
"    call s:initVariable("g:NERDTreeDirArrowExpandable", "�~V�")
"    call s:initVariable("g:NERDTreeDirArrowCollapsible", "�~V�")
"else
    call s:initVariable("g:NERDTreeDirArrowExpandable", "+")
    call s:initVariable("g:NERDTreeDirArrowCollapsible", "~")
"endif

即可

 

3.2NERDTree配置

" 按<F2>打開或關閉文件目錄樹
map <F2> : NERDTreeToggle<CR>

" 修改樹的顯示圖標
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'

" 窗口位置
let g:NERDTreeWinPos='left'

" 窗口是否顯示行號
let g:NERDTreeShowLineNumbers=1

" 不顯示隱藏文件
let g:NERDTreeHidden=0

"打開vim時如果沒有文件自動打開NERDTree
autocmd vimenter * if !argc()|NERDTree|endif
" 當NERDTree爲剩下的唯一窗口時自動關閉
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

 

3.3NERDTree使用方法

  • 使用Ctrl + K/J/H/L在不同窗口之間切換
  • 使用P/p 快讀跳轉到根目錄/上層目錄
  • 使用 i 以水平方式打開文件
  • 使用 s 以垂直方式打開文件
  • 更多使用方式可以在NERDTree界面中使用?來查看

 

4.ctags

ctags相當於對所有符號建立了索引,這樣我們就可以在符號之間進行查看和跳轉了

4.1安裝ctags

sudo apt-get install ctags

4.2ctags配置

"設置當前的tags路徑
set tags=tags
set tags+=./tags

"使用F5來重新生成tags文件並更新taglist
"如果只想更新某些目錄必須要更改<CR><CR>之前的路徑
nmap <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>

"使用g + ]而不是Ctrl + ],這樣每次都可以直接列出所有匹配項
nmap <C-]> g]

如果有許多個工程,每個工程需要更新的目錄不一樣,可以這樣設置

:let betaflight_path = "/home/xia/betaflight_master"

set tags=tags
set tags+=./tags
if getcwd() == betaflight_path
    nmap <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ./src ./lib<CR><CR> :TlistUpdate<CR>
    "imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q ./src ./lib<CR><CR> :TlistUpdate<CR>
else
    nmap <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
    "imap <F5> <ESC>:!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
endif

這樣,當我們在betaflight_master目錄下,更新的就是./src 和 ./lib文件夾,其餘目錄更新的是當前目錄下所有文件夾

4.3ctags使用

先使用ctags * -R + dir 對某些目錄建立符號表,然後可以使用下面的快捷鍵使用ctags

  • Ctrl+] 跳到當前光標下單詞的標籤
  • Ctrl + W + ] 在新窗口打開當前光標下單詞的標籤
  • Ctrl+T 返回上一個標籤
  • 如果想在新窗口打開標籤,可以先使用 :sp 命令打開一個新窗口,然後在新窗口中跳轉
  • :tag + name 跳轉到名字爲name的變量處,可以先使用這個命令再使用Ctrl + ]來快速查找

5.taglist

taglist顧名思義就是可以將所有符號顯示出來的插件,這樣我們在新的窗口就可以看到當前文件中所有的變量,結構體,函數定義等等

5.1 安裝taglist

vundle配置中添加

Plugin 'taglist.vim'

使用“PluginList”查看後用“PluginInstall”進行安裝

 

5.2 taglist配置

nnoremap <F3> :TlistToggle<CR>

let Tlist_Use_Right_Window=1  	"讓窗口顯示在右邊,0的話就是顯示在左邊
let Tlist_Show_One_File=1 		"只顯示當前文件的taglist
let Tlist_Exit_OnlyWindow=1 	"當taglist是最後一個分割窗口時,自動退出vim

5.3 taglist使用方法

  • 使用Enter在當前窗口跳轉到tag
  • 使用Space查看函數或變量原型
  • 使用U更新taglist,這個更新不會保存在tags中,建議還是使用上面的F5進行更新
  • 使用o在新窗口打開當前tag
  • 使用x放大縮小taglist,方便查看較長的名字
  • 使用zc,閉合當前tag
  • 使用zo,展開當前tag

 

6.cscope

前面說了ctags已經建立了符號表,但是他並不知道各個符號的調用關係,所以我們用ctags只能跳轉到定義處,而使用cscope就可以按照我們想要的符號關係進行跳轉,比如查找所有調用此函數的地方

6.1cscope安裝

sudo apt-get install cscope

6.2cscope配置

if has("cscope")
    set csprg=/usr/bin/cscope        " 指定用來執行cscope的命令
    set csto=0                        " 設置cstag命令查找次序:0先找cscope數據庫再找標籤文件;1先找標>籤文件再找cscope數據庫
    set cst                            " 同時搜索cscope數據庫和標籤文件
    set cscopequickfix=s-,c-,d-,i-,t-,e-    " 使用QuickFix窗口來顯示cscope查找結果
    set nocsverb
    if filereadable("cscope.out")    " 若當前目錄下存在cscope數據庫,添加該數據庫到vim
        cs add cscope.out
    elseif $CSCOPE_DB != ""            " 否則只要環境變量CSCOPE_DB不爲空,則添加其指定的數據庫到vim
        cs add $CSCOPE_DB
    endif
    set csverb
endif

nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>

6.3cscope使用

cscope也需要先單獨生成文件,可以按照如下方式使用

find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files

這裏需要說明一下,由於cscope和ctags是配合使用的,所以如果要更新,也需要一起更新,包含的文件夾需要一直,所以這裏建議,不使用vim配置中的快捷鍵更新,而是單獨寫個腳本用來更新,需要更新的時候執行這個腳本,或者在vim中執行":sh"進入shell,運行完這個腳本之後,在執行exit()回到vim中即可,腳本內容如下

#!/bin/sh

UPDATE_DIR="./src ./lib"

find $UPDATE_DIR -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files

ctags -R $UPDATE_DIR

按照上面的配置,使用Ctrl + Shift + - 之後在按對應的功能進行查找即可

s: 查找C語言符號,即查找函數名、宏、枚舉值等出現的地方

g: 查找函數、宏、枚舉等定義的位置,類似ctags所提供的功能

d: 查找本函數調用的函數

c: 查找調用本函數的函數

t: 查找指定的字符串

e: 查找egrep模式,相當於egrep功能,但查找速度快多了

f: 查找並打開文件,類似vim的find功能

i: 查找包含本文件的文件

7.syntastic

syntastic是一個靜態檢查工具,在你打開VIM或者保存VIM的時候,工具會自動檢查並提示語法錯誤

7.1syntastic安裝

Plugin 'scrooloose/syntastic'

7.2syntastic配置

目前使用默認配置即可

7.3syntastic使用

在保存時,如果有錯誤,VIM會自動進行提示,但是感覺並不好用,因爲跳轉之後有的文件感覺這個功能沒有生效

 

8.Quickfix

VIM自帶插件,可以在Make的時候自動跳轉到錯誤的地方,同樣感覺不習慣使用,個人還是習慣新打開一個窗口然後進行編譯,出錯的文件也肯定是之前修改過的,已經在原來窗口打開了

9.總結

有了上述功能,雖然和SourceInsight比不了,但是也是一個強大好用的IDE了,總結一下,其實我們有一個配置的vimrc文件,還有一個用於自動更新tag的腳本,全部內容如下

9.1vimrc文件內容如下

"================================
"===      Vundle Setting      ===
"================================
set nocompatible              
filetype off                                                     

set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'

Plugin 'scrooloose/nerdtree'
Plugin 'scrooloose/syntastic'
Plugin 'taglist.vim'

call vundle#end()            
filetype plugin indent on    
" :PluginList       
" :PluginInstall   
" :PluginSearch foo 
" :PluginClean 

"=================================
"===        Vim Setting        ===
"=================================

syntax on       	 " 支持語法高亮
set tabstop=4        " 設置製表符(tab鍵)的寬度
"set softtabstop=4   " 設置按退格鍵的時候退回縮進的長度   
set expandtab	 " 使用空格代替Tab
set ai		 " 設置自動縮進
set shiftwidth=4     " (自動) 縮進使用的4個空格
set hls		 " 打開搜索高亮
set nu		 " 顯示行號

"設置Ctrl + K/J/H/L的映射
nmap <C-K> <C-W><C-K>
nmap <C-J> <C-W><C-J>
nmap <C-H> <C-W><C-H>
nmap <C-L> <C-W><C-L>

"按F8高亮當前單詞
nmap <F8> :let @/=expand('<cword>')<cr>

"==================================
"===      NERDTree Setting      ===
"==================================
" 按<F2>打開或關閉文件目錄樹
map <F2> : NERDTreeToggle<CR>

" 修改樹的顯示圖標
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'

" 窗口位置
let g:NERDTreeWinPos='left'

" 窗口是否顯示行號
let g:NERDTreeShowLineNumbers=1

" 不顯示隱藏文件
let g:NERDTreeHidden=0

"打開vim時如果沒有文件自動打開NERDTree
autocmd vimenter * if !argc()|NERDTree|endif
" 當NERDTree爲剩下的唯一窗口時自動關閉
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif

"===================================
"===        ctags Setting        ===
"===================================
set tags=tags
set tags+=./tags

"ctags更新請使用腳本進行更新

"nmap <C-]> <C-W>]
nmap <C-]> g]

"=====================================
"===        taglist Setting        ===
"=====================================
nnoremap <F3> :TlistToggle<CR>

"taglist臨時更新,可以使用u進行更新,永久更新請使用腳本更新

let Tlist_Use_Right_Window=1  	"讓窗口顯示在右邊,0的話就是顯示在左邊
let Tlist_Show_One_File=1 		"只顯示當前文件的taglist
let Tlist_Exit_OnlyWindow=1 	"當taglist是最後一個分割窗口時,自動推出vim	

"====================================
"===        cscope Setting        ===
"====================================

if has("cscope")
    set csprg=/usr/bin/cscope        " 指定用來執行cscope的命令
    set csto=0                        " 設置cstag命令查找次序:0先找cscope數據庫再找標籤文件;1先找標>籤文件再找cscope數據庫
    set cst                            " 同時搜索cscope數據庫和標籤文件
    set cscopequickfix=s-,c-,d-,i-,t-,e-    " 使用QuickFix窗口來顯示cscope查找結果
    set nocsverb
    if filereadable("cscope.out")    " 若當前目錄下存在cscope數據庫,添加該數據庫到vim
        cs add cscope.out
    elseif $CSCOPE_DB != ""            " 否則只要環境變量CSCOPE_DB不爲空,則添加其指定的數據庫到vim
        cs add $CSCOPE_DB
    endif
    set csverb
endif

nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>
nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> :copen<CR><CR>
nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>
nmap <C-_>i :cs find i <C-R>=expand("<cfile>")<CR><CR> :copen<CR><CR>

9.2自動更新腳本文件內容如下

#!/bin/sh

UPDATE_DIR="./src ./lib"

find $UPDATE_DIR -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files
cscope -bkq -i cscope.files

ctags -R $UPDATE_DIR

可以在每個工程的根目錄下創建這個腳本,然後根據不同的工程修改需要建立所以的目錄和文件類型

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章