從Source Insight到Vim

從Source Insight到Vim 

ykrocku at gmail dot com

版權申明

  • 此文使用Google Docs編輯,原文地址以下:
  • 做者Blog:
發現錯誤,能夠經過ykrocku at gmail dot com聯繫筆者,歡迎高手拍磚。
轉載請務必在顯眼的位置註明原文地址


這篇文章是什麼

  • 此文記錄了筆者折騰Vim的心得,但願能爲愛好Vim或者想擺脫SO的讀者提供一些參考信息,堅決其遷移的信心。
  • 本文重在討論Vim能實現那些Source Insight的功能,可是並無給出Vim配置細節。互聯網上有不少寫得很是好的文章幫助你們定製本身的Vim,筆者特別推薦easwy的《Vim使用進階》系列。也正是他出色的文章讓筆者步入了進階階段。


前言
php

Source Insight(如下簡稱SO)的確是一款優秀的代碼查看和編輯軟件,可是它也有不少缺點:
  • 收費軟件,並且不便宜。最新的V3.5須要華麗麗的$239/user(帶光盤得$255)。
  • 只能在Windows下使用,不支持其餘操做系統。
  • 很容易對其產生很是強的依賴性,致使不使用該軟件查閱編輯代碼時會感到手足無措!
  • 筆者乃CLI控,並且還極度迷戀快捷鍵。
俗話說得好,不要綁死在一棵樹上。筆者用了1年多SO後,下定決心尋找另一棵樹。通過一番搜索和總結以後,選擇了vim。


名詞解釋:

  • Symbol/Tag:二者都是對變量、函數的通稱SO使用前者,Vim使用後者。SO在新建項目時會在項目文件中生成symbol的信息,而Vim則是使用的ctags生成的tag文件。
  • 緩存區(Buffer):Vim用來指讀入到內存中的文件。
  • 窗口(Window):在SO中能夠打開多個文件,而每一個文件在是一個窗口,可使用ALT+TAB切換,也能夠用ALT+W n切換(n數字1-9,字幕a-z根據文件打開數目遞增);Vim用窗口來呈現文件給用戶,這個窗口的概念與GUI中窗口概念不徹底同樣


SO經常使用功能以及在Vim中的支持:

  • 當前文件Symbol列表
在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中的自動補全章節
關於OmniCppComplete的配置, 能夠參考easwy的文章
  • F7/F8---查看整個項目/當前文件的symbol
F8常被用來在當前的代碼文件中跳轉,F7常被用來根據symbol來打開相應的文件 。這兩個功能均可以使用Vim的 tag/ptag命令來實現,且都有tab補全功能 。tag命令是在當前窗口中顯示tag,而ptag則是在預覽窗口中顯示tag。
若是不習慣命令行方式,能夠考慮安裝 FuzzyFinder插件。此插件提供了模糊匹配tag的功能 ,不過不能限制其只在當前文件中匹配(能夠考慮跳轉到taglist窗口中搜索tag來模擬F8操做)。
  • CTRL+= 和 CTRL+鼠標左鍵--查看symbol定義
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來實現
  • ALT+, ALT+. 上/下一個位置
SO中的這個功能很是好用,在代碼間跳來跳去時,也能夠隨時跳回去。Vim中也不缺這個功能,能夠 使用C-O/C-I來回到前/後一個點 。不過二者的 跳轉方式有些差別 ,可能須要一點時間來適應。
另外 tag棧(C-]/C-T)也提供了一個函數間來回跳轉的好方法
  • F9/F10--減小/增長縮進
編輯代碼時Vim中使用回車或者是o/O命令添加一行時會自動縮進(須要開啓cindent縮進模式)。調整代碼時,也可使用 <</>>來縮進(推薦列可視模式下使用)。另外Vim中還有提供"="命令,功能更增強大,再結合indent的話,則可無往不利 。關於在Vim中訪問外部程序的功能,能夠參見幫助文檔中的filter motion(:h filter),靈活使用此功能,定可事半功倍。
F9/F10的定製可參考 筆者的vimrc
  • F3/F4 --向上/下搜索
這個功能是編輯器必備之一,Vim中用/pattern搜索,而後使用 N/n查找上/下一處 。添加搜索當前光標下字符串的功能也很容易,能夠參考 Vim在線wiki上的這篇文章
  • CTRL+H --替換
用慣了GUI的查找替換窗口,可能須要稍微學習一下Vim提供的命令模式。
:%s/teh/the/g     將全部的teh替換成the,這個直接所有替換,不確認。
:%s/teh/the/gc    將teh替換成the,並挨個確認。
平常編碼中,絕大部分的替換工做均可以用這一句命令實現。若是想更深刻的瞭解Vim的替換功能,能夠閱讀相關文檔。
  • ALT+W n--快速切換文件
