VIM 打造 c/c++ IDE


1. vim 的安裝

$sudo apt-get install vim vim-scripts vim-doc <br> 

其中vim-scripts包含了vim的一些基本插件,包括語法高亮,縮進等等。
vim的中文文檔tar包下載地址: http://sourceforge.net/projects/vimcdoc/files/vimcdoc/
解壓后其中有個doc文件夾, 將其中的內容全部復制到~/.vim/doc, 或者vim安裝目錄下的doc目錄中, 此時vim中的help信息已經是中文的了.
網頁版中文幫助文檔網址http://vimcdoc.sourceforge.net/doc/help.html
首頁就時vim幫助文檔的目錄,閱讀起來更方便有效、更有針對性!

2. vim的配置文件

vim系統的配置文件在 /usr/share/vim, /etc/vim 兩個文件夾下,但是,可以修改 ~/.vimrc 文件和 ~/.vim 目錄來對用戶單獨配置vim。 

3. vim的基本配置

"---------------------------------- pathogen 設置-------------------------
"pathogen插件用於管理其他vim插件,安裝其他插件時候,可以直接解壓覆蓋到 .vim 目錄下的 autoload, plugin, doc目錄;
"也可以安裝完pathogen之后(會在autoload目錄下有一個pathogen.vim,同時在.vim 下創建 bundles目錄)進入 bundles目錄,
"執行 git clone xxxx 到bundles目錄,利用 pathogen進行安裝
execute pathogen#infect()
execute pathogen#helptags()

"定義快捷鍵的前綴,前綴類似於命令空間,避免多個相同的快捷鍵沖突
"如 c, <header> c, <header><header> c 是三個不同的快捷鍵
let mapleader=";"

"----------------------------------基本配置------------------------------
"關閉兼容模式
set nocompatible

"文件類型檢測,可以針對不同類型的文件加載不同的插件
filetype on
"根據偵測的文件類型,加載相應的插件
filetype plugin on

"vim 自身命令行 模式自動補全
set wildmenu

"設置語法高亮
if has("syntax")
syntax on
endif


"高亮光標所在的行
set cul

"用淺色高亮當前行
autocmd InsertEnter * se cul

"設置行間隔
set linespace=0

"設置退格鍵可用
set backspace=2

"設置匹配模式,顯示匹配的括號
set showmatch

"整詞換行
set linebreak

"設置光標可以從行首或行末換到另一行去
set whichwrap=b,s,<,>,[,]

"設置使用鼠標
set mouse=a

"顯示行號
set number

"標志預覽窗口
set previewwindow

"設置歷史記錄條數
set history=50

"設置自動寫回文件
"自動把內容寫回文件: 如文件被修改過,在每個 :next、:rewind、:last、:first、:previous、:stop、:suspend、
:tag、:!、:make、CTRL-]" 和 CTRL-^命令時進行;
用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令轉到別的文件時亦然。
set autowrite



"---------------------------------配色方案------------------------------
syntax enable

syntax on

"設置背景色
set background=dark

"vim 配色方案
"colorscheme solarized
colorscheme desert

set t_Co=256

"設置字體
set guifont=Consolas:h11


"---------------------------------設置寬度(tab等)----
"設置tab寬度
set tabstop=4

"設置軟tab寬度,軟tab,用空格代替tab
set softtabstop=4

"自動縮進的寬度
set shiftwidth=4

"----------------------------------設置對齊和縮進--------
"設置自動對齊,(和上一行)
set autoindent

"智能對齊
"set smartindent

"使用c/c++語言的自動縮進方式
set cindent

"設置c/c++語言的具體縮進方式
set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s

"不要用空格代替制表符
set expandtab

"在行和段開始處使用制表符
set smarttab

