vim 配置成IDE

我的vim IDE界面:
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 
1、安裝Vim和Vim基本插件
首先安裝好Vim和Vim的基本插件。這些使用apt-get安裝即可:
lingd@ubuntu:~/arm$sudo apt-get install vim vim-scripts vim-doc
其中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強大的功能,其來源基本上就兩個地方:Vim插件以及Vim配置文件。
Vim本身的系統配置文件夾是在/usr/share/vim/和/etc/vim/兩個文件夾下。一般情況下,我們不會去改變這兩個文件夾下的配置文件,而是在用戶文件夾/home/user(其中,user爲用戶名,我的用戶名是lingd)下建立自己的配置文件。進入用戶文件夾(/home/user/)之後,用gedit新建一個名叫.vimrc的文件:
lingd@ubuntu:~/arm$ cd ~
lingd@ubuntu:~$ gedit .vimrc
注:使用gedit主要是爲了方便大段大段的文字粘貼!
然後把下面的文字拷貝進這個文件之後保存:

" 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、:!、:makeCTRL-] CTRL-^命令時進行;用 :bufferCTRL-OCTRL-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

注:配置文件中,以單個雙引號開頭的文字爲註釋。
保存文件之後,啓動Vim。此時,Vim已經是這種效果了(語法高亮挺漂亮的–這個是由vim-scripts中的插件支持的):

3、ctags安裝與配置
ctags可以建立源碼樹的標籤索引(標籤就是一個標識符被定義的地方,如函數定義),使程序員在編程時能迅速定位函數、變量、宏定義等位置去查看原形
以下是在ubuntu下ctags的下載安裝和配置過程:
下載並安裝ctags,終端輸入命令
lingd@ubuntu:~/arm$ sudo apt-get install ctags
建立源碼索引,比如我經常需要查閱Linux的內核代碼,而這些代碼放在/home/lingd/arm/linux-2.6.24.7目錄下
那麼在終端進入到該目錄後,輸入命令ctags -R *,你會發現多了一個tags文件,這個就是索引文件
lingd@ubuntu:~/arm$ cd linux-2.6.24.7
lingd@ubuntu:~/arm/linux-2.6.24.7$ ls
arch     crypto         include  kernel       mm              samples   usr
block    Documentation  init     lib          net             scripts
COPYING  drivers        ipc      MAINTAINERS  README          security
CREDITS  fs             Kbuild   Makefile     REPORTING-BUGS  sound
lingd@ubuntu:~/arm/linux-2.6.24.7$ ctags -R *
lingd@ubuntu:~/arm/linux-2.6.24.7$ ls
arch     crypto         include  kernel       mm              samples   tags
block    Documentation  init     lib          net             scripts   usr
COPYING  drivers        ipc      MAINTAINERS  README          security
CREDITS  fs             Kbuild   Makefile     REPORTING-BUGS  sound
向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 查找當前文件和任何包含文件中的單詞並在預覽窗口中顯示匹配,在使用沒有標籤文件的庫函數時十分有用。 
 
最簡單的使用方法舉例
用vi在任意目錄寫一個Test.c文件,內容如下:

int main(void) { printf("Hello World!\n"); return 0; }

