發展歷程
Vim是從 vi 發展出來的一個文本編輯器。代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富,在程式設計師中被廣泛使用,和Emacs並列成為類Unix系統用戶最喜歡的文本編輯器。
使用vim先知道其設計理念是很重要的,有助於記憶,舉一反三。
1.vim的設計理念是組合;
命令組合:
Vim強大的編輯能力中很大部分是來自於其普通模式命令。 vim的設計理念是命令的組合。例如普通模式命令"dd"刪除當前行,"dj"代表刪除到下一行,原理是第一個"d"含義是刪除,"j"鍵代表移動到下一行,組合後"dj"刪除 當前行和下一行。另外還可以指定命令重複次數,"2dd"(重複"dd"兩次),和"dj"的效果是一樣的。"d^","^"代表行首,故組合後含義是刪除到游標開始到行首間的內容(不包含游標);"d$" $"代表行尾,刪除到行尾的內容(包含游標);用戶學習了各種各樣的文本間移動/跳轉的命令和其他的普通模式的編輯命令,並且能夠靈活組合使用的話,能夠比那些沒有模式的編輯器更加高效的進行文本編輯。
模式間的組合:
在普通模式中,有很多方法可以進入插入模式。比較普通的方式是按"a"(append/追加)鍵或者"i"(insert/插入)鍵。
2.很多快捷鍵設定和正則表達式類似,可以輔助記憶; ^ $ w 等
3. vim針對程式設計師做了最佳化;
寫代碼的時候手需要時刻保持在鍵盤上,隨機定位代碼、隨機刪除代碼、移動代碼、插入代碼的操作大大多於閱讀、翻頁操作,中間卡頓一下效率就大大降低了;但對普通用戶而言,順序寫、設定字型格式、翻頁讀多於隨機寫刪除操作, 且每個動作之間本身就有很多的停頓,用其他UI編輯器(word,notePad++等)效率反而比VIM高效,使用vim進行操作只會徒增你的疑惑: vim為什麼這么流行。(如果你不是一個代碼開發者,估計你看完這段話也無法感同身受,建議先去學一門程式語言,新手推薦學C,java入門,做一道50行代碼的課後習題,來感受下寫代碼的過程)
Bram Moolenaar 在 80 年代末購入他的Amiga計算機時,Amiga 上沒有他最常用的編輯器vi。Bram 從一個開源的 vi 複製 Stevie 開始,開發了 Vim 的 1.0 版本。最初的目標只是完全複製 vi 的功能,那個時候的 Vim 是Vi IMitation(模擬)的簡稱。1991 年 Vim 1.14 版被 "Fred Fish Disk #591" ——Amiga 用的免費軟體集收錄了。1992 年 1.22 版本的 Vim 被移植到了 UNIX 和MS-DOS上。從那個時候開始,Vim 的全名就變成 Vi IMproved(改良)了。
在這之後,Vim 加入了不計其數的新功能。做為第一個里程碑的是 1994 年的 3.0 版本加入了多視窗編輯模式(分割視窗)。從那之後,同一熒幕可以顯示的 Vim 編輯檔案數可以不止一個了。1996 年發布的 Vim 4.0 是第一個利用圖形接口(GUI)的版本。1998 年 5.0 版本的 Vim 加入了 highlight(語法高亮)功能。2001 年的 Vim 6.0 版本加入了代碼摺疊、外掛程式、多國語言支持、垂直分割視窗等功能。2006 年 5 月發布的 Vim 7.0 版更加入了拼字檢查、上下文相關補完,標籤頁編輯等新功能。 2008 年 8 月發布的 Vim 7.2,該版本合併了 vim 7.1 以來的所有修正補丁,並且加入了腳本的浮點數支持,2010年08月15日,歷時兩年的時間,vim又發布了vim 7.3這個版本,這個版本修復了前面版本的一些bug,以及添加了一些新的特徵,這個版本比前面幾個版本來的要更加優秀。
4.2016年9月12日 Vim 8.0
十年以後,Vim 終於發布了一個新的大版本 8.0 ,結束了從 2006 年 5 月 7 日開始的 7.0 世代。雖然這十年間,Vim 也一直在不斷更新,從 7.0 到三年前的 7.4,每隔一兩年或兩三年就會有個小版本更新,但是這次跨越大版本更新,帶來了不少新的特性,據說有一些是從其它的 Vi 流派吸收來的特性。
主要功能
根據設定可以和原始vi完全兼容
多緩衝編輯、多tab編輯
任意個數的分割視窗(橫,豎)
vim7開始,支持多種數據類型,比如具備列表和字典功能、以及(簡單形式)面向對象編程的腳本語言vim script,對功能進行高度定製化。
可以在腳本中調用 Perl, Ruby, Python, Tcl, MzScheme ,C,C++
單詞縮寫功能
動態單詞補全
多級樹狀撤銷和重做操作
對應550種以上文本檔案的語法高亮
Shell,Lisp,C/C++, Perl, Java, Ruby, Python 等40種以上語言的自動縮排
利用ctags的標籤中跳轉
崩潰後檔案恢復
游標位置和打開的緩衝狀態的保存、復原(session功能)
可以對兩個檔案進行差分,同步功能的diff模式
遠程檔案編輯 。
vim 8.0新增功能
支持異步 I/O 和通道(channels)、JSON
多任務
定時器
Partial、Lambda 和閉包
外掛程式包管理
根據時間戳合併viminfo
Windows用戶:支持 DirectX
支持 GTK+ 3
學習方法
Vim已經有各主流系統的版本,儘管vim較vi已經改良了不少,但是初次使用還是會一頭霧水,不知如何操作,所以學習vim要首先過2關。第一關是理解vim的設計思路,vim設計之初就是整個文本編輯都用鍵盤而非滑鼠來完成,鍵盤上幾乎每個鍵都有固定的用法,且vim的製作者希望用戶在普通模式(也就是命令模式,只可輸入命令)完成大部分的編輯工作,將此模式設計為默認模式,初學者打開vim,如果直接輸入單詞,結果就會滴滴亂響,這是因為vim把用戶輸入的單詞理解為命令了。第二關是命令關,vim有過百條命令對應編輯的需要,如果能熟練使用vim這些命令,編輯速度確實比滑鼠要快很多,但是想全都記住它們也是一件難事,我想記住它們最好的方法就是多多來練習,確實把vim用在日常的文本編輯中去,且遇到難題不要放棄,而是查找解決的方法,每解決一個難題,你的vim技能就上升一級。
其實, Vim與其它編輯器一個很大的區別在於, 它可以完成複雜的編輯與格式化功能. 在這些領域很少有軟體能與它分庭抗禮, 但是, 與所有的靈活性的代價一樣, 你需要用自己的雙手來實現它. 這在事實上造成了用戶在使用Vim過程中的幾個自然階段。
一開始,Notepad, Visual Studio,Microsoft Word等壟斷你的大腦, 這些東西根深蒂固, 揮之不去。Vim的使用對你而言是一場噩夢, 它降低而不是提高了你的工作效率. 對三種工作模式的不解甚至使你認為它是一個充滿BUG或者至少是一個古怪的與當今友好用戶界面設計嚴重脫節的軟體。 事實上, 這些起初看起來古怪的特性是Vim(或者是vi)的作者和它的用戶們在自己漫長的文字編輯和程式設計生涯中總結出來的最快速最實在的操作, 在幾乎等於計算機本身歷史的成長期中, 歷經無數嚴厲苛刻的計算機用戶的批評與檢驗, 無用的特性或糟糕的設計在Vim用戶群面前根本就沒有生存的餘地. Vim細心而謹慎的作者們也不允許自己精心設計的軟體里有這樣東西。
第二個階段,你開始熟悉一些基本的操作, 這些操作足以應付你日常的工作, 你使用這些操作時根本就不假思索. 但這些階段你仍然很少去碰Vim那晦澀的線上幫助文檔. 它在你心裡只是Notepad、Visual Studio的勉強合格的替代品。
第三個階段, 精益求精的你不滿足於無休無止的簡單操作, 冗長而乏味,有沒有更好的辦法可以四兩拔千斤. 於是, 從UNIX參考手冊上, 從同事口中, 你漸漸叩開:help xxx的大門. 開始探索裡面充滿魔力的咒語. 從雜耍般的帶有表演性質的技巧開始, 這些技巧令人眩目但少有實用性. 不過這卻是你擁有魔力的第一步. 接下來, 你開始認識到這些咒語背後的真經, 開始偷偷修改一些奇怪的符號, 於是, 奇蹟產生了, 魔力不但仍然有效, 而且真實地作用於你現實中的文字編輯生活. 你在第二階段由於熟練操作而塵封已久的大腦突然開始運作. 但這個過程並非是達到某個臨界狀態後的一路坦途, 不斷的挫折, 新的挑戰, 看似Mission Impossible的任務永遠伴隨著任何一個人的任何一個學習過程. 這是你使用Vim的最後一個階段, 也是最漫長最有挑戰性同時也充滿無數奇趣的階段. 這個階段里你開始定製一些希奇古怪的顏色. 開始以敲入i18n來輸入internationalization, 開始讓Vim替你糾正經常把the 誤敲成teh的毛病, 開始讓Vim與系統里各種精悍而強大的兄弟工具進行合作, 開始寫越來越長的script, 每一次的文本編輯體驗都妙趣橫生高潮迭起. 你的頭腦因為要用Vim完成高效的編輯而高度緊張. 你開始在Vim郵件列表里提一些確實是問題的問題. 也開始發現你在Vim里做了以前在SHELL里做的幾乎一切事. 事實上你已經成了一個無可救藥的Vim骨灰級玩家。
高效率移動
1、在插入模式之外 基本上來說,你應該儘可能少的呆在插入模式裡面,因為在插入模式裡面 VIM 就像一個“啞巴”編輯器一樣。很多新手都會一直呆在插入模式裡面,因為這樣易於使用。但 VIM 的強大之處在於他的命令模式!你會發現,在你越來越了解 VIM 之後,你就會花越來越少的時間使用插入模式了。
2、使用 h、j、k、l
使用 VIM 高效率編輯的第一步,就是放棄使用箭頭鍵。使用 VIM,你就不用頻繁的在箭頭鍵和字母鍵之間移來移去了,這會節省你很多時間。當你在命令模式時,你可以用 h、j、k、l 來分別實現左、下、上、右箭頭的功能。一開始可能需要適應一下,但一旦習慣這種方式,你就會發現這樣操作的高效之處了。
在你編輯你的電子郵件或者其他有段落的文本時,你可能會發現使用方向鍵和你預期的效果不一樣,有時候可能會一次跳過了很多行。這是因為你的段落在 VIM 看來是一個大的長長的行。這時你可以在按 h、j、k 或者 l 之前鍵入一個 數字9,這樣 VIM 就會按螢幕上面的行如你所願的移動了。
3、在當前行裡面有效的移動游標
很多編輯器只提供了簡單的命令來控制游標的移動(比如左、上、右、下、到行首/尾等)。VIM 則提供了很多強大的命令來滿足你控制游標的欲望。當游標從一點移動到另外一點,在這兩點之間的文本(包括這兩個點)稱作被“跨過”,這裡的命令也被稱作是 motion。(簡單說明一下,後面會用到這個重要的概念)
4、常用到的一些命令(motion)
fx:移動游標到當前行的下一個 x 處。很明顯,x 可以是任意一個字母,而且你可以使用 ; 來重複你的上一個 f 命令。
tx:和上面的命令類似,但是是移動到 x 的左邊一個位置。(這真的很有用)
Fx:和 fx 類似,不過是往回找。使用 , 來重複上一個F命令。
Tx:和 tx 類似,不過是往回移動到 x 的右邊一個位置。b:游標往前移動一個詞。
w:游標往後移動一個詞。
0:移動游標到當前行首。(是數字0)
^:移動游標到當前行的第一個字母位置。
$:移動游標到行尾。
):移動游標到下一個句子。
( :移動游標到上一個句子。
5、在整個檔案裡面有效移動游標
VIM 有很多命令,可以用來到達檔案裡面你想到達的地方。下面是一些在檔案裡面移動的命令:
<Ctrl-f>:向下移動一屏。
<Ctrl-d>:向下移動半屏。
<Ctrl-b>:向上移動一屏。
<Ctrl-u>:向上移動半屏。
G:到檔案尾
numG:移動游標到指定的行(num)。(比如 10G 就是到第 10 行)
gg:到檔案首H:移動游標到螢幕上面
M:移動游標到螢幕中間
L:移動游標到螢幕下面
*:讀取游標處的字元串,並且移動游標到它再次出現的地方。
#:和上面的類似,但是是往反方向尋找。
/text:從當前游標處開始搜尋字元串 text,並且到達 text 出現的地方。必須使用回車來開始這個搜尋命令。如果想重複上次的搜尋的話,按 n移動到下個 text 處,N 移動到上一個 text 處 。
?text:和上面類似,但是是反方向。
m{a-z}:在當前游標的位置標記一個書籤,名字為 a-z 的單個字母。書籤名只能是小寫字母。你看不見書籤的存在,但它確實已經在那裡了。
`a:到書籤 a 處。注意這個不是單引號,它一般位於大部分鍵盤的 1 的左邊。
`.:到你上次編輯檔案的地方。這個命令很有用,而且你不用自己去標記它。
%:在成對的括弧等符號間移動,比如成對的 [ ] , { }, ( ) 之間。將游標放到任意符號上,然後通過 % 來移動到和這個符號匹配的符號上,% 還可以正確的識別括弧的嵌套層數,總是移動到真正匹配的位置上。因此這個命令在編輯程式代碼的時候非常有用,可以讓你方便的在一段代碼的頭尾間移動。
高效的輸入
1、使用關鍵字自動完成
VIM 有一個非常漂亮的關鍵字自動完成系統。這表示,你可以輸入一個長詞的一部分,然後按一下某個鍵,然後 VIM 就替你完成了這個長詞的輸入了。舉個例子:你有一個變數名為 iAmALongAndAwkwardVarName 在你寫的代碼的某個地方。也許你不想每回都自己一個一個字母的去輸入它。
使用關鍵字自動完成功能,你只需要輸入開始幾個字母(比如 iAmAL),然後按 <C-N>(按住 Ctrl,再按 N)或者 <C-P>。如果 VIM 沒有給出你想要的詞,繼續按,直到你滿意為止,VIM 會一直循環它找到的匹配的字元串。
2、聰明的進入插入模式
很多新手進入插入模式都只是用 i。這樣當然可以進入插入模式,但通常不是那么合適,因為 VIM 提供了很多進入插入模式的命令。下面是最常用的一些:
i:在當前字元的左邊插入
I:在當前行首插入
a:在當前字元的右邊插入
A:在當前行尾插入
o:在當前行下面插入一個新行
O:在當前行上面插入一個新行
c{motion}:刪除 motion 命令跨過的字元,並且進入插入模式。比如:c$,這將會刪除從游標位置到行尾的字元並且進入插入模式。ct!,這會刪除從游標位置到下一個嘆號(但不包括),然後進入插入模式。被刪除的字元被存在了剪貼簿裡面,並且可以再貼上出來。
d{motion}:和上面差不多,但是不進入插入模式。
3、有效的移動大段的文本
使用可視選擇(visual selections)和合適的選擇模式
不像最初的 VI,VIM 允許你高亮(選擇)一些文本,並且進行操作。這裡有三種可視選擇模式:
v:按字元選擇。經常使用的模式,所以親自嘗試一下它。
V:按行選擇。這在你想拷貝或者移動很多行的文本的時候特別有用。
<C-V>:按塊選擇。非常強大,只在很少的編輯器中才有這樣的功能。你可以選擇一個矩形塊,並且在這個矩形裡面的文本會被高亮。
在選擇模式的時候使用上面所述的方向鍵和命令(motion)。比如,vwww,會高亮游標前面的三個詞。Vjj 將會高亮當前行以及下面兩行。
4、在可視選擇模式下剪下和拷貝
一旦你高亮了選區,你或許想進行一些操作:
d:剪貼選擇的內容到剪貼簿。
y:拷貝選擇的內容到剪貼簿。
c:剪貼選擇的內容到剪貼簿並且進入插入模式。
在非可視選擇模式下剪下和拷貝
如果你很清楚的知道你想拷貝或者剪下什麼,那你根本就不需要進入可視選擇模式。這樣也會節省時間:
d{motion}:剪下 motion 命令跨過的字元到剪貼簿。比如,dw 會剪下一個詞而 dfS 會將從當前游標到下一個 S 之間的字元剪下至剪貼簿。
y{motion}:和上面類似,不過是拷貝。
c{motion}:和 d{motion} 類似,不過最後進入插入模式。
dd:剪下當前行。
yy:拷貝當前行。
cc:剪下當前行並且進入插入模式。
D:剪下從游標位置到行尾到剪貼簿。
Y:拷貝當前行。
C:和 D 類似,最後進入插入模式。
x:剪下當前字元到剪貼簿。
s:和x類似,不過最後進入插入模式。
5、貼上
貼上很簡單,按 p。
6、使用多重剪貼簿
很多編輯器都只提供了一個剪貼簿。VIM 有很多。剪貼簿在 VIM 裡面被稱為暫存器(Registers)。你可以列出當前定義的所有暫存器名和它們的內容,命令為“:reg”。最好使用小寫字母來作為暫存器的名稱,因為大寫的有些被 VIM 占用了。
使用暫存器的命令為雙引號 “。
比如:我們要拷貝當前行到暫存器 k。你應該按 “kyy。(你也可以使用 V”ky。為什麼這樣也可以呢?)當前行應該已經存在了暫存器 k 裡面直到你又拷貝了一些東西進入暫存器 k。你可以使用命令 “kp 來貼上暫存器 k 裡面的內容到你想要的位置。
7、避免重複
令人驚奇的 . 命令
在 VI 裡面,輸入 . (小數點符號),將會重複你輸入的上一個命令。比如,你上個命令為“dw”(刪除一個詞),VI 將會接著再刪除一個詞。
8、使用數字
使用數字也是 VIM 強大的而且很節省時間的重要特性之一。在很多 VIM 的命令之前都可以使用一個數字,這個數字將會告訴 VIM 這個命令需要執行幾次。比如:
3j 將會把游標向下移動三行。
10dd 將會刪除十行。
y3t″ 將會拷貝從當前游標到第三個出現的引號之間的內容到剪貼簿。
數字是擴展 motion 命令作用域非常有效的方法。
高效讀代碼
建議在vim上安裝Taglist+cscope+ctags外掛程式有利於高效讀代碼,有利於學習!
1、安裝
對於小編我來說我使用的是Ubuntu,安裝軟體一般使用的命令是apt-get install ***!
對於vim+Taglist+cscope+ctags組合編輯器的創建,vim , cscope , ctags安裝起來比較方便使用上述命令即可安裝!
(對於不同的Linux發行版本安裝軟體的命令不太一樣,需要根據自己的安裝版稍微修改,比如說Fedora即使用yum命令安裝)
對於Taglist使用這個方法安裝不了,我們需要先下載,然後安裝完成:
首先上網下載Taglist外掛程式,下載完成後解壓,再將檔案下的taglist.vim使用cp命令拷貝到HOME/.vim/plugin資料夾下(cp -r taglist.vim ~/.vim/plugin)
2、vim的配置
vim是一個非常好用的編輯工具,以下介紹幾個常用的底行模式命令:
(1). 設定縮進
:set smartindent // 設定縮進
:set smartindent shiftwidth=4 // C語言自動縮進,縮進值為4個字元寬度
(2). 顯示游標行列信息
:set ruler // 顯示游標信息(右下角)
(3). 查看制表符
:set list // 顯示制表符,以^符號顯示制表符的位置
(4). 查看行數信息
:set number //顯示行號(左邊)
(5). 關鍵字高亮
:syntax on //關鍵字高亮
(6). 多檔案編輯 ,在編寫程式時有可能需要同時編輯多個檔案,在這種情況下,需要如下設定
: split two.c // 多檔案編輯
當然,如果不嫌麻煩,可以在每次打開Vim時 輸入如上命令,如我經常用的是:set number :set ruler :syntax on :set smartindent 命令,如果將平時在底行模式下輸入的命令直接寫入配置檔案,則以後使用Vim時不用再次輸入這些命令。
首先,試著在Vi的底行模式下輸入如下命令,如果不支持的話,去下載一個Vim的全版本,sudo apt-get install vim-full。
以下是修改配置檔案的方法:
(1). 找到Vimrc檔案。
(2) 查看檔案的許可權:
ls -l vimrc
shisir@shisir-desktop:/usr/share/vim$ cd /etc/vim
shisir@shisir-desktop:/etc/vim$ ls
gvimrc vimrc vimrc.tiny
shisir@shisir-desktop:/etc/vim$ ls -l vimrc
-r--r--r-- 1 root root 2492 2009-04-10 08:08 vimrc
(3) 如果沒有寫許可權的話,修改許可權,使我們可以修改該配置檔案
sudo chmod a+w vimrc
(4)根據個人需要將上述命令寫入配置檔案
比如,我個人的設定是: syntax on , set ruler ,set number , set smartindent shiftwidth=4
下面貼上我的vimrc檔案的配置信息:
"顯示行號
set number
"檢測檔案的類型
filetype on
"記錄歷史的行數
set history=1000
"自動對齊
set autoindent
set cindent
"智慧型選擇對齊方式
set smartindent
"tab為4個空格
set tabstop=4
"當前行之間交錯時使用4個空格
set shiftwidth=4
"設定匹配模式,輸入左括弧會出現右括弧
set showmatch
"編輯時顯示游標狀態
set ruler
"快速匹配
set incsearch
"修改檔案自動備份
if has("vms")
set nobackup
else
set backup
endif
"""""""""""""設定開啟ctags"""""""""""""
settags=/home/zhouyl/linux-3.4.7/tags;"這邊設定的是你使用ctags -R的目錄,後面有介紹!你根據自己的使用修改這個路徑
set autochdir
"""""""""""""""""Taglist設定"""""""""""""""""
""let Tlist_Auto_Open = 1
let Tlist_Ctags_Cmd = '/usr/bin/ctags'
let Tlist_Show_One_File = 1
let Tlist_Exit_OnlyWindow = 1
""""""""""""""""""""""cscope設定""""""""""""""""""
set cscopequickfix=s-,c-,d-,i-,t-,e-
if has("cscope")
set csprg=/usr/bin/cscope
set csto=1
set cst
set nocsverb
" add any database in current directory
if filereadable("cscope.out")
cs add cscope.out
endif
set csverb
endif
因為我的文檔中的原配置檔案已經有了語法高亮:
" Vim5 and later versions support syntax highlighting. Uncommenting the next
" line enables syntax highlighting by default.
if has("syntax")
syntax on
endif
所以我就沒寫了,您如果vimrc檔案裡面沒有此項建議自己加上syntax on 設定語法高亮
PS:在配置檔案中"符號後的內容是注釋,而且在配置檔案中是不需要添加符號的 ,這裡關於cscope、ctags和Taglist的設定可以先寫上,後面將對這三個外掛程式有介紹。好了,去開一個Vim,編輯一個程式看看,是不是感覺很不一般呢?
好了,下面順便演示下,智慧型補全的用法,我分四種情況:1、前面申明過的變數或者函式名的補全;2、結構體等自建結構的補全;3、STL等標準庫的補全;4、括弧、引號等自動匹配補全。
對於第一種情況,寫程式的過程中,直接用CTRL+p即可選擇,對於第二種情況,如果想申明了結構體T,想在輸入T.時彈出成員供選擇,只需在用之前按一下:CTRL+F12,然後效果如圖:
3、Taglist外掛程式的使用
TagList外掛程式,是一款基於ctags,在vim代碼視窗旁以分割視窗形式(如上圖所示)顯示當前的代碼結構概覽,增加代碼瀏覽的便利程度的vim外掛程式.
在Vim中載入代碼檔案後,可以使用以下命令控制taglist
:TlistOpen 打開並將輸入焦點至於標籤列表視窗,效果如上圖所示
:TlistClose 關閉標籤列表視窗
:TlistToggle 切換標籤列表視窗狀態(打開←→關閉),標籤列表視窗是否獲得焦點取決於其他配置
ctl-w + w 或ctl-w + 方向鍵 視窗切換(taglist本質上是一個vim分隔視窗,因此可以使用ctl-w系列快捷鍵對視窗進行切換操作)
在Taglist視窗主要有以下操作
按F1:打開幫助
回車鍵:跳到游標所在的標記的定義處(如將游標移到main函式,按回車鍵)
o:新建一個視窗,跳到標記定義處
p:預覽標記定義(仍然在taglist視窗)
空格:顯示標記的原型(如函式原型)
u:更新標記列表(比如源檔案新增了一個函式,並在保存後,可在taglist視窗按u)
s:選擇排序欄位(暫時我也不知道什麼意思)
d:刪除游標所在的taglist檔案(如用vi打開了兩個檔案f1.c,f2.c可以刪除f1.c的標記)
x:n放大/縮小taglist視窗
+:展開(指標記)
-:摺疊
*:全部展開
=:全部摺疊
[[:將游標移到前一個檔案的起點
]]:將游標移到後一個檔案的起點
q:退出taglist視窗
F1:關閉幫助
4、ctags外掛程式的使用
VIM簡單易用,大家只要看看VIM自帶的vitutor,大約只要20分鐘就能掌握VIM的用法,上面也簡單介紹了點vim的用法。但是對於Linux下的C/C++的 程式設計師,使用VIM+Ctags的組合來寫程式也許是最佳的選擇。^_^
儘管ctags也可以支持其它編輯器,但是它正式支持的只有VIM。並且VIM中已經默認安裝了Ctags,它可以幫助程式設計師很容易地瀏覽原始碼。
熟練的使用ctags僅需記住下面七條命令:(很簡單吧,呵呵)
1. $ ctags–R * ($ 為Linux系統Shell提示符)
2. $ vi –t tag (請把tag替換為您欲查找的變數或函式名)
3. :ts (ts 助記字:tagslist, “:”開頭的命令為VI中命令行模式命令)
4. :tp (tp 助記字:tagspreview)---此命令不常用,可以不用記
5. :tn (tn 助記字:tagsnext) ---此命令不常用,可以不用記
6. Ctrl + ] 跳到游標所在函式或者結構體的定義處
7. Ctrl + T 返回查找或跳轉
下面我們逐條的解釋上面的命令:
“$ ctags–R *”:“-R”表示遞歸創建,也就包括原始碼根目錄(當前目錄)下的所有子目錄。“*”表示所有檔案。這條命令會在當前目錄下產生一個“tags”檔案, 當用戶在當前目錄中運行vi時,會自動載入此tags檔案。Tags檔案中包括這些對象的列表:
用#define定義的宏
枚舉型變數的值
函式的定義、原型和聲明
名字空間(namespace)
類型定義(typedefs)
變數(包括定義和聲明)
類(class)、結構(struct)、枚舉類型(enum)和聯合(union)
類、結構和聯合中成員變數或函式
VIM用這個“tags”檔案來定位上面這些做了標記的對象。
剩下的命令就是定位這些對象的方法:
“$ vi –t tag” :在運行vim的時候加上“-t”參數,例如:
[/usr/src]$ vim -t main
這個命令將打開定義“main”(變數或函式或其它)的檔案,並把游標定位到這一行。如果這個變數或函式有多處定義,在VI命令行模式“:ts”命令就能 列出一個列表供用戶選擇。 “:tp”為上一個tag標記檔案,“:tn”為下一個tag標記檔案。當然,若當前tags檔案中用戶所查找的變數或函式名只有一 個,“:tp,:tn”命令不可用。 :(
最方便的方法是把游標移到變數名或函式名上,然後按下“ Ctrl+] ”,這樣就能直接跳到這個變數或函式定義的源檔案中,並把游標定位到這一行。用 “ Ctrl+T ”可以退回原來的地方。即使用戶使用了N次“Ctrl+]”查找了N個變數,按N次“Ctrl+t”也能回到最初打開的檔案,它會按原路返 回 。 ^_^
注意:運行vim的時候,必須在“tags”檔案所在的目錄下運行。否則,運行vim的時候還要用“:settags=”命令設定“tags”檔案的路 徑,這樣vim才能找到“tags”檔案。在完成編碼時,可以手工刪掉tags檔案(帚把不到,灰塵不會自己跑掉^_^)。
5、cscope外掛程式的使用
Cscope是一個類似 ctags的工具。 你可以把它想作是超過頻的 ctags,因為它功能比ctags 強大很多。 在 Vim 里,通過 cscope 查詢結果來跳轉就象跳轉到其他的標籤完全一樣;它被保存在標籤棧里。這樣你就可以象使用 ctags一樣在函式等等之間便捷的跳轉 。
在VIM中使用cscope非常簡單,首先調用“cscope add”命令添加一個cscope資料庫,然後就可以調用“cscope find”命令進行查找了。VIM支持8種cscope的查詢功能,如下:例如,我們想在代碼中查找調用work()函式的函式,我們可以輸入:“:cs find c work”,回車後發現沒有找到匹配的功能,可能並沒有函式調用work()。我們再輸入“:cs find s work”,查找這個符號出現的位置,vim列出了這個符號出現的所有位置。我們還可以進行字元串查找,它會雙引號或單引號括起來的內容中查找。還可以輸入一個正則表達式,這類似於egrep程式的功能。
在原始碼目錄下打開vim。要使用cscope查找就必須載入cscope.out檔案.在vim命令行下執行:(按照上述方法配置好的vimrc中有這一步)
:cs add cscope.out
在vim命令行下執行:
:cs help
cscope commands:
add : Add a new database (Usage: add file|dir [pre-path] [flags])
find : Query for a pattern (Usage: find c|d|e|f|g|i|s|t name)
c: Find functions calling this function //查找調用本函式的函式
d: Find functions called by this function //查找本函式調用的函式
e: Find this egrep pattern //查找egrep模式,相當於egrep功能,但查找速度快多了
f: Find this file //查找並打開檔案,類似vim的find功能
g: Find this definition //查找函式、宏、枚舉等定義的位置,類似ctags的功能
i: Find files #including this file //查找包含本檔案的檔案
s: Find this C symbol //查找C語言符號,即查找函式名、宏、枚舉值等出現的地方
t: Find assignments to //查找指定的字元串
help : Show this message (Usage: help)
kill : Kill a connection (Usage: kill #)
reset: Reinit all connections (Usage: reset)
show : Show connections (Usage: show)
例如:使用cscope查找do_fork函式的定義:
在vim命令行下執行: :cs f g do_fork
不支持版本
•16 位的DOS、OS/2 和 Amiga 版本
•32 位的 MS-DOS/Windows 95/98 的字元界面版
•16 位的 MS-Windows 版本