4. 代碼折疊

  1. 折疊方式foldmethod
    vim提供以下6種方法來選定折疊方式:
    manual 手工定義折疊
    indent 更多的縮進表示更高級別的折疊
    expr 用表達式來定義折疊
    syntax 用語法高亮來定義折疊
    diff 對沒有更改的文本進行折疊
    marker 對文中的標志折疊
  2. 折疊級別foldlevel
    ‘foldlevel’ 是個數值選項:數字越大則打開的折疊更多。
    當 ‘foldlevel’ 為 0 時,所有的折疊關閉。
    當 ‘foldlevel’ 為正數時,一些折疊關閉。
    當 ‘foldlevel’ 很大時,所有的折疊打開。
  3. 折疊欄foldcolumn
    ‘foldcolumn’ 是個數字,它設定了在窗口的邊上表示折疊的欄的寬度。當為0時,沒有折疊欄。最大是12。
    一個打開的折疊由一欄來表示,頂端是 ‘-‘,其下方是 ‘|’。這欄在折疊結束的地方結束。當折疊嵌套時,嵌套的折疊出現在被包含的折疊右方一個字符位置。
    一個關閉的折疊由 ‘+’ 表示。
    當折疊欄太窄而不能顯示所有疊時,顯示一數字來表示嵌套的級別。
    在折疊欄點擊鼠標,可以打開和關閉折疊:
    (1)點擊 ‘+’ 打開在這行的關閉折疊
    (2) 在任何其他非空字符上點擊,關閉這行上的打開折疊
    在vim配置文件/home/user/.vimrc中加入如下的配置:

    "--fold setting--
    set foldmethod=syntax " 用語法高亮來定義折疊
    set foldlevel=100 " 啟動vim時不要自動折疊代碼
    set foldcolumn=5 " 設置折疊欄寬度
  4. 常用命令
    za 打開/關閉在光標下的折疊
    zA 循環地打開/關閉光標下的折疊
    zo 打開 (open) 在光標下的折疊
    zO 循環打開 (Open) 光標下的折疊
    zc 關閉 (close) 在光標下的折疊
    zC 循環關閉 (Close) 在光標下的所有折疊
    zM 關閉所有折疊
    zR 打開所有的折疊

5. quickfix 設置

通過quickfix命令集,可以在vim內編譯程序,並且直接跳轉到出錯位置進行修正, 

然后接着進行編譯和修正,直到不再出錯為止。在 vim的配置文件~/.vimrc文件中加入如下配置:

"-- QuickFix setting --
" 按下F6,執行make clean
map <F6> :make clean<CR><CR><CR>
" 按下F7,執行make編譯程序,並打開quickfix窗口,顯示編譯信息
map <F7> :make<CR><CR><CR> :copen<CR><CR>
" 按下F8,光標移到上一個錯誤所在的行
map <F8> :cp<CR>
" 按下F9,光標移到下一個錯誤所在的行
map <F9> :cn<CR>
" 以上的映射是使上面的快捷鍵在插入模式下也能用
imap <F6> <ESC>:make clean<CR><CR><CR>
imap <F7> <ESC>:make<CR><CR><CR> :copen<CR><CR>
imap <F8> <ESC>:cp<CR>
imap <F9> <ESC>:cn<CR>
下面的命令運行 "make" (包括你所給出的參數) 程序並捕捉其運行結果: > 

:make {arguments}
如果編譯時出現錯誤,按 ,回到vim界面,看不到出錯信息了!這時,可以運行以下命令
:cw[indow] 打開quickfix窗口來查看出錯信息,它會自動跳到第一處出錯的地方。然后,你可以雙擊出錯某一條出錯信息,vim就會自動跳轉到相應的出錯位置
:cn[ext] 光標移到下一個錯誤所在的行
:cp[revious] 光標移到上一個錯誤所在的行
:cfirst 到第一處錯誤
:clast 到最后一處錯誤
:cc 空間不夠時,Vim 會縮短出錯信息。如果你想查看詳細信息,可以使用此命令
:cl[ist] 列出所有出錯信息的概覽(只有那些含有文件名或行數的錯誤信息會被顯示,需要查看那些並不含文件名或行數的信息可用“:cl[ist]!”命令)

6. ctags配置

ctags 可以建立源碼樹的標簽索引,用於快速定位函數、變量等。 

$sudo apt-get install ctags #安裝ctags
$ ctags -R * #建立索引文件

~/.vimrc中對ctgs的使用進行配置

"-------------------------------------ctags設置---------------------------- 
"按下F5重新生成tag文件,並更新taglist
map <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>
set tags=tags
set tags+=./tags "add current directory's generated tags file

