Vim本質上只是一個編輯器。但只要配合一些適當的外掛程式,vim也能變成一個全功能的IDE。筆者使用vim已經有挺長一段時間了,經過反覆的實驗,配置了一個高效的PHP開發環境,實為居家旅行、謀財害命、殺人越貨必備之良品。
安裝Vim GVIM
普通方式安裝
sudo apt-get install vim
sudo apt-get install vim-gtk vim-doc cscope
編譯安裝7.3穩定版:www.kukaka.org/home/showonews/344
編譯安裝7.3最新版:www.kukaka.org/home/showonews/370
卸載Vim GVIM
普通安裝方式卸載
sudo apt-get remove --purge vim (--purge 是完全刪除,會連設定檔一起刪除)
sudo apt-get remove --purge vim-gtk vim-doc cscope
sudo apt-get clean
編譯安裝方式卸載
進入之前編譯安裝時的目錄:make uninstall
開始配置vim
Linux 下 vim 預設設定檔 /etc/vim/vimrc
使用者預設設定檔 ~/.vimrc
如果想一次配置,所有使用者都能使用,那就修改 /etc/vim/vimrc,如果只想目前使用者可以使用,則修改 ~/.vimrc
針對開發配置
au FileType php,c,java,javascript,html,htm,smarty call SetOption() function! SetOption() set expandtab " 使用空格代替tab set shiftwidth=4 " 設定 << 和 >> 命令移動時的寬度為 4 set tabstop=4 " 用4個空格代替1個tab set sts=4 " 設定softtabstop 為 4,輸入tab後就跳了4格. set cindent " C語言方式縮排 set smartindent " 智慧縮排 set autoindent " 自動縮排 set smarttab " 只在行首用tab,其他地方的tab都用空格代替 set showmatch " 在輸入括弧時游標會短暫地跳到與之相匹配的括弧處 " set fdm=indent " 程式碼摺疊功能 set lbr set tw=500 set wrap " 自動換行 endfunction
個人化定製標籤
Gvim 標籤定製
set guitablabel=%{ShortTabLabel()} function ShortTabLabel () let bufnrlist = tabpagebuflist (v:lnum) let label = bufname (bufnrlist[tabpagewinnr (v:lnum) -1]) let filename = fnamemodify (label, ':t') return filename endfunction
Vim 標籤定製
set tabline=%!MyTabLine() function MyTabLine() let s = '' for i in range(tabpagenr('$')) " 選擇高亮 if i + 1 == tabpagenr() let s .= '%#TabLineSel#' else let s .= '%#TabLine#' endif " 設定標籤頁號 (用於滑鼠點擊) let s .= '%' . (i + 1) . 'T' " MyTabLabel() 提供完整路徑標籤 MyShortTabLabel 提供檔案名稱標籤 let s .= ' %{MyShortTabLabel(' . (i + 1) . ')} ' endfor " 最後一個標籤頁之後用 TabLineFill 填充並複位標籤頁號 let s .= '%#TabLineFill#%T' " 靠右對齊用於關閉當前標籤頁的標籤 if tabpagenr('$') > 1 let s .= '%=%#TabLine#%999Xclose' endif return s endfunction " 檔案名稱標籤 function MyShortTabLabel(n) let buflist = tabpagebuflist(a:n) let label = bufname (buflist[tabpagewinnr (a:n) -1]) let filename = fnamemodify (label, ':t') return filename endfunction "完整路徑標籤 function MyTabLabel(n) let buflist = tabpagebuflist(a:n) let winnr = tabpagewinnr(a:n) return bufname(buflist[winnr - 1]) endfunction " vim 標籤樣式 " TabLineFill tab pages line, where there are no labels hi TabLineFill term=none hi TabLineFill ctermfg=DarkGrey hi TabLineFill guifg=#777777 " TabLineSel tab pages line, active tab page label hi TabLineSel term=inverse hi TabLineSel cterm=none ctermfg=yellow ctermbg=Black hi TabLineSel gui=none guifg=yellow guibg=Black " Develop editing options au FileType vim setl expandtab au FileType vim setl shiftwidth=2 au FileType vim setl tabstop=2個人化定製狀態列
Statusline
" 顯示狀態列(預設值為 1,無法顯示狀態列) set laststatus=2 " Format the statusline set statusline=\ %F%m%r%h\ %w\ \ CWD:\ %r%{CurDir()}E5%h\ \ \ Line:\ %l/%L:%c function! CurDir() let curdir = substitute(getcwd(), '/Users/amir/', "~/", "g") return curdir endfunction用NERDTree實現目錄和檔案導航
在進行PHP應用開發時,同時編輯多個檔案是很正常的事情。所以必須有一個方便的目錄導航工具,以便在目錄結構間快速切換,找到需要編輯的檔案。
vim中提供該類功能的外掛程式很多,比較知名的有project、winmanager等。但筆者個人認為最好用的還是The NERD Tree這個外掛程式。NERDTree不但可以顯示完整的分類樹結構,還可以將任何一個目錄設定為根目錄。並且提供了目錄導航的書籤功能,可謂非常方便。
:http://www.vim.org/scripts/script.php?script_id=1658
下載檔案:NERD_tree.zip
解壓縮時,要把壓縮包中的目錄結構完整的解壓縮到 ~/.vim/ 目錄中。完成後,應該分別找到 ~/.vim/doc/NERD_tree.txt 檔案和 ~/.vim/plugin/NERD_tree.vim 檔案。然後在vim中輸入命令: helptags ~/.vim/doc,將NERDTree的協助文檔添加到vim中。
現在,命令模式下輸入:NERDTreeToggle便可開啟或關閉NERDTree
注意:使用過程中,你可能會因為刪除一個檔案夾,而沒有刪除這個檔案夾所綁定的標籤,出現以下錯誤
NERDTree: 1 invalid bookmarks w...
解決:開啟~/.vim/.NERDTreeBookmarks,刪除裡面無用的標籤即可。
用taglist實現代碼導航
解決了目錄和檔案導航問題,我們還要為代碼之間的跳轉提供輔助手段,taglist就是這樣一個外掛程式。taglist可以列出已開啟檔案中定義的類、函數、常量,甚至變數。
:http://www.vim.org/scripts/script.php?script_id=273
下載檔案:taglist_45.zip
壓縮包需要完整解壓縮到 ~/.vim/ 目錄,並且用:helptags ~/.vim/doc命令索引taglist外掛程式的協助文檔。
taglist外掛程式需要依賴ctags程式才能工作。目前常用的ctags版本是Exuberant Ctags。
安裝ctags
:http://ctags.sourceforge.net/
下載檔案:ctags-5.8.tar.gz
解壓ctags:tar -zxcf ctags-5.8.tar.gz
進入ctags:cd ctags-5.8
打上PHP補丁(否則按下ctrl+n,連基本的function include等函數都出不來):
wget http://svn.bitflux.ch/repos/public/misc/ctags-php5.patch
patch php.c ctags-php5.patch
編譯安裝:
./configure
make
sudo make install
經過這三步後就產生 /usr/local/bin/ctags
繼續回來修改~/.vim/plugin/taglist.vim
在 if !exists('loaded_taglist')上面加入
let Tlist_Ctags_Cmd="/usr/local/bin/ctags"
或加在~/.vim/.vimrc檔案,只要能讓vim開啟時載入的*.vim檔案即可
此時Ctags和Taglist已經結合起來,再用vim編輯php檔案, 執行 :TlistToggle 就會在右邊出現一個當前檔案的 類 函數 變數 等東西
還記得我們使用netbeans eclipse等大型開發工具的時候嗎,按著 ctrl + 滑鼠左鍵 點擊一個函數,就會跳轉到該函數定義處,他其實也是使用的tags跟蹤跳轉,只不過他們會自動去掃描源碼目錄,產生一個tags檔案(是否曾經為netbeans沒完沒了的掃描崩潰過?),而vim需要我們自己去產生這個tags。這個功能對代碼跟蹤非常有好處,下面我們就來實現他
在相應的源碼目錄運行ctags -R產生相應的tags檔案
cd ~/www/mysite
ctags -R *
開啟vim
:cd ~/www/mysite
:set tags=tags
現在,我們設定好了tags選項,接下來我們使用它,我們先來尋找一個名叫make_html的方法:
方法一:
:tag make_html
如果make_html方法的定義只存在一個檔案中你會看到VIM開啟了該檔案,並把游標定位到make_html方法所在行上。
如果make_html方法的定義存在多個檔案中,會提示:
找到 tag:1 / 14 或更多
這時我們可以列出保護這個方法的所有檔案
:tselect "顯示列表
這時會列出所有檔案,讓我們選擇一個檔案開啟
# pri kind tag 檔案
> 1 F C f make_html function/my_function.php
2 F f make_html xxx/xxx.php
鍵入數字和斷行符號(empty cacels) :
根據提示輸入我們想查看的檔案對應的序號然後斷行符號就可以了。
:tn "顯示後一個tag到的PHP檔案
:tp "顯示前一個tag到的PHP檔案
:tags "顯示標籤棧
我們還可以把滑鼠停留在想要跳轉的 類 函數 變數 上面,然後按 ctrl + ] ,回到原來位置是 ctrl + t
方法二:
把滑鼠停留在 make_html 上面,然後按ctrl+],怎麼樣,和直接輸入:tag make_html 是一模一樣的吧
現在,我們已經跳轉到make_html函數的定義處,看到了函數的詳細定義,明確知道如何使用這個函數了,那怎麼回到原來的位置呢,答案是按 ctrl+o 返回。
小技巧:
細心的朋友可能會發現,作為一個強大的IDE,還應該解決以下幾個問題:
1.左邊分類樹結構不變。
2.代碼塊注釋,刪除注釋。
3.代碼塊縮排,刪除縮排。
解決問題:
1.一般情況下,我們會以標籤的方式開啟一個檔案(讓游標停留在一個要開啟的檔案上,按 t ),此時左邊沒有分類樹,輸入
:NERDTreeToggle開啟分類樹,此分類樹為建立的,和第一個檔案的分類樹結構不同,這不符合我們普通IDE的習慣,還記得我們用
Netbeans之類的編輯器嗎?左邊的目錄書結構一直沒變,其實是所有檔案分享權限設定一顆樹的原因,NERDTree也允許我們共用樹,命令是
:NERDTreeMirror,結合Tlist,我的捷徑定義如下:
map <F2>:NERDTreeToggle map <F3>:TlistToggle map <F4>t:NERDTreeMirror
現在,看看我寫代碼的習慣:
首先,開啟vi編輯器。
按 F2 開啟分類樹
把游標停留在需要建立標籤的檔案夾上, :Bookmark 收藏名。
以後只需要 開啟分類樹,Shift+B開啟收藏標籤,雙擊一下想開啟的標籤,再按一次Shift+B關閉收藏標籤。
滑鼠選中需要開啟的檔案,按 F4快速鍵 ,此時,vi會先執行 t (標籤方式開啟檔案),再執行:NERDTreeMirror共用第一棵樹,後面一串是為了保持之前開啟的檔案便簽還是顯示檔案名稱用的。
怎麼樣,效果和大型IDE差不多了吧。
2.代碼塊注釋,刪除注釋
注釋:ctrl+v 進入列編輯模式,向上或向下移動游標,把需要注釋的行的開頭標記起來,然後按大寫的I,再插入注釋符,比如"//",再按Esc,就會全部注釋了。
刪除:ctrl+v 進入列編輯模式,選中注釋部分,然後按d,就會刪除注釋符號。
3.代碼塊縮排,刪除縮排。
縮排:選擇需要縮排的程式碼(鍵盤滑鼠都可以,選中了就行),>(shift+.)
刪除:選擇需要縮排的程式碼(鍵盤滑鼠都可以,選中了就行),<(shift+,)
下面是我一直使用的設定檔,有興趣的朋友可以參考一下
.vimrc
下面兩個放在~/.vim/plugin/下
MY_keymap.vim 鍵盤對應
MY_taglist.vim taglist外掛程式配置