一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

打造linux下的source insight

 書劍閣2013 2015-05-20

source insightwindows下的優(yōu)秀編輯器,適合閱讀管理代碼,主要有以下功能:

  1. 查找函數(shù),變量或者宏的定義。

  2. 查找函數(shù),變量或者宏的引用位置。

  3. 查找函數(shù)被調(diào)用的位置

  4. 查找某個符號在工程內(nèi)的所有匹配

由于unix哲學主張一個工具只做好一件事情,所以linux下并沒有這種集多樣功能于一體的軟件。vim是非常優(yōu)秀的編輯器,本文介紹如何通過安裝插件將vim武裝成和source insight一樣甚至更強大的工具。

我的環(huán)境是ubuntu12.04 LTS+vim version 7.3

1. ctags

ctags插件用來查找函數(shù),變量或者宏的定義,ubuntu下可以非常方便的安裝,

sudo apt-get install exuberant-ctag

在源文件目錄下執(zhí)行命令

ctags  -R

會生成一個tags文件,里面包含了所有源文件的符號信息。在vim中,快捷鍵ctrl+]會跳到當前函數(shù)的定義處。為了方便生產(chǎn)tags,設置快捷鍵F5生成tag,將下面命令加入到~/.vimrc

nnoremap <F5> :!ctags -R --c++-kinds=+p --fields=+iaS --extra=+q .<CR>

nnoremap 表示vim普通模式的鍵映射,

--c++-kinds=+p : 為標簽添加函數(shù)原型(prototype)信息

--fields=+iaS : 為標簽添加繼承信息(inheritance),訪問控制(access)信息,函數(shù)特征(function Signature,如參數(shù)表或原型等)

--extra=+q : 為類成員標簽添加類標識

如果項目有多層文件結(jié)構(gòu),一般只在根目錄生成一個tag文件,那么子目錄訪問不到tag文件,在子目錄中直接打開源文件將找不到函數(shù)的tag,一個方便的做法是在.vimrc中將tag加到tags的查找路徑中,每個項目一項。

project1”

set tags+=/project1/tags

ctags的快捷鍵:

ctrl+] 切換到定義處

g+ctrl+] 如果多處匹配,列出匹配tag列表供選擇

count+ctrl+t 后退counttag

count+tag 前進counttag

ts 列出匹配tag列表,存在多個匹配時

tn 跳到下一處匹配tag

tp 跳到上一處匹配tag

tf 跳到地一個匹配tag

tl 跳到最后一個匹配tag

:set tags? 查看tags文件路徑

2. cscope

Ctags只能找到符號定義的地方,如果要像source insight一樣,具備查找類似函數(shù)調(diào)用查找,符號引用查找等高級功能,就要借助于cscope了。Cscope是類似于ctags的工具,不過它的功能比ctags強大多了。

在當前源文件目錄下執(zhí)行

cscope –Rbq

其中

-R :遞歸處理子層目錄

-b :生成數(shù)據(jù)庫后自動退出

-q :生成cscope.in.outcscope.po.out文件,加快cscope的索引速度

vim打開源文件后,增加cscope數(shù)據(jù)庫到當前環(huán)境中

:cs add cscope.out

可以發(fā)現(xiàn)執(zhí)行后沒有反應,那是因為沒有打開cscopeverbose選項,打開后增加數(shù)據(jù)庫后會顯示成功還是失敗信息,默認是關閉的,我們把它打開。

:set csverb

想要查看當前已經(jīng)加載了哪些cscope數(shù)據(jù)庫

:cs show

想要刪除某個數(shù)據(jù)庫

cs kill #

安裝ctagscscope后,就有兩種數(shù)據(jù)庫了,默認會同時查看cscopectag數(shù)據(jù)庫,這個行為由cst控制,默認是打開的。

set cst

Csto控制查看數(shù)據(jù)庫的順序,等于0時優(yōu)先查看cscope數(shù)據(jù)庫,再查看ctags數(shù)據(jù)庫

set csto=0

為了方便,我們可以在.vimrc中自動增加當前路徑下的cscope數(shù)據(jù)庫

復制代碼
if has("cscope")
 set csprg=/usr/local/bin/cscope
 set csto=0
 set cst
 set csverb
 if filereadable("cscope.out")
   cs add cscope.out
 elseif $CSCOPE_DB != ""
   cs add $CSCOPE_DB
 endif
 set csverb
endif
復制代碼

 配置好以后就可以使用cscope的強大的查找功能了,cscope查找命令

cs find type name

Type包括

0或者s —— 查找name在這個工程中出現(xiàn)的位置

1或者g —— 查找name的定義

2或者d —— 查找name調(diào)用的函數(shù)

3或者c —— 查找調(diào)用name的函數(shù)