tag命令用法:
Ctrl+] 跳到當前光標下單詞的標簽
Ctrl+O 返回上一個標簽
Ctrl+T 返回上一個標簽
:tag TagName 跳到TagName標簽
以上命令是在當前窗口顯示標簽,當前窗口的文件替代為包標簽的文件,當前窗口光標跳到標簽位置。如果不希望在當前窗口顯示標簽,可以
:stag TagName 新窗口顯示TagName標簽,光標跳到標簽處
Ctrl+W + ] 新窗口顯示當前光標下單詞的標簽,光標跳到標簽處
當一個標簽有多個匹配項時(函數 (或類中的方法) 被多次定義),”:tags” 命令會跳轉到第一處。如果在當前文件中存在匹配,那它將會被首先使用。
可以用這些命令在各匹配的標簽間移動:
:tfirst 到第一個匹配
:[count]tprevious/tp 向前 [count] 個匹配
:[count]tnext/tn 向后 [count] 個匹配
:tlast 到最后一個匹配
或者使用以下命令選擇要跳轉到哪一個
:tselect TagName
輸入以上命令后,vim會為你展示一個選擇列表。然后你可以輸入要跳轉到的匹配代號 (在第一列)。其它列的信息可以讓你知道標簽在何處被定義過。
以下命令將在預覽窗口顯示標簽
:ptag TagName 預覽窗口顯示TagName標簽,光標跳到標簽處
Ctrl+W + } 預覽窗口顯示當前光標下單詞的標簽,光標跳到標簽處
:pclose 關閉預覽窗口
:pedit file.h 在預覽窗口中編輯文件file.h(在編輯頭文件時很有用)
:psearch atoi 查找當前文件和任何包含文件中的單詞並在預覽窗口中顯示匹配,在使用沒有標簽文件的庫函數時十分有用。

5. 管理vim插件 pathogen

通過pathogen,可以管理vim插件。 當自己下載安裝vim插件的時候,也可以在自己的插件子目錄~/.vim下。在~/.vim 子目錄下,設置插件目錄plugin 和文檔目錄doc. 使用手動方式進行拷貝添加:解壓 xxx.zip,將 解壓后的目錄中的 autoload, plugin, doc 目錄中的文件拷貝到 ~/.vim目錄下 

對應的autoload, plugin, doc 目錄中去(直接解壓覆蓋安裝即可)。
或者使用pathogen 插件管理器來管理插件,pathogen在~/.vim/autoload目錄下有 pathogen.vim, 然在.vim目錄下建立
bundle目錄,在bumdle目錄下執行 git clone xxxx.git 獲得插件,即可完成自動安裝。同時,在.vimrc 文件中添加
execute pathogen#effect()
execute pathogen#helptags()

6. vim 自動補全 Onmicpp-Complete

    vim的自動補全功能可以通過 Omnicpp-Complete來實現。
在~/.vimrc 配置文件中進行配置: 
"-- omnicppcomplete setting --
" 按下F3自動補全代碼,注意該映射語句后不能有其他字符,包括tab;否則按下F3會自動補全一些亂碼
imap <F3> <C-X><C-O>
" 按下F2根據頭文件內關鍵字補全
imap <F2> <C-X><C-I>
set completeopt=menu,menuone " 關掉智能補全時的預覽窗口
let OmniCpp_MayCompleteDot = 1 " autocomplete with .
let OmniCpp_MayCompleteArrow = 1 " autocomplete with ->
let OmniCpp_MayCompleteScope = 1 " autocomplete with ::
let OmniCpp_SelectFirstItem = 2 " select first item (but don't insert)
let OmniCpp_NamespaceSearch = 2 " search namespaces in this and included files
let OmniCpp_ShowPrototypeInAbbr = 1 " show function prototype in popup window
let OmniCpp_GlobalScopeSearch=1 " enable the global scope search
let OmniCpp_DisplayMode=1 " Class scope completion mode: always show all members
"let OmniCpp_DefaultNamespaces=["std"]
let OmniCpp_ShowScopeInAbbr=1 " show scope in abbreviation and remove the last column
let OmniCpp_ShowAccess=1
OnmiCppComplete是基於ctags數據庫即tag文件來自動補全的,所以在使用ctags -R 生成tag文件時需要加入其他選項, 

