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
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行的縮進