vim c開發環境搭建

http://blog.csdn.net/yinjiabin/article/details/8254609

1.安裝vim 環境

首先安裝好Vim和Vim的基本插件。這些使用apt-get安裝即可:

lingd@ubuntu:~/arm$sudo apt-get install vim vim-scripts vim-doc

其中vim-scripts是vim的一些基本插件,包括語法高亮的支持、縮進等等

2.配置文件

/etc/vim下,也可以拷貝到自己的home目錄,修改為.vimrc

" This line should not be removed as it ensures that various options are
    " properly set to work with the Vim-related packages available in Debian.
    " debian.vim

    " Uncomment the next line to make Vim more Vi-compatible
    " NOTE: debian.vim sets 'nocompatible'. Setting 'compatible' changes numerous
    " options, so any other options should be set AFTER setting 'compatible'.
    set nocompatible

    " Vim5 and later versions support syntax highlighting. Uncommenting the
    " following enables syntax highlighting by default.
    if has("syntax")
      syntax on            " 語法高亮
    endif
    colorscheme ron        " elflord ron peachpuff default 設置配色方案,vim自帶的配色方案保存在/usr/share/vim/vim72/colors目錄下

    " detect file type
    filetype on
    filetype plugin on

    " If using a dark background within the editing area and syntax highlighting
    " turn on this option as well
    set background=dark

    " Uncomment the following to have Vim jump to the last position when
    " reopening a file
    if has("autocmd")
      au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
      "have Vim load indentation rules and plugins according to the detected filetype
      filetype plugin indent on
    endif

    " The following are commented out as they cause vim to behave a lot
    " differently from regular Vi. They are highly recommended though.

    "set ignorecase        " 搜索模式里忽略大小寫
    "set smartcase        " 如果搜索模式包含大寫字符,不使用 'ignorecase' 選項。只有在輸入搜索模式并且打開 'ignorecase' 選項時才會使用。
    set autowrite        " 自動把內容寫回文件: 如果文件被修改過,在每個 :next、:rewind、:last、:first、:previous、:stop、:suspend、:tag、:!、:make、CTRL-] 和 CTRL-^命令時進行;用 :buffer、CTRL-O、CTRL-I、'{A-Z0-9} 或 `{A-Z0-9} 命令轉到別的文件時亦然。
    set autoindent        " 設置自動對齊(縮進):即每行的縮進值與上一行相等;使用 noautoindent 取消設置
    "set smartindent        " 智能對齊方式
    set tabstop=4        " 設置制表符(tab鍵)的寬度
    set softtabstop=4     " 設置軟制表符的寬度    
    set shiftwidth=4    " (自動) 縮進使用的4個空格
    set cindent            " 使用 C/C++ 語言的自動縮進方式
    set cinoptions={0,1s,t0,n-2,p2s,(03s,=.5s,>1s,=1s,:1s     "設置C/C++語言的具體縮進方式
    "set backspace=2    " 設置退格鍵可用
    set showmatch        " 設置匹配模式,顯示匹配的括號
    set linebreak        " 整詞換行
    set whichwrap=b,s,<,>,[,] " 光標從行首和行末時可以跳到另一行去
    "set hidden " Hide buffers when they are abandoned
    set mouse=a            " Enable mouse usage (all modes)    "使用鼠標
    set number            " Enable line number    "顯示行號
    "set previewwindow    " 標識預覽窗口
    set history=50        " set command history to 50    "歷史記錄50條


    "--狀態行設置--
    set laststatus=2 " 總顯示最后一個窗口的狀態行;設為1則窗口數多于一個的時候顯示最后一個窗口的狀態行;0不顯示最后一個窗口的狀態行
    set ruler            " 標尺,用于顯示光標位置的行號和列號,逗號分隔。每個窗口都有自己的標尺。如果窗口有狀態行,標尺在那里顯示。否則,它顯示在屏幕的最后一行上。

    "--命令行設置--
    set showcmd            " 命令行顯示輸入的命令
    set showmode        " 命令行顯示vim當前模式

    "--find setting--
    set incsearch        " 輸入字符串就顯示匹配點
    set hlsearch        

3.ctags可以建立源碼樹的標簽索引(標簽就是一個標識符被定義的地方,如函數定義),使程序員在編程時能迅速定位函數、變量、宏定義等位置去查看原形

lingd@ubuntu:~/arm$ sudo apt-get install ctags
輸入命令ctags -R *,你會發現多了一個tags文件,這個就是索引文件

向vim注冊索引文件tags的路徑,
lingd@ubuntu:~/arm/linux-2.6.24.7$ vi ~/.vimrc
在打開文件的最后添加如下內容(當然,具體路徑根據你自己的情況)

    "--ctags setting--
    " 按下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
    set tags+=~/arm/Linux-2.6.24.7/tags "add new tags file(剛剛生成tags的路徑,在ctags -R 生成tags文件后,不要將tags移動到別的目錄,否則ctrl+]時,會提示找不到源碼文件)

set tags+=./tags表示在當前工作目錄下搜索tags文件
set tags+=~/arm/linux-2.6.24.7/tags表示在搜尋tags文件的時候,也要搜尋~/arm/linux-2.6.24.7/文件夾下的tags文件。

然后保存并退出vi。這樣,你就可以用vim在任意地方查看有關Linux的函數原形

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

4.自動補全

vim的自動補全功能可通過其插件OmniCppComplete實現。
安裝OmniCppComplete
lingd@ubuntu:~$ vim-addons install omnicppcomplete
配置OmniCppComplete
在vim配置文件/home/user/.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 

(前幾行就是提供了C++中的./->/::等操作符的提示和自動完成)。
OmniCppComplete是基于ctags數據庫即tags文件實現的(基于ctags生成的索引信息來實現自動補全的),所以在ctags -R生成tags時還需要一些額外的選項,這樣生成的tags文件才能與OmniCppComplete配合運作。使用下列命令生成tags文件,就可以與OmniCppComplete配合運作:
ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
--c++-kinds=+p : 為C++文件增加函數原型的標簽
--fields=+iaS : 在標簽文件中加入繼承信息(i)、類成員的訪問控制信息(a)、以及函數的指紋(S)
--extra=+q : 為標簽增加類修飾符。注意,如果沒有此選項,將不能對類成員補全
vim自動補全功能的測試
為了測試自動補全功能,我們先下載C++一份C++標準庫的源代碼。

lingd@ubuntu:~$ sudo apt-get install build-essential

# 然后在/usr/include/c++下就可以找到標準庫的頭文件了。

lingd@ubuntu:~$ cd /usr/include/c++
lingd@ubuntu:/usr/include/c++$ ls

4.4 4.4.3
在此文件夾下生成能與OmniCppComplete配合運作的tags文件

lingd@ubuntu:/usr/include/c++$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .
lingd@ubuntu:/usr/include/c++$ ls

4.4 4.4.3 tags
在vim的配置文件中如下內容,然后在編程的時候就可以使用自動補全功能了。

lingd@ubuntu:/usr/include/c++$ vi ~/.vimrc
set tags+=/usr/include/c++/tags

用vi打開前面的Test.c文件,在printf("Hello World!\n")下一行中,輸入pri,然后按下Ctrl+X Ctrl+O,此時vi會彈出一個窗口,所有以pri開頭的tag都會出現在這個窗口中,printf就出現在第6行中

lingd@ubuntu:~$ cd ~
lingd@ubuntu:~$ vim Test.c

注意:在自動補全的點,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

5.標簽瀏覽器Taglist

Taglist用于列出了當前文件中的所有標簽(宏, 全局變量, 函數名等)
安裝Taglist
lingd@ubuntu:~$ vim-addons install taglist
配置Taglist
在vim配置文件/home/user/.vimrc中加入如下的配置:

    "-- 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

Paste_Image.png

6.文件瀏覽器和緩沖區管理器WinManager

WinManager用于管理文件瀏覽器和緩沖區(buffer)。2.0以上版本的WinManager還可以管理其他IDE類型插件,不過要用戶在插件中增加一些輔助變量和hook來支持WinManager(幫助文檔有相關說明)。
Taglist插件本身就提供了對WinManager的支持,不需要我們去修改它。這里,我們就用WinManager來管理文件瀏覽器netrw和標簽瀏覽器Taglist。netrw是標準的vim插件, 已經隨vim一起安裝進系統里了, 不需要我們自行下載安裝。
安裝WinManager

lingd@ubuntu:~$ vim-addons install winmanager

配置WinManager
在vim配置文件/home/user/.vimrc中加入如下的配置:


    "-- WinManager setting --
    let g:winManagerWindowLayout='FileExplorer|TagList' " 設置我們要管理的插件
    "let g:persistentBehaviour=0 " 如果所有編輯文件都關閉了,退出vim
    nmap wm :WMToggle<cr> 

常用命令

:WMToggle 打開/關閉WinManage,不過我們在配置文件.vimrc中做了快捷鍵映射,所以直接按wm就可以打開/關閉WinManage
文件瀏覽器命令(在文件瀏覽器窗口中使用)
<enter>或雙擊  如果光標下是目錄, 則進入該目錄; 如果光標下文件, 則打開該文件
<tab>   如果光標下是目錄, 則進入該目錄; 如果光標下文件, 則在新窗口打開該文件
<F5> 刷新列表
-  返回上一層目錄
c  使瀏覽目錄成為vim當前工作目錄
d  創建目錄
D  刪除當前光標下的目錄或文件
i  切換顯示方式
R  文件或目錄重命名
s  選擇排序方式
r  反向排序列表
x  定制瀏覽方式, 使用你指定的程序打開該文件
winmanager幫助文檔
:help winmanager
netrw幫助文檔
:help netrw
7.Cscope

Cscope是一個類似于ctags的工具,不過其功能比ctags強大很多。
安裝Cscope
lingd@ubuntu:~$ sudo apt-get install cscope
在vim配置文件/home/user/.vimrc中加入如下的配置:

    "-- 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
    map <F4> :cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
    imap <F4> <ESC>:cs add ./cscope.out .<CR><CR><CR> :cs reset<CR>
    " 將:cs find c等Cscope查找命令映射為<C-_>c等快捷鍵(按法是先按Ctrl+Shift+-, 然后很快再按下c)
    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>

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  查找包含這個文件的文件

用法:
<1>、為源碼建立一個cscope數據庫

lingd@ubuntu:~/arm/linux-2.6.28.7$ cscope -Rbq
lingd@ubuntu:~/arm/linux-2.6.28.7$ 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-_>c等快捷鍵(按法是先按Ctrl+Shift+-, 然后很快按下c)

幫助文檔

:help if_cscop

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

8.vim常用快捷鍵

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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容