才能與OnmiCppComplete配合。
ctags -R —c++-kinds=+p —fields=+iaS —extra=+q .
—c++-kinds=+p : 為C++文件增加函數原型的標簽
—fields=+iaS : 在標簽文件中加入繼承信息(i)、類成員的訪問控制信息(a)、以及函數的指紋(S)
—extra=+q : 為標簽增加類修飾符。注意,如果沒有此選項,將不能對類成員補全
例如,為了添加標准c++的代碼補全。

  1. 下載c++的源代碼
    $sudo apt-get install build-essential (源碼會放在/usr/include/c++ 目錄下) 
  2. 然后生成和omnicppcomplete連接的tags文件
    在/usr/include/c++目錄下執行,ctags -R --c++-kinds=+p --fields=+iaS --extra=+q . 生成tags文件 
  3. 在.vimrc 文件中添加
    set tags+=/usr/include/c++/tags 

注意:在自動補全的點,Vim必須知道可能補全的定義。比如說,在namespace std命名空間下的變量和函數,必須要用using namespace std;暴露出來,否則是不能補全的。
在.cpp文件中還可以,在.h文件中這樣就不是好的做法了。暫時不知道這個問題是由於我自己配置錯誤還是程序沒有實現。
當自動補全下拉窗口彈出后,一些可用的快捷鍵:
Ctrl+P 向前切換成員
Ctrl+N 向后切換成員
Ctrl+E 表示退出下拉窗口, 並退回到原來錄入的文字
Ctrl+Y 表示退出下拉窗口, 並接受當前選項
其他補全方式:
Ctrl+X Ctrl+L 整行補全
Ctrl+X Ctrl+N 根據當前文件里關鍵字補全
Ctrl+X Ctrl+K 根據字典補全
Ctrl+X Ctrl+T 根據同義詞字典補全
Ctrl+X Ctrl+I 根據頭文件內關鍵字補全
Ctrl+X Ctrl+] 根據標簽補全
Ctrl+X Ctrl+F 補全文件名
Ctrl+X Ctrl+D 補全宏定義
Ctrl+X Ctrl+V 補全vim命令
Ctrl+X Ctrl+U 用戶自定義補全方式
Ctrl+X Ctrl+S 拼寫建議
幫助文檔
:help omnicppcomplete

7. 提示函數原型 echo_func

echofunc可以在命令行中提示當前輸入函數的原型。
echofunc下載地址:<http://www.vim.org/scripts/script.php?script_id=1735> 下載完成后,把echofunc.vim文件放到 ~/.vim/plugin 