4或者t —— 查找name字符串

6或者e —— 查找egrep匹配模式

7或者f —— 查找文件

8或者i —— 查找#include 文件名為name的文件

我在平常使用的最多是查找定義和調(diào)用當前函數(shù)的函數(shù),所以在.vimrc中配置成F3F4快捷鍵,自動查找光標下符號。

nmap <F3> :cs find 3 <C-R>=expand("<cword>")<CR><CR>

nmap <F4> :cs find 0 <C-R>=expand("<cword>")<CR><CR>

3.taglist

source insight左邊是當前文件的所有符號窗口,包括include的頭文件,函數(shù)和變量。這個功能可以由taglist實現(xiàn)。Ubuntu下安裝非常方便,

vim-addons install taglist

vim-addonsvim的插件管理程序,如果沒有安裝的話可以執(zhí)行以下命令安裝

sudo apt-get install vim-addon-manager

sudo apt-get install vim-scripts

vim-addons status可以看到當前插件的安裝狀態(tài)

vim-addons install 安裝插件

vim-addons remove 刪除插件

安裝好taglist后,可以自己打開和關閉taglist窗口,

:TlistToggle

可以設置成F8快捷鍵,不過等后面安裝了winmanager后也不需要手動控制了。

nnoremap <silent> <F8> :TlistToggle<CR> F8

幾個比較實用的選項需要打開:

let Tlist_Auto_Open=1 “打開文件時自動打開taglist

let Tlist_Exit_OnlyWindow=1 “關閉文件時自動關閉taglist

let Tlist_File_Fold_Auto_Close=1 “taglist window中折疊非當前文件

let Tlist_Process_File_Always=1 “taglist始終解析文件

需要查看更多選項請help

help taglist.txt

Ctrl-w-w 跳到taglist窗口,Taglist窗口中也有快捷鍵,

<enter> 跳到光標下的tag定義的位置

u 更新taglist

zo 打開折疊

zc 關閉折疊

<tab>]] 跳到下一個文件

