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