寫好後末行模式輸入w保存好(不要退出vi),按Esc回到指令模式,把光標停留在printf上
然後按 Ctrl+W + ],vi會自動跳到Linux系統函數printf()處,這時我們能查看printf()的原形
查看完了,按Ctrl+o(回到上一個標籤) 就回到原來的地方
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
4、管理vim插件——vim-addons
通過vim-addons,我們可以管理vim插件。我們在sudo apt-get install vim vim-scripts vim-doc時,一般會自動安裝上vim-addons。若未安裝可通過sudo apt-get install vim-addon-manager手動安裝。安裝完成後,就可以用vim-addons管理vim插件了。
# 系統中已有的vim-scripts中包含的插件及其狀態:
lingd@ubuntu:~$ vim-addons status
# Name                     User Status  System Status
align                       removed       removed      
alternate                   removed       removed      
bufexplorer                 removed       removed      
calendar                    removed       removed      
closetag                    removed       removed      
colors sampler pack         removed       removed      
cvsmenu                     removed       removed      
debPlugin                   removed       removed      
detectindent                removed       removed      
doxygen-toolkit             removed       removed      
editexisting                removed       removed      
enhanced-commentify         removed       removed      
gnupg                       removed       removed      
info                        removed       removed      
justify                     removed       removed      
lbdbq                       removed       removed      
markdown-syntax             removed       removed      
matchit                     removed       removed      
minibufexplorer             installed     removed      
nerd-commenter              removed       removed      
omnicppcomplete             installed     removed      
po                          removed       removed      
project                     installed     removed      
python-indent               removed       removed      
secure-modelines            removed       removed      
snippetsEmu                 removed       removed      
sokoban                     removed       removed      
supertab                    removed       removed      
surround                    removed       removed      
taglist                     installed     removed      
tetris                      removed       removed      
utl                         removed       removed      
vcscommand                  removed       removed      
vimplate                    removed       removed      
whatdomain                  removed       removed      
winmanager                  removed       removed      
xmledit                     removed       removed    
上面我們介紹瞭如何獨立於系統配置文件之外,建立自己的Vim配置文件。當我們自己下載安裝Vim插件的時候,也可以另外建立目錄,放置我們自己的插件。這個目錄一般爲/home/user/.vim,另外還需要建立一個插件子目錄,一個插件文檔子目錄,以上的可以進入/home/user目錄下通過下面的命令執行:
lingd@ubuntu:~$ mkdir .vim
lingd@ubuntu:~$ cd .vim
lingd@ubuntu:~/.vim$ mkdir plugin
lingd@ubuntu:~/.vim$ mkdir doc 
# vim官方插件的安裝,xxxx是要安裝的插件名,以status中顯示的名稱爲準。安裝插件xxxx時使用以下命令(前提是在目錄/home/user/.vim/下建立好了plugin和doc兩個文件夾)
vim-addons install xxxx
 關於vim-addons命令的詳細用法,可以通過“man vim-addons”查看其幫助文檔

5、vim自動補全——OmniCppComplete
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改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 
注意:在自動補全的點,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
 
6、提示函數原型echofunc
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
其他插件說明詳見echofunc.vim
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客

 如果你在編譯vim時加上了"+balloon_eval"特性,那麼當你把鼠標放在函數名上的時候會有一個tip窗口彈出, 該窗口中也會有函數的聲明

7、標籤瀏覽器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
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客

 8、文件瀏覽器和緩衝區管理器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
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 9、buffer管理器MiniBufferExplorer
MiniBufferExplorer用於瀏覽和管理buffer,如果只打開一個文件,是不會顯示在屏幕上的,而打開多個文件之後,會自動出現在屏幕上。vim也有自帶的buffer管理工具,不過只有:ls, :bnext, :bdelete 等的命令, 既不好用, 又不直觀.
關於vim緩衝區(buffer)和窗口的概念(詳見:help windows)
"緩衝區" 是一塊內存區域,裏面存儲着正在編輯的文件。如果沒有把緩衝區裏的文件存盤,那麼原始文件不會被更改。
"窗口" 被用來查看緩衝區裏的內容。你可以用多個窗口觀察同一個緩衝區,也可以用多個窗口觀察不同的緩衝區。
"屏幕" Vim 所用的整個工作區域,可以是一個終端模擬窗口,也被叫做 "Vim 窗口"。一個屏幕包含一個或多個窗口,被狀態行和屏幕底部的命令行分割。
        +-------------------------------+
屏幕    | 窗口 1        | 窗口 2        |
        |               |               |
        |               |               |
        |=== 狀態行  ===|==== 狀態行 ===|
        | 窗口 3                        |
        |                               |
        |                               |
        |========== 狀態行 =============|
        |命令行                         |
        +-------------------------------+
安裝MiniBufferExplorer
lingd@ubuntu:~$ vim-addons install minibufexplorer
配置MiniBufferExplorer
在vim配置文件/home/user/.vimrc中加入如下的配置:

" -- MiniBufferExplorer -- let g:miniBufExplMapWindowNavVim = 1 " 按下Ctrl+h/j/k/l,可以切換到當前窗口的上下左右窗口 let g:miniBufExplMapWindowNavArrows = 1 " 按下Ctrl+箭頭,可以切換到當前窗口的上下左右窗口 let g:miniBufExplMapCTabSwitchBufs = 1 " 啓用以下兩個功能:Ctrl+tab移到下一個buffer並在當前窗口打開;Ctrl+Shift+tab移到上一個buffer並在當前窗口打開;ubuntu好像不支持 "let g:miniBufExplMapCTabSwitchWindows = 1 " 啓用以下兩個功能:Ctrl+tab移到下一個窗口;Ctrl+Shift+tab移到上一個窗口;ubuntu好像不支持 let g:miniBufExplModSelTarget = 1 " 不要在不可編輯內容的窗口(如TagList窗口)中打開選中的buffer

常用命令
<Tab>  移到上一個buffer
<Shift-Tab> 移到下一個buffer
<Enter>  打開光標所在的buffer
d   刪除光標所在的buffer
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 10、代碼摺疊fold
摺疊用於把緩衝區內某一範圍內的文本行顯示爲屏幕上的一行。就像一張紙,要它縮短
些,可以把它摺疊起來:
 +------------------------+
 | 行 1                   |
 | 行 2                   |
 | 行 3                   |
 |_______________________ |
 \                        \
  \________________________\
  / 被摺疊的行             /
 /________________________/
 | 行 12                  |
 | 行 13                  |
 | 行 14                  |
 +------------------------+
那些文本仍然在緩衝區內而沒有改變。受到摺疊影響的只是文本行顯示的方式。
摺疊的好處是,通過把多行的一節摺疊成帶有摺疊提示的一行,會使你更好地瞭解對文本
的宏觀結構。
摺疊方式foldmethod
vim提供以下6種方法來選定摺疊方式:
manual 手工定義摺疊
indent 更多的縮進表示更高級別的摺疊
expr 用表達式來定義摺疊
syntax 用語法高亮來定義摺疊
diff 對沒有更改的文本進行摺疊
marker 對文中的標誌摺疊
摺疊級別foldlevel
'foldlevel' 是個數值選項:數字越大則打開的摺疊更多。
當 'foldlevel' 爲 0 時,所有的摺疊關閉。
當 'foldlevel' 爲正數時,一些摺疊關閉。
當 'foldlevel' 很大時,所有的摺疊打開。
摺疊欄foldcolumn
'foldcolumn' 是個數字,它設定了在窗口的邊上表示摺疊的欄的寬度。當爲0時,沒有摺疊欄。最大是12。
一個打開的摺疊由一欄來表示,頂端是 '-',其下方是 '|'。這欄在摺疊結束的地方結束。當摺疊嵌套時,嵌套的摺疊出現在被包含的摺疊右方一個字符位置。
一個關閉的摺疊由 '+' 表示。
當摺疊欄太窄而不能顯示所有摺疊時,顯示一數字來表示嵌套的級別。
在摺疊欄點擊鼠標,可以打開和關閉摺疊:
- 點擊 '+' 打開在這行的關閉摺疊
- 在任何其他非空字符上點擊,關閉這行上的打開摺疊
在vim配置文件/home/user/.vimrc中加入如下的配置:

"--fold setting-- set foldmethod=syntax " 用語法高亮來定義摺疊 set foldlevel=100 " 啓動vim時不要自動摺疊代碼 set foldcolumn=5 " 設置摺疊欄寬度

