有人抱怨Linux系統下沒有類似於VC之類的方便快捷的編輯器,有人用gedit,有人用vim,但是都不方便而且也沒有自動補全之類的方便使用者的功能。本文簡單介紹使用vim中的幾個外掛程式(Ctags、Cscope和TagList)實現一個強大的編輯器,希望可以協助您學習、使用。 一、軟體安裝
Ubuntu給我們安裝軟體提供了很大的便利,比如說,安裝vim我們可以直接使用"sudo apt-get install vim"即可安裝!
同樣,cscope和ctags也可以使用相同方法安裝,這是多麼暢快淋漓啊!感謝Ubuntu給我們使用者如此便利!
對於Taglist使用這個方法安裝不了,我們需要先下載,然後安裝完成:
首先上網下載Taglist外掛程式,下載完成後解壓,再將檔案下的taglist.vim使用cp命令拷貝到HOME/.vim/plugin檔案夾下(cp -r taglist.vim ~/.vim/plugin)
這樣,vim+Taglist+cscope+ctags四種工具我們是安裝好了,但是如何使用呢?
二、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) 查看檔案的許可權:
zhouyl@ubuntu:~$ cd /etc/vim
zhouyl@ubuntu:/etc/vim$ ls
vimrc vimrc.tiny
zhouyl@ubuntu:/etc/vim$ ls -l vimrc
-rw-r--r-- 1 root root 3449 9月 11 17:30 vimrc
(3) 如果沒有寫入權限的話,修改許可權,使我們可以修改該設定檔
sudo chmod a+w vimrc
(4)根據個人需要將上訴命令寫入設定檔
比如,我個人的設定是: syntax on , set ruler ,set number , set smartindent shiftwidth=4
下面貼上我的vimrc檔案的配置資訊:
"顯示行號 "set number "或者set numap <F5> <Esc>:set nu<CR> "映射F5顯示行號,參考"vim 按鍵映射"(http://www.pythonclub.org/vim/map-basic)map <C-F5> <Esc>:set nonu<CR> "映射Ctrl+F5為不顯示行號"檢測檔案的類型 filetype on"記錄曆史的行數 set history=1000"自動對齊 set autoindentset cindent"智能選擇對齊 set smartindent"tab為4個空格 set tabstop=4"當前行之間交錯時使用4個空格 set shiftwidth=4"設定匹配模式,輸入做括弧會出現右括弧 set showmatch"編輯時顯示光線標狀態 set ruler"高亮尋找 set hlsearch"粘貼插入set paste"快速匹配 set incsearch"修改檔案自動備份 if has("vms") set nobackupelse set backupendif"""""""""""""設定開啟ctags""""""""""""" map <F4> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR>"第一個命令裡的分號是必不可少的。這個命令讓vim首先在目前的目錄裡尋找tags檔案,如果沒有找到tags檔案,或者沒有找到對應的目標,就到父目錄 中尋找,一直向上遞迴。因為tags檔案中記錄的>路徑總是相對於tags檔案所在的路徑,所以要使用第二個設定項來改變vim的目前的目錄。 set tags=tags;set autochdir"絕對路徑"set tags=/home/long/workstation/ganguio/uio-8139d-driver/V7/tags,/home/long/linux-3.7.3/drivers/uio/tags"""""""""""""""""Taglist設定""""""""""""""""" map <F3> : Tlist<CR> ""按下F3就可以呼出了"let Tlist_Auto_Open = 1 "在啟動VIM後,自動開啟taglist視窗let Tlist_Ctags_Cmd = '/usr/bin/ctags' "設定ctags的位置let Tlist_Use_Right_Window=0 " 1為讓視窗顯示在右邊,0為顯示在左邊let Tlist_Show_One_File=0 "讓taglist可以同時展示多個檔案的函數列表,設定為1時不同時顯示>多個檔案的tag,只顯示當前檔案的let Tlist_File_Fold_Auto_Close=1 "同時顯示多個檔案中的tag時,taglist只顯示當前檔案tag,>其他檔案的函數列表摺疊隱藏let Tlist_Exit_OnlyWindow=1 "當taglist是最後一個分割視窗時,自動結束vim"let Tlist_Use_SingleClick= 1 " 預設情況下,在雙擊一個tag時,才會跳到該tag定義的位置"let Tlist_Process_File_Always=0 "是否一直處理tags.1:處理;0:不處理"""""""""""""""""""""""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 nmap <C-@>s :cs find s <C-R>=expand("<cword>")<CR><CR>nmap <C-@>g :cs find g <C-R>=expand("<cword>")<CR><CR>nmap <C-@>c :cs find c <C-R>=expand("<cword>")<CR><CR>nmap <C-@>t :cs find t <C-R>=expand("<cword>")<CR><CR>nmap <C-@>e :cs find e <C-R>=expand("<cword>")<CR><CR>nmap <C-@>f :cs find f <C-R>=expand("<cfile>")<CR><CR>nmap <C-@>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>nmap <C-@>d :cs find d <C-R>=expand("<cword>")<CR><CR>
因為我的文件中的原設定檔已經有了文法高亮:
" 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,然後效果如圖:
三、TagList外掛程式簡述及使用
TagList外掛程式,是一款基於ctags,在vim代碼視窗旁以分割視窗形式(如上圖所示)顯示當前的代碼結構概覽,增加代碼瀏覽的便利程度的vim外掛程式.在Vim中載入代碼檔案後,可以使用以下命令控制taglist:
TlistOpen(直接Tlist也可)開啟並將輸入焦點至於標籤列表視窗,效果如上圖所示
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:關閉協助
四、Ctags外掛程式簡介及使用
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 -tmain這個命令將開啟定義“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檔案(帚把不到,灰塵不會自己跑掉^_^)。
有時候系統提示“找不到tag”時不要一味著急,有可能你想要查詢的函數時系統函數,如果這樣,那妳幸運勒,可以使用Shift+K來查詢。如果不是沒也可以自己找到tags檔案,開啟查詢,如果還是找不到...哼哼,我也沒轍了。 五、Cscope外掛程式簡介及使用
Cscope是一個類似ctags的工具。 你可以把它想作是超過頻的ctags,因為它功能比ctags強大很多。 在Vim裡,通過cscope查詢結果來跳轉就象跳轉到其他的標籤完全一樣;它被儲存在標籤棧裡。這樣你就可以象使用tags一樣在函數等等之間便捷的跳轉。在VIM中使用cscope非常簡單:
首先在目錄下使用“cscope -kqb”產生cscope.out檔案;
使用時先在VIM的命令列下調用“cscope add/../../cscope.out”(或cs add /../../cscope.out)命令添加一個