有人抱怨Linux系統下沒有相似於VC之類的方便快捷的編輯器,有人用gedit, 有人用vim,可是都不方便並且也沒有自動補全之類的方便用戶的功能。本文簡單介紹使用vim中的幾個插件(Ctags、Cscope和TagList) 實現一個強大的編輯器,但願能夠幫助您學習、使用。php
Ubuntu給咱們安裝軟件提供了很大的便利,好比說,安裝vim咱們能夠直接使用"sudo apt-get install vim"便可安裝!html
一樣,cscope和ctags也可使用相同方法安裝,這是多麼暢快淋漓啊!感謝Ubuntu給咱們用戶如此便利!
python
對於Taglist使用這個方法安裝不了,咱們須要先下載,而後安裝完成:linux
首先上網下載Taglist插件,下載完成後解壓,再將文件下的taglist.vim使用cp命令拷貝到HOME/.vim/plugin文件夾下(cp -r taglist.vim ~/.vim/plugin)c++
這樣,vim+Taglist+cscope+ctags四種工具咱們是安裝好了,可是如何使用呢?程序員
vim是一個很是好用的編輯工具,如下介紹幾個經常使用的底行模式命令:正則表達式
(1). 設置縮進數據庫
:set smartindent // 設置縮進ubuntu
:set smartindent shiftwidth=4 // C語言自動縮進,縮進值爲4個字符寬度vim
(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文件的配置信息:
[html] view plaincopy
"顯示行號
"set number "或者set nu
map <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 autoindent
set 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 nobackup
else
set backup
endif
"""""""""""""設置開啓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、前面申明過的變量或者函數名的補全;二、結構體等自建結構的補全;三、STL等標準庫的補全;四、括號、引號等自動匹配補全。
對於第一種狀況,寫程序的過程當中,直接用CTRL+p便可選擇,對於第二種狀況,若是想申明告終構體T,想在輸入T.時彈出成員供選擇,只需在用以前按一下:CTRL+F12,而後效果如圖:
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使用簡介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是一個相似ctags的工具。 你能夠把它想做是超過頻的ctags,由於它功能比ctags強大不少。 在Vim裏,經過cscope查詢結果來跳轉就象跳轉到其餘的標籤徹底同樣;它被保存在標籤棧裏。這樣你就能夠象使用tags同樣在函數等等之間便捷的跳轉。在VIM中使用cscope很是簡單:
首先在目錄下使用「cscope -kqb」生成cscope.out文件;
使用時先在VIM的命令行下調用「cscope add/../../cscope.out」(或cs add /../../cscope.out)命令添加一個cscope數據庫,而後就能夠調「cscope find」(或 cs f )命令進行查找了。
VIM支持8種cscope的查詢功能,以下:
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 //查找指定的字符串
例如,咱們想在代碼中查找調用work()函數的函數,咱們能夠輸入:「:cs f c work」,回車後發現沒有找到匹配的功能,可能並無函數調用work()。咱們再輸入「:cs f s work」,查找這個符號出現的位置,如今vim列出了這個符號出現的全部位置。咱們還能夠進行字符串查找,它會雙引號或單引號括起來的內容中查找。還能夠輸入一個正則表達式,這相似於egrep程序的功能。
cscope在vim命令行下還能夠執行下列操做
help: Show this message(Usage: help)
kill: Kill a connection(Usage: kill #)
reset:Reinit all connections(Usage: reset)
show: Show connections (Usage: show)
更詳細的Cscope用法見:http://blog.csdn.net/longerzone/article/details/7788010