轉載請務必在顯眼的位置註明原文地址
前言php
Source Insight(如下簡稱SO)的確是一款優秀的代碼查看和編輯軟件,可是它也有不少缺點:
俗話說得好,不要綁死在一棵樹上。筆者用了1年多SO後,下定決心尋找另一棵樹。通過一番搜索和總結以後,選擇了vim。
在SO的左邊有一個能顯示當前文件中的symbol的窗口,能夠鼠標點擊其來快速在代碼間跳轉(可是好像不能用鍵盤聚焦到這個窗口)。 Vim則可使用taglist插件來實現此功能。taglist不但支持鼠標點擊,還可使用鍵盤在tag間快速跳轉。 不過相對於SO來講,taglist沒有顯示結構體中的成員,也不顯示#if/#else/#endif等宏定義block。 不過這樣也讓taglist顯示的信息更簡單明瞭。taglist能夠根據當前的symbol跳轉,只須要在taglist中搜索,在按t/o/enter便可。taglist能夠同時顯示多個文件的tag,可是速度會下降。
SO的下方有一個預覽窗口,顯示主窗口光標下的Symbol。 Vim中也有提供預覽窗口,CTRL-W }則實現和SO同樣的功能 。能夠將此快捷鍵映射成其餘按鍵以減小輸入。
若是想作到SO這樣 隨着光標移動而自動更新 也不難,能夠參考Vim中文文檔 windows.txt中的預覽窗口一節 。或者也能夠參考 筆者的vimrc 中的版本,對原始的進行了小修改,使其在有taglist窗口的時候也能工做。
老實說,筆者不多用這個功能。在使用SO時,這個窗口一直都是被關閉的。這個窗口能顯示函數的調用或被調用關係,可能在梳理代碼調用關係時有必定做用。Vim自己沒有這個功能,可是 cscope帶有查看函數調用和被調用關係搜索(cs find c/d)。這個顯示的結果只有一級,而不會顯示遞歸調用 。
有一名爲 CCTree 的插件能夠提供相似於關係窗口的功能,因爲它使用cscope的數據庫,因此其準確與否徹底依賴於cscope的數據庫的準確性 。
SO中自動補全的功能基本夠用,不過當括號或者引號匹配出錯時,可能會使補全工做不正常。Vim自帶有的補全功能有:
CTRL+p 利用全部的Buffer中的字符串來提供補全列表,能夠應付平常使用中大部分的補全需求。
全能(omni)補全 模式則適合代碼補全,Vim自身帶有的全能補全好像不能補全嵌套的結構體成員。筆者下載了 OmniCppComplete 插件,能夠 完美的支持多級結構體 。不過習慣了圖像界面菜單,可能會不適應Vim的補全菜單的操做方式(固然,你是能夠本身定義快捷鍵)。
更多關於Vim補全的內容能夠參考Vim文檔 insert.txt中的自動補全章節
F8常被用來在當前的代碼文件中跳轉,F7常被用來根據symbol來打開相應的文件 。這兩個功能均可以使用Vim的 tag/ptag命令來實現,且都有tab補全功能 。tag命令是在當前窗口中顯示tag,而ptag則是在預覽窗口中顯示tag。若是不習慣命令行方式,能夠考慮安裝 FuzzyFinder插件。此插件提供了模糊匹配tag的功能 ,不過不能限制其只在當前文件中匹配(能夠考慮跳轉到taglist窗口中搜索tag來模擬F8操做)。
SO中使用CTRL+=和CTRL+鼠標左鍵單擊symbol,就能夠跳轉到此symbol的定義處 ,這個功能經常使用來查看當前變量的真身。Vim也支持tag的跳轉:可使用CTRL+]和CTRL+鼠標左鍵在當前窗口顯示tag,也可使用CTRL+w }和CTRL+w ]新建[預覽]窗口顯示tag,C-T回到上一個tag 。注意:使用鼠標前,須要在 Vim中使用set mouse=a來啓用鼠標 。雖然SO能支持局部變量,可是因爲 tag文件中沒有局部變量信息,因此vim沒法支持 。另外SO能根據變量類型來跳轉,假設有以下代碼:FILE *file;SO中能夠點擊file而直接跳轉到FILE結構體定義,而Vim只會搜索能 匹配字符串 "file"的tag。純字符串匹配獲得的結果會特別多(參考筆者 這篇Linux流水帳 裏的第2條)。固然若是要查看FILE結構體定義有個比較簡單的竅門:命令模式輸入:FILE::,再使用tab鍵自動補全 下,再ENTER就能夠跳轉到定義FILE結構體的文件。另外SO中,使用鼠標單擊include的文件名,則會打開該文件,Vim也能 靠gf或者C-W f來實現 。
SO中的這個功能很是好用,在代碼間跳來跳去時,也能夠隨時跳回去。Vim中也不缺這個功能,能夠 使用C-O/C-I來回到前/後一個點 。不過二者的 跳轉方式有些差別 ,可能須要一點時間來適應。
另外 tag棧(C-]/C-T)也提供了一個函數間來回跳轉的好方法 。
編輯代碼時Vim中使用回車或者是o/O命令添加一行時會自動縮進(須要開啓cindent縮進模式)。調整代碼時,也可使用 <</>>來縮進(推薦列可視模式下使用)。另外Vim中還有提供"="命令,功能更增強大,再結合indent的話,則可無往不利 。關於在Vim中訪問外部程序的功能,能夠參見幫助文檔中的filter motion(:h filter),靈活使用此功能,定可事半功倍。
用慣了GUI的查找替換窗口,可能須要稍微學習一下Vim提供的命令模式。:%s/teh/the/g 將全部的teh替換成the,這個直接所有替換,不確認。:%s/teh/the/gc 將teh替換成the,並挨個確認。平常編碼中,絕大部分的替換工做均可以用這一句命令實現。若是想更深刻的瞭解Vim的替換功能,能夠閱讀相關文檔。
彈出窗口菜單,再按數字就能夠切換到對應打開的文件。SO中同時編輯多個文件時,使用ALT+W n能夠快速的在多個文件間切換。 Vim中則可使用ls/bn/bp/b等命令在打開的文件間切換 (注意:須要set hidden開啓緩存區隱藏)。ls能夠顯示全部緩存區,bp/bn跳轉到上/下一個緩存區,b 3跳轉到第3個緩衝區 。有這幾個命令基本夠用。若是想更加直觀的話,能夠安裝 bufexplorer插件,它能提供一個窗口顯示全部可見的緩存區 。
SO中使用小鍵盤上的-/+能夠在上下一個函數快速切換,也能夠用來回到當前函數頭(好比須要修改函數註釋,則可使用該快捷鍵跳到函數頭)。 Vim中可使用 [[ 和 ]]來實現相同的功能
這個基本上是每一個編輯器必備的功能,Vim中天然是支持的。 Vim可使用100gg或者:100來跳轉 。
SO中可使用shift+F8高亮當前的字符串,筆者經常使用此特性來查看變量(通常是局部變量,能在一屏範圍內顯示完時最合適)在何處被引用或者修改。Vim中能夠對搜索命令進行擴展便可實現 一個簡單版本 。若是須要更爲強大的版本,則能夠考慮使用插件 Mark ,它能使用不一樣顏色高亮多個字符串(SO中只有一個黃色) 。
SO將項目中全部的文件都顯示在項目文件窗口中,輸入部分文件名,能夠快速的打開對應的文件。Vim最基本的打開文件方式是使用命令e+文件路徑,這樣子可能輸入比較麻煩,並且還不夠直觀。Vim默認安裝了一個頗有用的插件 netrw,它可讓Vim成爲一個文件管理器(執行e dirname),用戶能夠很直觀的打開想要的文件 。另外, 打開的Buffer(對應文件)也可使用Buffer Exploer插件 迅速定位。
這個是一個很重要的功能,筆者常常用它查看全局變量在那些地方被訪問、修改,函數在那些地方被調用……Vim中可使用 自帶的vimgrep或者調用外部的grep命令來搜索文件 。不過 這二者都不使用索引文件,若是文件不少,則速度會很慢。比較好的方法是使用cscope ,它相似於ctag,不過它生成的數據庫包含更多的信息。能夠用它來搜索Symbol的引用,搜索函數的調用關係(CCTree插件就是基於此功能)……
工程功能會保存上次軟件退出時的信息信息,下次打開時,能回覆到上次退出的狀態,該功能在項目開發中很是有用。Vim有兩個相關的概念 session和viminfo ,能夠用來實現相似功能。
筆者不多使用該功能,感受這個功能比較雞肋。
筆者2010年6月份開始全面轉向Vim,到今天已經有半年,期間基本沒有再使用SO。期間筆者最大的感覺就是:
SO和Vim各自闡釋了Windows和Unix哲學:Windows是All In One,而Unix則遵循KISS。SO只要安裝好,立刻就可使用,它能提供一站式的解決方案;而 Vim則須要配置好vimrc、其餘插件、ctags、cscopes、自定義快捷鍵 。總的來講,SO容易上手,學習曲線較爲平緩,而 Vim則擴展性好,能夠配置性高 。
http://www.sourceinsight.com
http://www.vim.org/index.php
http://docs.google.com/View?id=dgwthwsv_45gnbj8dft
http://www.vim.org/scripts/script.php?script_id=1984