彈出窗口菜單,再按數字就能夠切換到對應打開的文件。
SO中同時編輯多個文件時,使用ALT+W n能夠快速的在多個文件間切換。 Vim中則可使用ls/bn/bp/b等命令在打開的文件間切換 (注意:須要set hidden開啓緩存區隱藏)。
ls能夠顯示全部緩存區,bp/bn跳轉到上/下一個緩存區,b 3跳轉到第3個緩衝區 。有這幾個命令基本夠用。
若是想更加直觀的話,能夠安裝 bufexplorer插件,它能提供一個窗口顯示全部可見的緩存區
  • 小鍵盤-/+  --上/下一個函數
SO中使用小鍵盤上的-/+能夠在上下一個函數快速切換,也能夠用來回到當前函數頭(好比須要修改函數註釋,則可使用該快捷鍵跳到函數頭)。 Vim中可使用 [[ 和 ]]來實現相同的功能
  • CTRL+g --跳轉到某一行
這個基本上是每一個編輯器必備的功能,Vim中天然是支持的。 Vim可使用100gg或者:100來跳轉
  • Shift+F8 --高亮當前字符串
SO中可使用shift+F8高亮當前的字符串,筆者經常使用此特性來查看變量(通常是局部變量,能在一屏範圍內顯示完時最合適)在何處被引用或者修改。Vim中能夠對搜索命令進行擴展便可實現 一個簡單版本 。若是須要更爲強大的版本,則能夠考慮使用插件 Mark ,它能使用不一樣顏色高亮多個字符串(SO中只有一個黃色)
  • CTRL+o --快速打開文件
SO將項目中全部的文件都顯示在項目文件窗口中,輸入部分文件名,能夠快速的打開對應的文件。Vim最基本的打開文件方式是使用命令e+文件路徑,這樣子可能輸入比較麻煩,並且還不夠直觀。Vim默認安裝了一個頗有用的插件 netrw,它可讓Vim成爲一個文件管理器(執行e dirname),用戶能夠很直觀的打開想要的文件
另外, 打開的Buffer(對應文件)也可使用Buffer Exploer插件 迅速定位。
  • CTRL+/ --搜索Symbol在項目中全部被引用的位置
這個是一個很重要的功能,筆者常常用它查看全局變量在那些地方被訪問、修改,函數在那些地方被調用……Vim中可使用 自帶的vimgrep或者調用外部的grep命令來搜索文件 。不過 這二者都不使用索引文件,若是文件不少,則速度會很慢。比較好的方法是使用cscope ,它相似於ctag,不過它生成的數據庫包含更多的信息。能夠用它來搜索Symbol的引用,搜索函數的調用關係(CCTree插件就是基於此功能)……
更加詳解的介紹能夠參考 easwy的文章
  • 工程管理和會話保存
工程功能會保存上次軟件退出時的信息信息,下次打開時,能回覆到上次退出的狀態,該功能在項目開發中很是有用。Vim有兩個相關的概念 session和viminfo ,能夠用來實現相似功能。
筆者寫了一個 簡陋的腳本 來自動生成ctag/cscope之類的文件,加上vimrc的設置,也算是能夠省心一點。
  • CTRL-M --書籤功能
筆者不多使用該功能,感受這個功能比較雞肋。

總結:

筆者2010年6月份開始全面轉向Vim,到今天已經有半年,期間基本沒有再使用SO。期間筆者最大的感覺就是:
    • 多練習,孰能生巧
    • Vim自帶的幫助是最好最好最好的幫助
    • Vim的學習曲線着實是很是很是很是的陡峭
SO和Vim各自闡釋了Windows和Unix哲學:Windows是All In One,而Unix則遵循KISS。SO只要安裝好,立刻就可使用,它能提供一站式的解決方案;而 Vim則須要配置好vimrc、其餘插件、ctags、cscopes、自定義快捷鍵
總的來講,SO容易上手,學習曲線較爲平緩,而 Vim則擴展性好,能夠配置性高

參考:

  • Source Insight主頁:
http://www.sourceinsight.com
  • Vim主頁:
http://www.vim.org/index.php
http://docs.google.com/View?id=dgwthwsv_45gnbj8dft
  • Vim在線正文手冊:
  • ctags主頁:
  • taglist插件
  • Fuzzyfinder插件
http://www.vim.org/scripts/script.php?script_id=1984
相關文章
相關標籤/搜索