<BS>[[ 跳到上一個文件

4.NERDTree

Source insight右邊是文件列表窗口,顯示了工程的所有文件名。文件管理插件NERDTree具有類似的功能,該插件可以顯示當前目錄下所有文件和目錄,并方便地瀏覽和操作文件。

Vim addon manager沒有NERDTree插件,需要自己下載NERDTree,下載后將plugin/NERD_tree.vim doc/NERD_tree.txt分別復制到.vim的相應目錄下

為了讓winmanager順利打開NERDTree窗口,在.vimrc中增加下面代碼,

復制代碼
let g:NERDTree_title='[NERD Tree]'
function! NERDTree_Start()
  exec 'NERDTree'
endfunction
function! NERDTree_IsValid()
  return 1
endfunction
復制代碼

5.winmanager

為了像source insight一樣同時顯示多個窗口,需要winmanager插件。

vim-addons install winmanager

同時在winmanager中顯示NERDTreetaglist窗口,默認在左邊,

let g:winManagerWindowLayout='NERDTree|TagList'

設置快捷鍵wm打開winmanager,

nmap wm :WMToggle<cr> wm命令打開

設置窗口轉(zhuǎn)換快捷鍵,不過在用了MiniBufExplorer后有更方便的選擇,

map <c-w><c-b> :BottomExplorerWindow<cr> 跳到下面窗口

map <c-w><c-f> :FirstExplorerWindow<cr> 跳到上面窗口

最好打開vim時會自動打開winmanager窗口,

let g:AutoOpenWinManager = 1

同時修改winmanager.vim

"set auto open Winmanager
if g:AutoOpenWinManager
  autocmd VimEnter * nested call s:StartWindowsManager()|3wincmd w|q 
endif

其中3表示打開后光標在第3個窗口,即源文件窗口。1,2分別表示NERDTreetaglist窗口。

因為winmanager總會打開一個沒有用的空窗口,不知道為什么,需要最后加q關閉它。如果是用WMToggle打開winmanager的話,要關閉這個空窗口就需要在winmanager.vimToggleWindowsManager函數(shù)中增加q。

復制代碼
function! <SID>ToggleWindowsManager()  
  if IsWinManagerVisible()  
    call s:CloseWindowsManager()  
  else  
    call s:StartWindowsManager()  
    "close empty window    
   exe 'q' end
endfunction
復制代碼

更多請查看

:help winmanager

6.MiniBufExplorer

寫程序的時候肯定會多個源文件同時編輯,像source insight就有個window list,保存了最近打開過的所有源文件。Vim通過buffer來達到類似的作用,buffer的命令操作包括

ls 顯示當前打開的所有文件

bn 跳到下一個文件

bp 跳到上一個文件

bd 刪除一個buffer

MiniBufExplorer插件提供了更直觀的方式,將buffer顯示在最上端的窗口內(nèi),窗口操作包括

<Tab> 向前循環(huán)切換到每個buffer名上

<S-Tab> 向后循環(huán)切換到每個buffer名上

<Enter> 在打開光標所在的buffer

d 刪除光標所在的buffer

為了只在在源碼窗口打開選中的buffer,需要設置miniBufExplModSelTarget,默認是關閉的,

let g:miniBufExplModSelTarget = 1

不過MiniBufExplorer還有個更重要的功能是可以實現(xiàn)用CTRL鍵加h|j|k|l方便地切換窗口,

let g:miniBufExplMapWindowNavVim = 1 <CTRL-h|j|k|l>切換到上下左右窗口

7.OmniCppComplete

大部分IDE都支持自動補全功能,vim作為linux下優(yōu)秀的編輯器當然不缺少,不過vim自帶的補全功能,ctrl+n,ctrl+p可以再當前源文件中實現(xiàn)簡單的補全功能,但這是遠遠不夠的。OmniCppComplete利用了Ctags生成的tag數(shù)據(jù)庫,實現(xiàn)了文件間名字補全,包括

  • 命名空間(namespace),(class),結(jié)構(gòu)(struct)和聯(lián)合(union)補全

  • 函數(shù)屬性成員和返回值類型補全

  • "this"指針成員補全

  • C/C++類型轉(zhuǎn)換(cast)對象補全

  • 類型定義(typedef)和匿名類型(anonymous types)補全

安裝好后輸入時鍵入ctrl+x ctrl+o就會補全當前名字,使用過IDE的同學都知道補全只要一個tab鍵就行了,按這么多鍵太麻煩了。這就需要supertab插件的幫助了,

Vim-addons install supertab

安裝好后,設置以下選項,

let g:SuperTabRetainCompletionType=2
let g:SuperTabDefaultCompletionType="<C-X><C-O>"

SuperTabDefaultCompletionType設置tab鍵對應的命令,

SuperTabRetainCompletionType表示

0 - 不記錄上次的補全方式

1 - 記住上次的補全方式,直到用其他的補全命令改變它

2 - 記住上次的補全方式,直到按ESC退出插入模式為止

8.surround

在在編程時會遇到大量的匹對符號,如“,(,{ 等等,高效地處理這些符號可以大大地提高編程效率,Surround正是處理這些符號的非常優(yōu)秀等等插件。

Surround的使用非常簡單明了(*代表當前光標位置):

插入符號

Hello w*orld! ysiw) Hello (world)!

或者

Hello w*orld! veS) Hello (world)!

替換

"Hello *world!" cs"' 'Hello world!'

刪除

"Hello *world!" ds" Hello world!

總結(jié)

至此,在安裝了以上插件后,vim已經(jīng)具備了強大的編輯功能。當然,這里只是列出一些基本插件,還有很多其他有趣又好用的插件,比如注釋用的NERD_commenter.vim,高亮書簽的VisualMark,頭文件切換的a.vim等等,以后有機會再研究。

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    亚洲最新中文字幕一区| 欧美午夜色视频国产精品| 国产成人免费高潮激情电| 高潮少妇高潮久久精品99| 国产91人妻精品一区二区三区| 精品国产亚洲免费91| 国产美女精品人人做人人爽| 神马午夜福利免费视频| 亚洲黑人精品一区二区欧美| 亚洲熟女一区二区三四区| 亚洲欧美日韩熟女第一页| 久久国产精品亚州精品毛片| 不卡视频免费一区二区三区| 麻豆蜜桃星空传媒在线观看| 欧美日韩黑人免费观看| 九九热国产这里只有精品| 国产偷拍盗摄一区二区| 激情亚洲内射一区二区三区| 熟妇久久人妻中文字幕| 亚洲综合精品天堂夜夜| 亚洲中文字幕三区四区| 亚洲午夜福利视频在线| 好吊妞视频免费在线观看| 日韩人妻毛片中文字幕| 91精品欧美综合在ⅹ| 国产91色综合久久高清| 午夜国产精品福利在线观看| 国产成人精品综合久久久看| 亚洲一区在线观看蜜桃| 丁香七月啪啪激情综合| 亚洲精品国男人在线视频| 五月情婷婷综合激情综合狠狠| 亚洲国产精品国自产拍社区| 欧美一级不卡视频在线观看| 亚洲综合伊人五月天中文| 在线中文字幕亚洲欧美一区| 丰满熟女少妇一区二区三区| 午夜亚洲精品理论片在线观看| 国产欧美韩日一区二区三区| 亚洲视频在线观看你懂的| 丰满少妇被猛烈撞击在线视频 |