文件夾中
當你在vim插入(insert)模式下緊接着函數名后輸入一個”(“的時候, 這個函數的聲明就會自動顯示在命令行中。如果這個函數有多個聲明,
則可以通過按鍵”Alt+-“和”Alt+=”向前和向后翻頁,
這個兩個鍵可以通過設置g:EchoFuncKeyNext和g:EchoFuncKeyPrev參數來修改。這個插件需要tags文件的支持,
並且在創建tags文件的時候要加選項”—fields=+lS”(OmniCppComplete創建的tag文件也能用),
整個創建tags文件的命令如下:
$ ctags -R —fields=+lS

8. 標簽瀏覽器 TagList

Taglist了列出了當前文件中的所有標簽,宏、變量、函數等。  

安裝taglist: 下載taglist 的壓縮包, 解壓縮到 ~/.vim 目錄覆蓋 doc和plugin目錄即可。
配置taglist:


"-- Taglist setting --
let Tlist_Ctags_Cmd='ctags' "因為我們放在環境變量里,所以可以直接執行
let Tlist_Use_Right_Window=1 "讓窗口顯示在右邊,0的話就是顯示在左邊
let Tlist_Show_One_File=0 "讓taglist可以同時展示多個文件的函數列表
let Tlist_File_Fold_Auto_Close=1 "非當前文件,函數列表折疊隱藏
let Tlist_Exit_OnlyWindow=1 "當taglist是最后一個分割窗口時,自動推出vim
"是否一直處理tags.1:處理;0:不處理
let Tlist_Process_File_Always=1 "實時更新tags
let Tlist_Inc_Winwidth=0

進入vim后用命令":Tlist"打開/關閉taglist窗口
幫助文檔
:help taglist.txt

9. cscope 設置

Cscope是一個類似於ctags的工具,不過其功能比ctags強大很多。
  1. 安裝Cscope
    $ sudo apt-get install cscope
  2. 在vim配置文件/home/user/.vimrc中加入如下的配置:
    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

map :cs add ./cscope.out . :cs reset
imap :cs add ./cscope.out . :cs reset
“ 將:cs find c等Cscope查找命令映射為c等快捷鍵(按法是先按Ctrl+Shift+-, 然后很快再按下c)
nmap s :cs find s =expand(““) :copen
nmap g :cs find g =expand(““)
nmap d :cs find d =expand(““) :copen
nmap c :cs find c =expand(““) :copen
nmap t :cs find t =expand(““) :copen
nmap e :cs find e =expand(““) :copen
nmap f :cs find f =expand(““)
nmap i :cs find i =expand(““) :copen

  1. cscope的主要功能是通過其”find”子命令來實現的
    “cscope find”的用法:
    cs find c|d|e|f|g|i|s|t name
    0 或 s 查找這個 C 符號(可以跳過注釋)
    1 或 g 查找這個定義
    2 或 d 查找這個函數調用的函數
    3 或 c 查找調用過這個函數的函數
    4 或 t 查找這個字符串
    6 或 e 查找這個 egrep 模式
    7 或 f 查找這個文件
    8 或 i 查找包含這個文件的文件

  2. 用法:
    <1>、為源碼建立一個cscope數據庫
    $ cscope -Rbq
    $ ls cscope.*
    cscope.in.out cscope.out cscope.po.out
    <2>、用vim打開某個源碼文件,末行模式下,輸入“:cs add cscope.out”(該命令已被我們映射為快捷鍵F4),添加cscope數據庫到vim。因為我們已將vim配置為啟動時,自動添加當前目錄下的cscope數據庫,所以你再添加該cscope數據庫時,vim會提示“重復cscope數據庫 未被加入“
    <3>、完成前兩步后,現在就可以用“cs find c”等Cscope查找命令查找關鍵字了。我們已在.vimrc中將“cs find c”等Cscope查找命令映射為c等快捷鍵(按法是先按Ctrl+Shift+-, 然后很快按下c)

幫助文檔
:help ifcscop
注意:幫助文檔if_cscop中,快捷鍵映射nmap <C-
>i :cs find i ^=expand(““)$是有誤的!
比如光標“header.h”上按下i,也就是查找包含“header.h“的文件。但是按照這個映射規則,則是將i映射為cs find i ^header.h$,也就是查找包含“^header.h$“的文件,這顯然不是我們想要的結果。該映射規則應該改成nmap i :cs find i =expand(““)

10. vim 常用快捷鍵

% 跳轉到配對的括號去
[[ 跳轉到當前或者上一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨占一行)
][ 跳轉到當前代碼塊(函數定義、類定義等)的結尾去(但要求代碼塊中'{'必須單獨占一行)
]] 跳轉到下一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨占一行)
[/ 跳到注釋開頭(只對/* */注釋有效)
]/ 跳到注釋結尾(只對/* */注釋有效)
gD 跳轉到當前文件內標識符首次出現的位置,可用於跳轉到全部變量的定義處;查找局部變量時,
要是多個函數中定義了該局部變量,使用gD進行查找,找到的變量定義可能不是你需要的
gd 跳轉到當前函數內標識符首次出現的位置,可用於跳轉到局部變量的定義處
'' 跳轉到光標上次停靠的地方, 是兩個\`, 而不是一個雙引號
mx 設置書簽,x只能是a-z的26個字母
`x 跳轉到書簽處("`"是1左邊的鍵)
> 增加縮進,"x>"表示增加以下x行的縮進
< 減少縮進,"x<"表示減少以下x行的縮進
參考文章:

http://www.cnblogs.com/zhangsf/archive/2013/06/13/3134409.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM