我的vim IDE界面:
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、:!、: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
注:配置文件中,以單個雙引號開頭的文字為注釋。
保存文件之後,啟動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(回到上一個標簽) 就回到原來的地方
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必須知道可能補全的定義。比如說,在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時加上了"+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
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
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
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
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]!”命令)
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 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>
14、vim常用快捷鍵
% 跳轉到配對的括號去
[[ 跳轉到當前或者上一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨占一行)
][ 跳轉到當前代碼塊(函數定義、類定義等)的結尾去(但要求代碼塊中'{'必須單獨占一行)
]] 跳轉到下一代碼塊(函數定義、類定義等)的開頭去(但要求代碼塊中'{'必須單獨占一行)
[/ 跳到注釋開頭(只對/* */注釋有效)
]/ 跳到注釋結尾(只對/* */注釋有效)
gD 跳轉到當前文件內標識符首次出現的位置,可用於跳轉到全部變量的定義處;查找局部變量時,要是多個函數中定義了該局部變量,使用gD進行查找,找到的變量定義可能不是你需要的
gd 跳轉到當前函數內標識符首次出現的位置,可用於跳轉到局部變量的定義處
'' 跳轉到光標上次停靠的地方, 是兩個', 而不是一個"
mx 設置書簽,x只能是a-z的26個字母
`x 跳轉到書簽處("`"是1左邊的鍵)
> 增加縮進,"x>"表示增加以下x行的縮進
< 減少縮進,"x<"表示減少以下x行的縮進