常用命令
za  打開/關閉在光標下的摺疊
zA  循環地打開/關閉光標下的摺疊
zo  打開 (open) 在光標下的摺疊
zO  循環打開 (Open) 光標下的摺疊
zc  關閉 (close) 在光標下的摺疊
zC  循環關閉 (Close) 在光標下的所有摺疊
zM  關閉所有摺疊
zR  打開所有的摺疊
幫助文檔
:help usr_28.txt
:help fold.txt
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 
11、項目目錄數管理器Project
Project插件是用來顯示項目的目錄樹的,這個目錄樹是默認保存在~/.vimprojects文件中。
安裝Project
lingd@ubuntu:~$ vim-addons install project 
Project目錄樹可以通過下面的步驟生成:
1) 打開vim在命令模式下輸入 :Project,在屏幕的最左邊就會出現一個project框。不過因爲沒有初始化暫時是空的
2)在命令模式下(不是插入模式)輸入\C (大寫的C),會出現下面這些信息:
Enter the Name of the Entry: xxxx (輸入項目名稱)
Enter the Absolute Directory to Load: /xxx/xxx/xxx (輸入項目根目錄的絕對路徑)
Enter the CD parameter: . (“.”爲當前目錄)或者和項目根目錄一致
Enter the File Filter: *.* (符合條件的源文件,可以是*.cpp/*.h等)
PS:項目目錄可以嵌套。而且更改之後在~/.vimprojects文件中就能看到內容,你可以手動進行更改。
 
12、quickfix命令集
通過quickfix命令集,你可在 Vim 內編譯程序並直接跳轉到出錯位置進行修正。你可以接着重新編譯並做修正,直到不再出錯爲止。
在vim配置文件/home/user/.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>

幫助文檔
:help usr_30
:help quickfix
下面的命令運行 "make" (包括你所給出的參數) 程序並捕捉其運行結果: >
 :make {arguments}
如果編譯時出現錯誤,按 <Enter>,回到vim界面,看不到出錯信息了!這時,可以運行以下命令
:cw[indow]
打開quickfix窗口來查看出錯信息,它會自動跳到第一處出錯的地方。然後,你可以雙擊出錯某一條出錯信息,vim就會自動跳轉到相應的出錯位置
:cn[ext]  光標移到下一個錯誤所在的行
:cp[revious] 光標移到上一個錯誤所在的行
:cfirst  到第一處錯誤
:clast  到最後一處錯誤
:cc   空間不夠時,Vim 會縮短出錯信息。如果你想查看詳細信息,可以使用此命令
:cl[ist] 列出所有出錯信息的概覽(只有那些含有文件名或行數的錯誤信息會被顯示,需要查看那些並不含文件名或行數的信息可用“:cl[ist]!”命令)
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 13、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 cCscope查找命令映射爲<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>
一步步將vim改造成C/C++開發環境(IDE) - Nealson - Figthing的博客
 14、vim常用快捷鍵
%  跳轉到配對的括號去
[[  跳轉到當前或者上一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨佔一行)
][  跳轉到當前代碼塊(函數定義、類定義等)的結尾去(但要求代碼塊中'{'必須單獨佔一行)
]]  跳轉到下一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨佔一行)
[/  跳到註釋開頭(只對/* */註釋有效)
]/ 跳到註釋結尾(只對/* */註釋有效)
gD  跳轉到當前文件內標識符首次出現的位置,可用於跳轉到全部變量的定義處;查找局部變量時,要是多個函數中定義了該局部變量,使用gD進行查找,找到的變量定義可能不是你需要的
gd 跳轉到當前函數內標識符首次出現的位置,可用於跳轉到局部變量的定義處
''  跳轉到光標上次停靠的地方, 是兩個', 而不是一個"
mx  設置書籤,x只能是a-z的26個字母
`x  跳轉到書籤處("`"是1左邊的鍵)
>  增加縮進,"x>"表示增加以下x行的縮進
<  減少縮進,"x<"表示減少以下x行的縮進
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章