一、大飽眼福
看了效果圖,肯定有人說, 這都有啥功能?就花哨?
告訴你,你說花哨就錯了,開玩笑?我們程序猿可都是實打實的人,說謊都不會,咋會忽悠人呢。
下面我來告訴你,這都有些什么功能:
- 文件索引功能,也就是可以知道這個文件里面有哪些函數,變量,宏定義,結構體,類等等
- 文件目錄快速瀏覽,可以通過目錄窗口來打開自己想要打開的文件,創建刪除目錄等功能
- 自動補全文件功能,特別是include的時候,根據路徑自動補全,選擇你想要的文件
- 自動補全類成員,函數,命名空間等
- 語法高亮,提供類型關鍵字,函數等高亮,當然函數我覺得沒必要,所以沒設置
- c/h文件隨意切換,當你在coding的時候,肯定需要來回在.h/hpp和.c/cpp之間來回切換,沒問題,可以的。
- quickfix功能,編譯出錯,你肯定想根據錯誤找到文件對應的地方修改吧,沒問題,可以的。
- 基本編輯功能不用說了
下面我們來說怎么整合這些功能,有的是vim自帶的,有的是需要插件的。
二.准備工作
1.准備文件/路徑
確認文件/路徑是否存在,文中說的一些路徑, 比如:
~/.vim/plugin ~/.vim/doc ~/.vim/syntax
如果沒有,請新建。
2.預定義
文中說到的.vimrc文件都是指 ~/.vimrc
三.正式起航
1.vim編程常用命令
% 跳轉到配對的括號去 [[ 跳轉到代碼塊的開頭去(但要求代碼塊中'{'必須單獨占一行) gD 跳轉到局部變量的定義處 '' 跳轉到光標上次停靠的地方, 是兩個', 而不是一個" mx 設置書簽,x只能是a-z的26個字母 `x 跳轉到書簽處("`"是1左邊的鍵) > 增加縮進,"x>"表示增加以下x行的縮進 < 減少縮進,"x<"表示減少以下x行的縮進
2.語法高亮
寫程序沒有語法高亮將是一件多么痛苦的事情啊,一片黑,就像一直都在跑屍一樣,幸虧vim 提供了語法高亮功能, 在上面的圖片中大家也可以看到那些注釋, 關鍵字, 字符串等, 都用不同顏色顯示出來了, 要做到這樣, 首先要在你的 ~/.vimrc 文件中增加下面幾句話:
syntax enable
syntax on
再重新啟動vim, 並打開一個c程序文件, 是不是覺得眼前突然色彩繽紛了起來...
如果你不喜歡這個配色方案你可以選擇一個你滿意的配色方案, 然后在~/.vimrc文件中增加下面加上colorscheme xxx,如這句:
colorscheme desert
desert表示的就是一種配色方案, 在 vim.org 上跟你一樣的人很多, 他們做了各種各樣的顏色主題, 你可以下載下來一個一個的試, 多地可以看到你眼花. 如果這樣你還不滿意(你還真是XXXX), 沒關系, vim的作者早想到會有你這種人了, 你可以創建你自己的顏色主題, 把下面的這篇文檔好好學習一些一下吧:
:help syntax.txt
更炫的語法高亮:
你可能會發現很多東西沒有高亮起來, 比如運算符號, 各種括號, 函數名, 自定義類型等
主要的思路是新建一個語法文件, 在文件中定義你要高亮的東東, 想高亮什么就高亮什么, 用vim就是這么自信. 所謂的語法文件就是vim用來高亮各種源文件的一個腳本, vim靠這個腳本的描述來使文件中的不同文本顯示不同的顏色, 比如C語言的語法文件放在類似於這樣的一個路徑中:
/usr/share/vim/vim64/syntax/c.vim
其他語言的語法文件也可以在這個路徑中找到, 你的也許不在這個路徑中, 不管它, 在你自己的HOME下新建一個語法文件, 新建一個空文件:
~/.vim/syntax/c.vim
在其中加入
"======================================================== " Highlight All Function "======================================================== syn match cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>[^()]*)("me=e-2 syn match cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>/s*("me=e-1 hi cFunction gui=NONE guifg=#B5A1FF "======================================================== " Highlight All Math Operator "======================================================== " C math operators syn match cMathOperator display "[-+/*/%=]" " C pointer operators syn match cPointerOperator display "->/|/." " C logical operators - boolean results syn match cLogicalOperator display "[!<>]=/=" syn match cLogicalOperator display "==" " C bit operators syn match cBinaryOperator display "/(&/||/|/^/|<</|>>/)=/=" syn match cBinaryOperator display "/~" syn match cBinaryOperatorError display "/~=" " More C logical operators - highlight in preference to binary syn match cLogicalOperator display "&&/|||" syn match cLogicalOperatorError display "/(&&/|||/)=" " Math Operator hi cMathOperator guifg=#3EFFE2 hi cPointerOperator guifg=#3EFFE2 hi cLogicalOperator guifg=#3EFFE2 hi cBinaryOperator guifg=#3EFFE2 hi cBinaryOperatorError guifg=#3EFFE2 hi cLogicalOperator guifg=#3EFFE2 hi cLogicalOperatorError guifg=#3EFFE2
再打開你的C文件看看, 是不是又明亮了許多. 還有一個壓箱底的要告訴你, 如果你自己增加了一個類型或者結構之類的, 怎么讓它也象"int", "void"這樣高亮起來呢? 再在上面的文件~/.vim/syntax/c.vim中添加下面的東東:
這樣你自己的類型My_Type_1, My_Type_2, My_Type_3就也可以向"int"一樣高亮起來了, 這樣的缺點是每增加一個類型, 就要手動在這里添加一下
"======================================================== " My Own DataType "======================================================== syn keyword cType My_Type_1 My_Type_2 My_Type_3
3.Ctags
Ctags讓你在程序中跳來跳去,簡直就是寶貝一樣的東西,Linux內核源碼都提供了"make tags"這個選項,下面讓我們來了解tags這個文件。
tags文件是由ctags程序產生的一個索引文件, ctags程序其是叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 並且比它功能強大, 是大多數Linux發行版上默認的ctags程序. 那么tags文件是做什么用的呢? 如果你在讀程序時看了一個函數調用, 或者一個變量, 或者一個宏等等, 你想知道它們的定義在哪兒, 怎么辦呢? 用grep? 那會搜出很多不相干的地方. 現在流行用是的<C-]>, 誰用誰知道呀, 當光標在某個函數或變量上時, 按下"Ctrl+]", 光標會自動跳轉到其定義處, 夠厲害吧, 你不用再羡慕Visual Studio的程序員了,爽翻天~
你現在先別急着去按<C-]>,因為電腦默認是沒ctags程序的,需要你自己去安裝,ctags的網站是http://ctags.sourceforge.net,需要在上面手動下載,然后安裝,我下的是5.8版本,那就以5.8為例:
$tar -xzvf ctags-5.8.tar.gz $cd ctags-5.8 $./configure $make $make install //需要root權限
然后去你的源碼目錄, 如果你的源碼是多層的目錄, 就去最上層的目錄, 在該目錄下運行命令: ctags -R,如:
$cd /home/styuan/ctags-5.8 $ctags -R
此時在/home/styuan/ctags-5.8目錄下會生成一個 tags 文件, 現在用vim打開/home/styuan/ctags-5.8/main.c
$ vim /home/styuan/ctags-5.8/main.c
再在vim中運行命令:
:set tags=/home/styuan/ctags-5.8/tags
該命令將tags文件加入到vim中來, 你也可以將這句話放到~/.vimrc中去, 如果你經常在這個工程編程的話.
下面要開始真刀實槍的開干了, 如下圖, 將光標放在createTagsForEntry()函數上
此時按下<C-]>, 光標會自動跳到createTagsForEntry()函數的定義處, 見下圖:
如果此時你還想再跳回剛才的位置, 你還可以按<C-T>, 這樣又跳回到createTagsForEntry()函數被調用的地方了, 變量, 結構, 宏, 等等, 都可以的, 趕快試試吧.....
不過還有一個小瑕疵, 你修改程序后, 比如增加了函數定義, 刪除了變量定義, tags文件不能自動rebuild, 你必須手動再運行一下命令:
$ ctags -R
4.TagList,高效閱讀代碼
下載地址http://sourceforge.net/projects/vim-taglist/files/vim-taglist/
解壓taglist_45.zip,可以看到有兩個目錄doc和plugin,結構如下
taglist_45 | |-------- doc | \-------- taglist.txt | \-------- plugin \---------- taglist.vim
執行下列shell命令,即安裝完成
cp doc/taglist.txt ~/.vim/doc/ cp plugin/taglist.vim ~/.vim/plugin/
使用方法:
在源碼目錄下,執行ctags -R對各目錄遞歸創建生成tags文件
用Vim打開源碼文件,以命令模式執行Tlist,即可啟用Taglist插件,<F1>可以查看taglist的幫助信息
同時在.vimrc中配置taglist
" " taglist " let Tlist_Show_One_File=1 "只顯示當前文件的tags let Tlist_WinWidth=40 "設置taglist寬度 let Tlist_Exit_OnlyWindow=1 "tagList窗口是最后一個窗口,則退出Vim let Tlist_Use_Right_Window=1 "在Vim窗口右側顯示taglist窗口
5.WinManager 文件瀏覽器和窗口管理器
下載地址:http://www.vim.org/scripts/script.php?script_id=95
解壓后得到兩個文件夾plugin和doc,將他們拷貝到~/.vim下面的相應目錄,如taglist的安裝
修改.vimrc文件
"winmanager設置 "整合taglist窗口 let g:winManagerWindowLayout = 'FileExplorer|TagList' "設置快捷鍵,wm呼出 nmap wm :WMToggle<cr>
在vim中使用wm鍵即可呼出窗口,上面的例子中已經在使用了,其中左上角為winmanager窗口,左下角為taglist窗口。
6.QuickFix 窗口
在第一張圖中有quickfix窗口,在make的時候,可能會出現錯誤,並且讓錯誤定位到相應文件,這就需要quickfix出場了,例如故意在xxx.c中每一行加一個逗號,然后
:make
顯然編譯會報很多錯誤, 當編譯結束並退出到源碼界面時, 剛才編譯器報的錯誤都已經看不到了, 但是我們可以用QuickFix窗口再將錯誤信息找出來, 用下面的命令調出QuickFix窗口:
:cw
當光標移動到相應的位置,按回車,還會跳到錯誤文件對應的地方哦,是不是很爽~同時還可以跳轉:
:cn // 切換到下一個結果 :cp // 切換到上一個結果
7.c/h文件間相互切換
作為一個C程序員, 日常Coding時在源文件與頭文件間進行切換是再平常不過的事了, 直接用vim打開其源/頭文件其實也不是什么麻煩事, 但是只用一個按鍵就切換過來了, 這是多么貼心的功能啊....
插件名:A
下載地址:http://www.vim.org/scripts/script.php?script_id=31
下載好了之后,將a.vim放到 ~/.vim/plugin 文件夾中就相當於安裝好了
:A 在新Buffer中切換到c/h文件 :AS 橫向分割窗口並打開c/h文件 :AV 縱向分割窗口並打開c/h文件 :AT 新建一個標簽頁並打開c/h文件
8.自動補全之AutoComplPop
AutoComplPop支持代碼(普通變量函數)的自動彈出
下載地址:http://www.vim.org/scripts/script.php?script_id=1879
同其他腳本插件的安裝方法一致,將解壓后的文件拷貝到~/.vim/ 下的相應目錄里:
autoload/* -> ~/.vim/autoload/
doc/* -> ~/.vim/doc/
plugin/* -> ~/.vim/plugin/
重新打開vim即可使用。添加help文件:helptags ~/.vim/doc/即可(打開幫助文件:h(elp) autocomplpop)效果圖如下:
9.c++代碼的自動補全
插件:OmniCppComplete,支持類的 . , ->, :: 操作符的自動補全
下載地址:http://www.vim.org/scripts/script.php?script_id=1520
同其他腳本插件的安裝方法一致,將解壓后的文件拷貝到~/.vim/ 下的相應目錄里:
autoload/* -> ~/.vim/autoload/
doc/* -> ~/.vim/doc/
after/* -> ~/.vim/after/
同時在.vimrc中增加相應配置
"omnicppcomplete配置 filetype plugin indent on set completeopt=menu,menuone "打開.提示 let OmniCpp_MayCompleteDot=1 "打開->提示 let OmniCpp_MayCompleteArrow=1 "打開::提示 let OmniCpp_MayCompleteScope=1 "打開namespace let OmniCpp_NamespaceSearch=1 "打開全局搜索 let OmniCpp_GlobalScopeSearch=1 "默認命名空間為std let OmniCpp_DefaultNamespace=["std"] "打開函數提示function let OmniCpp_ShowPrototypeInAbbr=1 "自動定位到第二個 let OmniCpp_SelectFirstItem = 2 "設置生成std tag的快捷鍵為tag map tag :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q <CR>
當在vim中敲tag后會生成相應的tags,然后set tags=xxx.tags即可。
注:ctags -R --c++-kinds=+p --fields=+iaS --extra=+q表示生成tags,是一個shell命令,所以綁定按鍵的時候要使用map tag :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q <CR>,表示在vim中按下tag命令,執行相應shell命令,之后同樣需要設置tags:set tags=xxx.tags,如果覺得每次設置不方便,並且常用目錄不會改變,也可以寫在.vimrc
set tags+=/home/xxx/tags
10.其他設置
"設置行號 set number "自動縮進 set autoindent set cindent "縮進寬度設置 set tabstop=4 set softtabstop=4 set shiftwidth=4 set expandtab "set noexpandtab "對齊風格 set cino=g0,:0
OK,大功告成,當然,整合之后,窗口比較多,所以附上vim常用窗口操作
四、vim多窗口使用技巧
1、打開多個窗口
打開多個窗口的命令以下幾個:
橫向切割窗口
:new+窗口名(保存后就是文件名)
:split+窗口名,也可以簡寫為:sp+窗口名
縱向切割窗口名
:vsplit+窗口名,也可以簡寫為:vsp+窗口名
2、關閉多窗口
可以用:q!,也可以使用:close,最后一個窗口不能使用close關閉。使用close只是暫時關閉窗口,其內容還在緩存中,只有使用q!、w!或x才能真能退出。
:tabc 關閉當前窗口
:tabo 關閉所有窗口
3、窗口切換
:ctrl+w+j/k,通過j/k可以上下切換,或者:ctrl+w加上下左右鍵,還可以通過快速雙擊ctrl+w依次切換窗口。
4、窗口大小調整
縱向調整
:ctrl+w + 縱向擴大(行數增加)
:ctrl+w - 縱向縮小 (行數減少)
:res(ize) num 例如::res 5,顯示行數調整為5行
:res(ize)+num 把當前窗口高度增加num行
:res(ize)-num 把當前窗口高度減少num行
橫向調整
:vertical res(ize) num 指定當前窗口為num列
:vertical res(ize)+num 把當前窗口增加num列
:vertical res(ize)-num 把當前窗口減少num列
5、給窗口重命名
:f file
6、vi打開多文件
vi a b c
:n 跳至下一個文件,也可以直接指定要跳的文件,如:n c,可以直接跳到c文件
:e# 回到剛才編輯的文件
7、文件瀏覽
:Ex 開啟目錄瀏覽器,可以瀏覽當前目錄下的所有文件,並可以選擇
:Sex 水平分割當前窗口,並在一個窗口中開啟目錄瀏覽器
:ls 顯示當前buffer情況
8、vi與shell切換
:shell 可以在不關閉vi的情況下切換到shell命令行
:exit 從shell回到vi