在CentOS 6.2上搭建vim开发环境
生活随笔
收集整理的這篇文章主要介紹了
在CentOS 6.2上搭建vim开发环境
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
在CentOS 6.2上搭建vim開發(fā)環(huán)境
最后更新日期:2013-07-05
1.首先使用Ubuntu(所在ip為192.168.16.230)翻墻登陸http://www.vim.org/,下載其上面的vim相關插件到Ubuntu的下載目錄下: cd ~/下載/ http://ctags.sourceforge.net http://cscope.sourceforge.net/ http://www.vim.org/scripts/script.php?script_id=273 http://www.vim.org/scripts/script.php?script_id=1581 http://www.vim.org/scripts/script.php?script_id=197 http://www.vim.org/scripts/script.php?script_id=95 http://www.vim.org/scripts/script.php?script_id=159 http://www.vim.org/scripts/script.php?script_id=31 http://www.vim.org/scripts/script.php?script_id=2620 http://www.vim.org/scripts/download_script.php?src_id=9679 http://www.vim.org/scripts/script.php?script_id=42 http://www.vim.org/scripts/script.php?script_id=311 使用sftp將這些壓縮包上傳到目標服務器CentOS 6.2上面 cd /usr/local/src sftp root@192.168.16.237 ls put a.vim *** quit 退出sftp,下面開始安裝。
2.在主目錄下新建目錄,開始安裝 mkdir -p ?.vim/plugin mkdir -p .vim/doc mkdir -p .vim/tags mkdir -p ~/.vim/syntax
將上述文件包轉移到~/.vim/下面,逐個安裝插件: 2.1 ctags插件(Exuberant Ctags) 生成tag文件的插件,從如下官網(wǎng) http://ctags.sourceforge.net 下載到如下源碼包ctags-5.8.tar.gz,下面使用源碼安裝方式 tar zxvf ctags-5.8.tar.gz cd ctags-5.8 ./configure make make install cd ../ 發(fā)現(xiàn)ctags是個可執(zhí)行文件,被復制到/usr/local/bin下面了。你可以使用 ctags --help 來查看該執(zhí)行文件的命令選項。
tags文件是由ctags程序產(chǎn)生的一個索引文件, ctags程序其實叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 并且比它功能強大, 是大多數(shù)Linux發(fā)行版上默認的ctags程序.?
2.2 taglist插件 這個是瀏覽源代碼的插件,直接將壓縮包解壓即可自動安裝 unzip taglist_46.zip 會在plugin和doc中各生成一個文件taglist.vim和taglist.txt 相應地在我的.vimrc中如下配置:? let Tlist_Show_One_File = 1 ? ? "不同時顯示多個文件的tag,只顯示當前文件的 let Tlist_Exit_OnlyWindow = 1 ? "如果taglist窗口是最后一個窗口,則退出vim let Tlist_Use_Right_Window = 0 ?"在右側窗口中顯示taglist窗口 (默認是0) 注意taglist插件需要tags文件,所以它需要ctags或cscope生成的tags文件。也就是說,這幾個插件是緊密聯(lián)系的。
2.3 Lookup插件 利用插入補全方式在項目中快速查找文件,緩存區(qū),目錄的插件,我們從 http://www.vim.org/scripts/scipt.php?script_id=1581 下載源碼包lookupfile-1.8.zip進行安裝 unzip lookupfile-1.8.zip 將在doc,plugin,autoload目錄下分別生成lookupfile.txt,lookupfile.vim和lookupfile.vim 注意autoload目錄是自動生成的。
Lookupfile插件還需最新的genutils插件支持,否則你打開vim時會有警告: lookupfile: You need a newer version of genutils.vim plugin 從下面的地址下載 http://www.vim.org/scripts/script.php?script_id=197 得到genutils-2.5.zip,下面直接解壓就可自動安裝好 unzip genutils-2.5.zip 發(fā)現(xiàn)它在autoload和plugin目錄中都放入了文件genutils.vim
Lookupfile在查找文件時,需要使用tags文件,它可以使用ctags命令生成的tag文件,不過效率比較低,我們專門給它生成了一個包含項目中所有文件名的tag文件。下面是具體步驟:
我編寫了下面的shell腳本make_lookupfile_tag.sh,為trafficserver-3.2.4的源代碼,生成一個文件名tag文件。
#!/bin/bash # generate tag file for lookupfile plugin echo -e "!_TAG_FILE_SORTED\t2\t/2=foldcase/" > filenametags find . -not -regex '.*\.\(png\|gif\)' -type f -printf "%f\t%p\t1\n" | \ sort -f >> filenametags? 回想一下我們在”使用標簽(tag)文件“一文中介紹的tag文件的格式。再對照腳本命令來看:
echo命令用來生成filenametags文件中的”!_TAG_FILE_SORTED”行,表明此tag文件是經(jīng)過排序的。 find命令用來查找所有類型為普通文件,文件后綴名不是.png和.gif的文件,找到的文件按”文件名\t文件路徑\t1″的格式輸出出來。 sort命令則把find命令的輸出重新排序,然后寫入filenametags文件中 在~/program_dev/trafficserver-3.2.4/目錄下運行該腳本, chmod +x make_lookupfile_tag.sh /bin/bash make_lookupfile_tag.sh 會生成一個名為filenametags的文件,包含了trafficserver-3.2.4目錄下的所有文件的名字及其所在目錄,你可以打開該文件查看并驗證。
現(xiàn)在我們需要讓lookupfile插件知道到哪去找文件名tag文件。我們假定vim當前工作目錄為~/program_dev/trafficserver-3.2.4/,執(zhí)行下面的命令: :let g:LookupFile_TagExpr = '"./filenametags"'? 注:如果不設定g:LookupFile_TagExpr的值,那么lookupfile插件會以tags選項定義的文件作為它的tag文件。 當恢復前次會話時,就給lookupfile插件定義了tag文件。
現(xiàn)在我們就可以使用lookupfile來打開文件了,按”<F5>“或輸入”:LookupFile“在當前窗口上方打開一個lookupfile小窗口,開始輸入文件名(至少4個字符),隨著你的輸入,符合條件的文件就列在下拉列表中了。文件名可以使用vim的正則表達式,這大大方便了文件的查找。你可以用”CTRL-N“和”CTRL-P“(或者用上、下光標鍵)來在下拉列表中選擇你所需的文件。選中文件后,按回車,就可以在之前的窗口中打開此文件。
2.4 cscope插件 標簽跳轉插件,從下面的網(wǎng)址下載 http://cscope.sourceforge.net/ 得到源碼包cscope-15.8a.tar.gz,下面進行源碼包安裝: tar zxvf cscope-15.8a.tar.gz cd cscope-15.8a ll ./configure make make install cd ../ 注意使用下面的命令查看到 which cscope 可執(zhí)行文件所在路徑是/usr/local/bin/cscope cscope的用法很簡單,首先需要在你的工程目錄,比如trafficserver-3.2.4下面生成一個cscope數(shù)據(jù)庫,也就是一個索引文件。cscope只在第一次解析時掃描全部文件,以后再調(diào)用cscope時,它只掃描那些改動過的文件,這大大提高了cscope生成索引的速度。
2.5 BufExplore插件 緩沖區(qū)文件瀏覽插件,從下面的地址下載 http://vim.sourceforge.net/scripts/script.php?script_id=42 直接解壓即可自動安裝 unzip bufexplorer-7.3.6.zip 將在doc和plugin目錄下分別安裝bufexplorer.txt和bufexplorer.vim文件。
2.6 winmager插件 該插件控制各插件在vim窗口中的布局顯示,從下面的地址下載 http://vim.sourceforge.net/scripts/script.php?script_id=95 得到winmanager.zip文件。 unzip winmanager.zip 把該文件在~/.vim/目錄中解壓縮,這會將如下文件解壓到~/.vim/plugin和~/.vim/doc目錄中: plugin/winmanager.vim – winmanager插件 plugin/winfileexplorer.vim ?- 改良的Explorer插件 plugin/wintagexplorer.vim – winmanager提供的tag插件,用處不大 doc/winmanager.txt – 幫助文件?
注意:winmanager插件需要與BufExplorer插件一起才能使用
2.7 直接是*.vim的插件 這樣的插件目前有 a.vim, ? ? ? ? ? ?//將.h文件與.c文件來回切換 minbufexpl.vim ? ? //快速瀏覽和操作Buffer,自如切換 直接復制到~/.vim/plugin/下面就可以了
2.8 vim自帶插件 QuickFix ? ? ? ? ? ? 編譯糾錯,顯示查詢結果窗口 new-omni-completion ?全能補全
2.9 NeoComplCache插件 自動補全插件,下載地址: http://www.vim.org/scripts/script.php?script_id=2620 將下載下來的壓縮包neocomplcache-8.0.zip使用如下命令解壓 unzip neocomplcache-8.0.zip 其解壓后文件夾里面的文件,好像是四個,autoload、doc、plugin、vest、README.MD,會自動放到.vim相應的文件夾下面。 在~/.vimrc文件里加入自動啟動的命令:? let g:neocomplcache_enable_at_startup = 1。
2.10 查看插件自帶的文檔 注意到上面各步驟中已經(jīng)把插件自帶的文檔放入$HOME/.vim/doc目錄下了,現(xiàn)在 進入vim,輸入命令:helptags $HOME/.vim/doc,vim就會自動讀取$HOME/.vim/doc目錄下的文檔, 輸入:help local-additions即可跳轉到$HOME/.vim/doc中的所有文檔列表處,用選擇要看的文檔即可。 我們可以看到,當前我們已經(jīng)安裝的插件有taglist,lookupfile,bufexplorer,winmanager插件等。
2.11 安裝vim中文幫助文檔 vim中文文檔的主頁是: http://vimcdoc.sourceforge.net/ 它將vim的help文件翻譯成為中文,已經(jīng)支持目前最新的vim 7.3。 如果想使用vim中文文檔(.cnx文件),可以遵循以下步驟: cd ~/.vim/ $wget http://nchc.dl.sourceforge.net/sourceforge/vimcdoc/vimcdoc-1.8.0.tar.gz(注意這不是真實的地址,僅作示例) tar zxvf vimcdoc-1.8.0.tar.gz ll cd vimcdoc-1.8.0 sudo ./vimcdoc.sh -i cd ../ 將會將這些文檔安裝在/usr/share/vim/,/usr/share/doc等幾個目錄下面。 啟動vim,輸入:help,看看幫助文檔是否已經(jīng)便成中文了?
2.12 grep插件 工程中正則查找插件,從下面的地址下載 http://www.vim.org/scripts/script.php?script_id=311 將得到的grep.vim直接放到~/.vim/plugin/下面就可以了。
一些注意事項: 1)vim中文文檔不會覆蓋原英文文檔,安裝后vim默認使用中文文檔。若想使用英文文檔,可在vim中執(zhí)行以下命令: :set helplang=en 同理,使用以下命令可重新使用中文文檔: :set helplang=cn 2)使用以下命令可以卸載vim中文文檔: sudo ./vimcdoc.sh -u 3)幫助文件的文本是utf-8編碼的, 如果想用vim直接查看, 需要在~/.vimrc中設置: :set encoding=utf-8
2.12語法高亮 普通一些的要求是更改色彩方案,設置如下: 首先要在你的 ~/.vimrc 文件中增加下面幾句話: syntax enable syntax on 選中你喜歡的配色方案,在.vimrc文件中做設置,比如 colorscheme desert
更個性化的需求 讓運算符號, 各種括號, 函數(shù)名, 自定義類型等也高亮起來 對各種語言的源文件(比如c,c++,php,python等)新建一個語法文件,分別存放到 /usr/share/vim/vim72/syntax/c.vim 下面,以C語言為例,新建一個文件~/.vim/syntax/c.vim 加入以下內(nèi)容 "======================================================== " Highlight All Function "======================================================== syn match ? cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>[^()]*)("me=e-2 syn match ? cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>/s*("me=e-1 hi cFunction ? ? ? ?gui=NONE guifg=#B5A1FF
"======================================================== " Highlight All Math Operator "======================================================== " C math operators syn match ? ? ? cMathOperator ? ? display "[-+/*/%=]" " C pointer operators syn match ? ? ? cPointerOperator ?display "->/|/." " C logical ? operators - boolean results syn match ? ? ? cLogicalOperator ?display "[!<>]=/=" syn match ? ? ? cLogicalOperator ?display "==" " C bit operators syn match ? ? ? cBinaryOperator ? display "/(&/||/|/^/|<</|>>/)=/=" syn match ? ? ? cBinaryOperator ? display "/~" syn match ? ? ? cBinaryOperatorError display "/~=" " More C logical operators - highlight in preference to binary syn match ? ? ? cLogicalOperator ?display "&&/|||" syn match ? ? ? cLogicalOperatorError display "/(&&/|||/)="
" Math Operator hi cMathOperator ? ? ? ? ? ?guifg=#3EFFE2 hi cPointerOperator ? ? ? ? guifg=#3EFFE2 hi cLogicalOperator ? ? ? ? guifg=#3EFFE2 hi cBinaryOperator ? ? ? ? ?guifg=#3EFFE2 hi cBinaryOperatorError ? ? guifg=#3EFFE2 hi cLogicalOperator ? ? ? ? guifg=#3EFFE2 hi cLogicalOperatorError ? ?guifg=#3EFFE2
再打開你的C文件看看, 是不是又明亮了許多. 還有一個壓箱底的要告訴你, 如果你自己增加了一個類型或者結構之類的, 怎么讓它也象"int", "void"這樣高亮起來呢? 再在上面的文件~/.vim/syntax/c.vim中添加下面的東東: "======================================================== " My Own DataType "======================================================== syn keyword cType ? ? ? My_Type_1 My_Type_2 My_Type_3 這樣你自己的類型My_Type_1, My_Type_2, My_Type_3就也可以向"int"一樣高亮起來了, 這樣的缺點是每增加一個類型, 就要手動在這里添加一下, 如果有人知道更簡單的方法請一定一定要告訴我
3.配置.vimrc文件 當vim在啟動時,如果沒有找到vimrc或gvimrc,它缺省工作VI兼容的模式。這意味著,你只能使用VI所具備的功能,而vim中的大量擴展功能將無法使用。也許這就是你的vim如此難用的原因。
vim中自帶了一個vimrc例子,以我所在的CentOS 6.2上的為例,使用下面的命令找到這個文件 locate vimrc_example.vim 發(fā)現(xiàn)它的真實目錄在 /usr/share/vim/vim72/vimrc_sample.vim 將其拷貝到我的主目錄下面 cp -f /usr/share/vim/vim72/vimrc_sample.vim ~/.vimrc 或者你在vim中執(zhí)行下面的命令,和上面的shell命令完成相同的功能: :!cp $VIMRUNTIME/vimrc_example.vim ~/.vimrc? 現(xiàn)在,你退出vim后再進入,你的vim和剛才已經(jīng)不一樣了。
你可以先讀一下你的vimrc,看看它都設定了什么: :e ~/.vimrc? 這是一個注釋良好的文件,不需要多解釋。 在今后使用vim的日子里,你會頻繁的更改你的vimrc。所以我們需要設置一些快捷方式,使我們能快速的訪問vimrc。
把下面這段內(nèi)容拷貝到你的vimrc中: 1 ? ?"Set mapleader 2 ? ?let mapleader = ";" 3 4 ? ?"Fast reloading of the .vimrc 5 ? ?map <silent> <leader>ss :source ~/.vimrc<cr> 6 ? ?"Fast editing of .vimrc 7 ? ?map <silent> <leader>ee :e ~/.vimrc<cr> 8 ? ?"When .vimrc is edited, reload it 9 ? ?autocmd! bufwritepost .vimrc source ~/.vimrc
為了方便解釋,我給每一行都加了一個行號。 在vimrc中,雙引號開頭的行,將被當作注釋忽略。 第2行,用來設置mapleader變量,當mapleader為未設置或為空時,使用缺省的”\”來作為mapleader。mapleader變量是作用是什么呢?看下面的介紹。 第5行定義了一個映射(map),這個映射把<leader>ss,映射為命令:source ~/.vimrc<cr>。當定義一個映射時,可以使用<leader>前綴。而在映射生效時,vim會把<leader>替換成mapleader變量的值。也就是說,我們這里定義的<leader>ss在使用時就變成了”,ss“,當輸入這一快捷方式時,就會source一次~/.vimrc文件(也就是重新執(zhí)行一遍.vimrc文件)。 第7行,定義了<leader>ee快捷鍵,當輸入,ee時,會打開~/.vimrc進行編輯。 第9行,定義了一個自動命令,每次寫入.vimrc后,都會執(zhí)行這個自動命令,source一次~/.vimrc文件。 有了上面的快捷鍵,我們就能快速的打開vimrc文件編輯,快速重新source vimrc文件,方便多了。
相關的配置文件參見趙攀提供的.vimrc文件的內(nèi)容。
注意:最后的源碼結構類似如下: ~--|--.vimrc |--.vim --|-plugin-- ?|-doc-- ?|-autoload ?|-vest
4.實戰(zhàn)體驗 4.1下載一個trafficserver的源碼,并以此為例來闡釋使用vim開發(fā)的方法 登陸192.168.16.237上,并在當前主目錄上新建一個program_dev目錄 ssh root@192.168.16.237 cd ~/ mkdir program_dev wget http://mirror.esocc.com/apache/trafficserver/trafficserver-3.2.4.tar.bz2 下載完成后,解壓縮 tar jxvf trafficserver-3.2.4.tar.bz2 ll
注意:使用首先生成3種類型的標簽,分別是ctags,cscope和lookupfile插件需要用到的標簽。
4.2生成ctags標簽(請參照下一種方法來生成tags并設置) ctags -R trafficserver-3.2.4 將在trafficserver-3.2.4同級目錄生成一個名為tags的文件 現(xiàn)在進入vim環(huán)境,輸入以下命令 :cd ~/program_dev/trafficserver-3.2.4 ?"切換到當前源碼目錄 :set tags=~/program_dev/tags "設置tags選項為當前目錄下的tags文件 注意這里設置tags需要明確寫出絕對路徑,否則將會導致很多函數(shù)找不到。tags文件是個純文本文件,你可以使用vim打開它看一下。
另外,根據(jù).vimrc中的配置,使用下面的快捷鍵來分別生成tags文件和cscope文件 cd trafficserver-3.2.4 find 'pwd' -name "*.cpp" -o -name "*.cc" -o -name "*.c" -o -name "*.h" > cscope.files cscope -bqk -i cscope.files ctags和cscope會自動區(qū)分和處理各自的索引。 這里注意使用cscope的方法,cscope在生成索引文件時,只搜索c,lex和yacc的文件(后綴名為.c,.h,.l,.y),要生成c++的文件索引,就得使用上面的方法,先產(chǎn)生一個文件列表cscope.files,然后讓cscope為這個列表中的每個文件都生成索引。
將上述內(nèi)容寫成一個腳本make_cscope_ctags_index.sh,其內(nèi)容如下: #!/bin/bash
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files cscope -bkq -i cscope.files ctags -R 保存在~/.vim/中,現(xiàn)在將其復制到trafficserver-3.2.4下面,并運行下面的命令 /bin/bash make_cscope_ctags_index.sh 命令在trafficserver-3.2.4下面生成如下文件 cscope.files cscope.in.out cscope.out cscope.po.out tags 經(jīng)過分析cscope.files,我們看到了很多文件。現(xiàn)在更新tags設置項 :set tags=~/program_dev/trafficserver-3.2.4/tags
至此,我們設置好了tags選項,接下來開始使用它: 在當前命令行輸入 vim -t main 這個命令將打開定義“main”(變量或函數(shù)或其它)的文件,并把光標定位到這一行。 在瀏覽源碼時,當要查詢某個函數(shù)的定義時,將光標放在該函數(shù)上,按<C-]>鍵,就會跳轉到該函數(shù)的定義處,按<C-t>鍵是返回。
注意:運行vim的時候,必須在“tags”文件所在的目錄下運行。否則,運行vim的時候還要用“:settags=”命令設定“tags”文件的路徑,這樣vim才能找到“tags”文件。 在完成編碼時,可以手工刪掉tags文件(帚把不到,灰塵不會自己跑掉^_^)。
現(xiàn)在打開編號為43的文件中的main函數(shù) 按F9打開winmanager,這時按照設置,將會出現(xiàn)3部分窗口布局。如果打開了多個文件(多緩沖區(qū)),將在最上角出現(xiàn)第四個窗口,MiniBufExplorer窗口。現(xiàn)在按住Ctrl,再連續(xù)按W,將在各個窗口之間按照逆時針順序來回切換。當然,按照趙攀的文檔,使用F2也一樣起到該作用。再按一次F9將關閉winmanager窗口布局。
當選中某個窗口時,都可以使用vim通常的移動鼠標的方式來選擇不同的標簽等,比如gg,G等快捷鍵。
將光標定位到main函數(shù)所在的文件中,將光標定位到某個函數(shù)上,按住Ctrl+]鍵,將會跳轉到該函數(shù)的定義位置。
4.3快速瀏覽和操作Buffer 用vim打開多個文件時,vim最上方會出現(xiàn)一個MiniBufExplorer窗口,其中列出了當前所有已經(jīng)打開的buffer,當你把光標置于這個窗口時(當你處于winmanager窗口布局中時,使用Ctrl+W來輪流切換), 有下面幾個快捷鍵可以用: <Tab> ? ?向前循環(huán)切換到每個buffer名上 <S-Tab> ?向后循環(huán)切換到每個buffer名上 <Enter> ?在打開光標所在的buffer d ? ? ? ?刪除光標所在的buffer 當你只編輯一個buffer的時候MiniBufExplorer派不上用場, 當你打開第二個buffer的時候, MiniBufExplorer窗口就自動彈出來了,
4.4bufexplorer插件用法 打開vim,輸入\be在當前窗口瀏覽緩存,\bs水平打開一個窗口瀏覽緩存,\bv垂直打開一個窗口瀏覽緩存。
但是在Filelist和taglist的窗口內(nèi),你可以移動上下移動光標,使用ghjk這四個鍵
附注: :cw change-word 改變到下一個詞的尾部,不含詞后面的空格
4.5Taglist窗口的快捷鍵操作 在taglist窗口中,可以使用下面的快捷鍵: <CR> ? ? ? ? ?跳到光標下tag所定義的位置,用鼠標雙擊此tag功能也一樣 o ? ? ? ? ? ? 在一個新打開的窗口中顯示光標下tag <Space> ? ? ? 顯示光標下tag的原型定義 u ? ? ? ? ? ? 更新taglist窗口中的tag s ? ? ? ? ? ? 更改排序方式,在按名字排序和按出現(xiàn)順序排序間切換 x ? ? ? ? ? ? taglist窗口放大和縮小,方便查看較長的tag + ? ? ? ? ? ? 打開一個折疊,同zo - ? ? ? ? ? ? 將tag折疊起來,同zc * ? ? ? ? ? ? 打開所有的折疊,同zR = ? ? ? ? ? ? 將所有tag折疊起來,同zM [[ ? ? ? ? ? ?跳到前一個文件 ]] ? ? ? ? ? ?跳到后一個文件 q ? ? ? ? ? ? 關閉taglist窗口 <F1> ? ? ? ? ?顯示幫助? 可以用”:TlistOpen“打開taglist窗口,用”:TlistClose“關閉taglist窗口。或者使用”:TlistToggle“在打開和關閉間切換。在我的vimrc中定義了下面的映射,使用<F9>鍵就可以打開/關閉taglist窗口: map <silent> <F8> :TlistToggle<cr>?
按照"typedef", "variable", "function"等進行了分類. 將光標移到VimMain上, 如圖中左邊紅色的方框, 按下回車后, 源程序會自動跳轉到VimMain的定義處, 如圖中右邊的紅色方框. 這就是TagList最基本也是最常用的操作。在瀏覽TagList窗口時, 如果還不想讓源碼跳轉, 但是想看看tag在源碼中完整的表達, 可以將光標移到你想要看的tag上, 如圖中上邊黃色的方框, 然后按下空格鍵, 在下面的命令欄中, 如圖下邊黃色的方框, 會顯示該tag在源碼中完整的寫法, 而不會跳轉到源碼處.
4.6cscope插件用法 在vim中使用cscope非常簡單,首先調(diào)用”cscope add“命令添加一個cscope數(shù)據(jù)庫,然后就可以調(diào)用”cscope find“命令進行查找了。vim支持8種cscope的查詢功能,如下:
s: 查找C語言符號,即查找函數(shù)名、宏、枚舉值等出現(xiàn)的地方 g: 查找函數(shù)、宏、枚舉等定義的位置,類似ctags所提供的功能 d: 查找本函數(shù)調(diào)用的函數(shù) c: 查找調(diào)用本函數(shù)的函數(shù) t: 查找指定的字符串 e: 查找egrep模式,相當于egrep功能,但查找速度快多了 f: 查找并打開文件,類似vim的find功能 i: 查找包含本文件的文件 例如,我們想在vim 7.0的源代碼中查找調(diào)用do_cscope()函數(shù)的函數(shù),我們可以輸入:”:cs find c do_cscope“,回車后發(fā)現(xiàn)沒有找到匹配的功能,可能并沒有函數(shù)調(diào)用do_cscope()。我們再輸入”:cs find s do_cscope“,查找這個C符號出現(xiàn)的位置,現(xiàn)在vim列出了這個符號出現(xiàn)的所有位置。
我們還可以進行字符串查找,它會雙引號或單引號括起來的內(nèi)容中查找。還可以輸入一個正則表達式,這類似于egrep程序的功能,但它是在交叉索引數(shù)據(jù)庫中查找,速度要快得多。
cscope的主要功能是通過同的子命令"find"來實現(xiàn)的 "cscope find"的用法: cs find c|d|e|f|g|i|s|t name 0 或 s 查找本 C 符號(可以跳過注釋) 1 或 g 查找本定義 2 或 d 查找本函數(shù)調(diào)用的函數(shù) 3 或 c 查找調(diào)用本函數(shù)的函數(shù) 4 或 t 查找本字符串 6 或 e 查找本 egrep 模式 7 或 f 查找本文件 8 或 i 查找包含本文件的文件
vim提供了一些選項可以調(diào)整它的cscope功能:
cscopecscopeprg選項用于設置cscope程序的位置。 cscopecscopequickfix設定是否使用quickfix窗口來顯示cscope的結果,詳情請”:help cscopequickfix“; 如果你想vim同時搜索tag文件以及cscope數(shù)據(jù)庫,設置cscopecscopetag選項; cscopecscopetagorder選項決定是先查找tag文件還是先查找cscope數(shù)據(jù)庫。設置為0則先查找cscope數(shù)據(jù)庫,設置為1先查找tag文件。我通常設置為1,因為在tag文件中查找到的結果,會把最佳匹配列在第一位。 vim的手冊中給出了使用cscope的建議方法,使用命令”:help cscope-suggestions“查看。
下面是我的vimrc中關于cscope接口的設置:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " cscope setting """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 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>
先在~/vimrc中增加一句: :set cscopequickfix=s-,c-,d-,i-,t-,e- 這個是設定是否使用 quickfix 窗口來顯示 cscope 結果, 用法在后面會說到。 我想查找vim_strsave()到底在那些地方被調(diào)用過了, 用命令: :cs find c vim_strsave 按下回車后vim會自動跳轉到第一個符合要求的地方, 并且在命令欄顯示有多少符合要求的結果, 如圖: 如果自動跳轉的位置你不滿意, 想看其他的結果, 可以用下面的命令打開QuickFix窗口: :cw 如圖:
4.7 quickfix窗口 QuickFix窗口的主要作用就是上面看到的那個功能: 輸出一些供選擇的結果, 可以被很多命令調(diào)用, 更詳細的介紹和使用方法請用下面的命令打開QuickFix的手冊來學習吧: :help quickfix 可以用下面的命令來跳轉: :cn ? ? ? ?// 切換到下一個結果 :cp ? ? ? ?// 切換到上一個結果 如果你經(jīng)常使用這兩個命令, 你還可以給他們設定快捷鍵, 比如在~/.vimrc中增加: nmap <F6> :cn<cr> nmap <F7> :cp<cr>
5.產(chǎn)生的疑問 5.1 cscope和ctags有啥區(qū)別? 兩者能并存,前者更強大,特別是查找字符串,前者威力更大。ctags是跳轉到標簽定義的地方,但如果想查找函數(shù)在哪里被調(diào)用,或者標簽在哪些地方出現(xiàn)過,就需要使用更為強大的cscope。
Cscope是一個交互式的屏幕下使用的工具,它被設計用來回答以下的問題: * 什么地方用到了這個符號? * 這是在什么地方定義的? * 這個變量在哪里被賦值? * 這個全局符號的定義在哪里? * 這個函數(shù)在源文件中的哪個地方? * 哪些函數(shù)調(diào)用了這個函數(shù)? * 這個函數(shù)調(diào)用了哪些函數(shù)? * 信息 "out of space" 從哪來? * 這個源文件在整個目錄結構中處于什么位置? * 哪些文件包含這個頭文件?
1.首先使用Ubuntu(所在ip為192.168.16.230)翻墻登陸http://www.vim.org/,下載其上面的vim相關插件到Ubuntu的下載目錄下: cd ~/下載/ http://ctags.sourceforge.net http://cscope.sourceforge.net/ http://www.vim.org/scripts/script.php?script_id=273 http://www.vim.org/scripts/script.php?script_id=1581 http://www.vim.org/scripts/script.php?script_id=197 http://www.vim.org/scripts/script.php?script_id=95 http://www.vim.org/scripts/script.php?script_id=159 http://www.vim.org/scripts/script.php?script_id=31 http://www.vim.org/scripts/script.php?script_id=2620 http://www.vim.org/scripts/download_script.php?src_id=9679 http://www.vim.org/scripts/script.php?script_id=42 http://www.vim.org/scripts/script.php?script_id=311 使用sftp將這些壓縮包上傳到目標服務器CentOS 6.2上面 cd /usr/local/src sftp root@192.168.16.237 ls put a.vim *** quit 退出sftp,下面開始安裝。
2.在主目錄下新建目錄,開始安裝 mkdir -p ?.vim/plugin mkdir -p .vim/doc mkdir -p .vim/tags mkdir -p ~/.vim/syntax
將上述文件包轉移到~/.vim/下面,逐個安裝插件: 2.1 ctags插件(Exuberant Ctags) 生成tag文件的插件,從如下官網(wǎng) http://ctags.sourceforge.net 下載到如下源碼包ctags-5.8.tar.gz,下面使用源碼安裝方式 tar zxvf ctags-5.8.tar.gz cd ctags-5.8 ./configure make make install cd ../ 發(fā)現(xiàn)ctags是個可執(zhí)行文件,被復制到/usr/local/bin下面了。你可以使用 ctags --help 來查看該執(zhí)行文件的命令選項。
tags文件是由ctags程序產(chǎn)生的一個索引文件, ctags程序其實叫"Exuberant Ctags", 是Unix上面ctags程序的替代品, 并且比它功能強大, 是大多數(shù)Linux發(fā)行版上默認的ctags程序.?
2.2 taglist插件 這個是瀏覽源代碼的插件,直接將壓縮包解壓即可自動安裝 unzip taglist_46.zip 會在plugin和doc中各生成一個文件taglist.vim和taglist.txt 相應地在我的.vimrc中如下配置:? let Tlist_Show_One_File = 1 ? ? "不同時顯示多個文件的tag,只顯示當前文件的 let Tlist_Exit_OnlyWindow = 1 ? "如果taglist窗口是最后一個窗口,則退出vim let Tlist_Use_Right_Window = 0 ?"在右側窗口中顯示taglist窗口 (默認是0) 注意taglist插件需要tags文件,所以它需要ctags或cscope生成的tags文件。也就是說,這幾個插件是緊密聯(lián)系的。
2.3 Lookup插件 利用插入補全方式在項目中快速查找文件,緩存區(qū),目錄的插件,我們從 http://www.vim.org/scripts/scipt.php?script_id=1581 下載源碼包lookupfile-1.8.zip進行安裝 unzip lookupfile-1.8.zip 將在doc,plugin,autoload目錄下分別生成lookupfile.txt,lookupfile.vim和lookupfile.vim 注意autoload目錄是自動生成的。
Lookupfile插件還需最新的genutils插件支持,否則你打開vim時會有警告: lookupfile: You need a newer version of genutils.vim plugin 從下面的地址下載 http://www.vim.org/scripts/script.php?script_id=197 得到genutils-2.5.zip,下面直接解壓就可自動安裝好 unzip genutils-2.5.zip 發(fā)現(xiàn)它在autoload和plugin目錄中都放入了文件genutils.vim
Lookupfile在查找文件時,需要使用tags文件,它可以使用ctags命令生成的tag文件,不過效率比較低,我們專門給它生成了一個包含項目中所有文件名的tag文件。下面是具體步驟:
我編寫了下面的shell腳本make_lookupfile_tag.sh,為trafficserver-3.2.4的源代碼,生成一個文件名tag文件。
#!/bin/bash # generate tag file for lookupfile plugin echo -e "!_TAG_FILE_SORTED\t2\t/2=foldcase/" > filenametags find . -not -regex '.*\.\(png\|gif\)' -type f -printf "%f\t%p\t1\n" | \ sort -f >> filenametags? 回想一下我們在”使用標簽(tag)文件“一文中介紹的tag文件的格式。再對照腳本命令來看:
echo命令用來生成filenametags文件中的”!_TAG_FILE_SORTED”行,表明此tag文件是經(jīng)過排序的。 find命令用來查找所有類型為普通文件,文件后綴名不是.png和.gif的文件,找到的文件按”文件名\t文件路徑\t1″的格式輸出出來。 sort命令則把find命令的輸出重新排序,然后寫入filenametags文件中 在~/program_dev/trafficserver-3.2.4/目錄下運行該腳本, chmod +x make_lookupfile_tag.sh /bin/bash make_lookupfile_tag.sh 會生成一個名為filenametags的文件,包含了trafficserver-3.2.4目錄下的所有文件的名字及其所在目錄,你可以打開該文件查看并驗證。
現(xiàn)在我們需要讓lookupfile插件知道到哪去找文件名tag文件。我們假定vim當前工作目錄為~/program_dev/trafficserver-3.2.4/,執(zhí)行下面的命令: :let g:LookupFile_TagExpr = '"./filenametags"'? 注:如果不設定g:LookupFile_TagExpr的值,那么lookupfile插件會以tags選項定義的文件作為它的tag文件。 當恢復前次會話時,就給lookupfile插件定義了tag文件。
現(xiàn)在我們就可以使用lookupfile來打開文件了,按”<F5>“或輸入”:LookupFile“在當前窗口上方打開一個lookupfile小窗口,開始輸入文件名(至少4個字符),隨著你的輸入,符合條件的文件就列在下拉列表中了。文件名可以使用vim的正則表達式,這大大方便了文件的查找。你可以用”CTRL-N“和”CTRL-P“(或者用上、下光標鍵)來在下拉列表中選擇你所需的文件。選中文件后,按回車,就可以在之前的窗口中打開此文件。
2.4 cscope插件 標簽跳轉插件,從下面的網(wǎng)址下載 http://cscope.sourceforge.net/ 得到源碼包cscope-15.8a.tar.gz,下面進行源碼包安裝: tar zxvf cscope-15.8a.tar.gz cd cscope-15.8a ll ./configure make make install cd ../ 注意使用下面的命令查看到 which cscope 可執(zhí)行文件所在路徑是/usr/local/bin/cscope cscope的用法很簡單,首先需要在你的工程目錄,比如trafficserver-3.2.4下面生成一個cscope數(shù)據(jù)庫,也就是一個索引文件。cscope只在第一次解析時掃描全部文件,以后再調(diào)用cscope時,它只掃描那些改動過的文件,這大大提高了cscope生成索引的速度。
2.5 BufExplore插件 緩沖區(qū)文件瀏覽插件,從下面的地址下載 http://vim.sourceforge.net/scripts/script.php?script_id=42 直接解壓即可自動安裝 unzip bufexplorer-7.3.6.zip 將在doc和plugin目錄下分別安裝bufexplorer.txt和bufexplorer.vim文件。
2.6 winmager插件 該插件控制各插件在vim窗口中的布局顯示,從下面的地址下載 http://vim.sourceforge.net/scripts/script.php?script_id=95 得到winmanager.zip文件。 unzip winmanager.zip 把該文件在~/.vim/目錄中解壓縮,這會將如下文件解壓到~/.vim/plugin和~/.vim/doc目錄中: plugin/winmanager.vim – winmanager插件 plugin/winfileexplorer.vim ?- 改良的Explorer插件 plugin/wintagexplorer.vim – winmanager提供的tag插件,用處不大 doc/winmanager.txt – 幫助文件?
注意:winmanager插件需要與BufExplorer插件一起才能使用
2.7 直接是*.vim的插件 這樣的插件目前有 a.vim, ? ? ? ? ? ?//將.h文件與.c文件來回切換 minbufexpl.vim ? ? //快速瀏覽和操作Buffer,自如切換 直接復制到~/.vim/plugin/下面就可以了
2.8 vim自帶插件 QuickFix ? ? ? ? ? ? 編譯糾錯,顯示查詢結果窗口 new-omni-completion ?全能補全
2.9 NeoComplCache插件 自動補全插件,下載地址: http://www.vim.org/scripts/script.php?script_id=2620 將下載下來的壓縮包neocomplcache-8.0.zip使用如下命令解壓 unzip neocomplcache-8.0.zip 其解壓后文件夾里面的文件,好像是四個,autoload、doc、plugin、vest、README.MD,會自動放到.vim相應的文件夾下面。 在~/.vimrc文件里加入自動啟動的命令:? let g:neocomplcache_enable_at_startup = 1。
2.10 查看插件自帶的文檔 注意到上面各步驟中已經(jīng)把插件自帶的文檔放入$HOME/.vim/doc目錄下了,現(xiàn)在 進入vim,輸入命令:helptags $HOME/.vim/doc,vim就會自動讀取$HOME/.vim/doc目錄下的文檔, 輸入:help local-additions即可跳轉到$HOME/.vim/doc中的所有文檔列表處,用選擇要看的文檔即可。 我們可以看到,當前我們已經(jīng)安裝的插件有taglist,lookupfile,bufexplorer,winmanager插件等。
2.11 安裝vim中文幫助文檔 vim中文文檔的主頁是: http://vimcdoc.sourceforge.net/ 它將vim的help文件翻譯成為中文,已經(jīng)支持目前最新的vim 7.3。 如果想使用vim中文文檔(.cnx文件),可以遵循以下步驟: cd ~/.vim/ $wget http://nchc.dl.sourceforge.net/sourceforge/vimcdoc/vimcdoc-1.8.0.tar.gz(注意這不是真實的地址,僅作示例) tar zxvf vimcdoc-1.8.0.tar.gz ll cd vimcdoc-1.8.0 sudo ./vimcdoc.sh -i cd ../ 將會將這些文檔安裝在/usr/share/vim/,/usr/share/doc等幾個目錄下面。 啟動vim,輸入:help,看看幫助文檔是否已經(jīng)便成中文了?
2.12 grep插件 工程中正則查找插件,從下面的地址下載 http://www.vim.org/scripts/script.php?script_id=311 將得到的grep.vim直接放到~/.vim/plugin/下面就可以了。
一些注意事項: 1)vim中文文檔不會覆蓋原英文文檔,安裝后vim默認使用中文文檔。若想使用英文文檔,可在vim中執(zhí)行以下命令: :set helplang=en 同理,使用以下命令可重新使用中文文檔: :set helplang=cn 2)使用以下命令可以卸載vim中文文檔: sudo ./vimcdoc.sh -u 3)幫助文件的文本是utf-8編碼的, 如果想用vim直接查看, 需要在~/.vimrc中設置: :set encoding=utf-8
2.12語法高亮 普通一些的要求是更改色彩方案,設置如下: 首先要在你的 ~/.vimrc 文件中增加下面幾句話: syntax enable syntax on 選中你喜歡的配色方案,在.vimrc文件中做設置,比如 colorscheme desert
更個性化的需求 讓運算符號, 各種括號, 函數(shù)名, 自定義類型等也高亮起來 對各種語言的源文件(比如c,c++,php,python等)新建一個語法文件,分別存放到 /usr/share/vim/vim72/syntax/c.vim 下面,以C語言為例,新建一個文件~/.vim/syntax/c.vim 加入以下內(nèi)容 "======================================================== " Highlight All Function "======================================================== syn match ? cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>[^()]*)("me=e-2 syn match ? cFunction "/<[a-zA-Z_][a-zA-Z_0-9]*/>/s*("me=e-1 hi cFunction ? ? ? ?gui=NONE guifg=#B5A1FF
"======================================================== " Highlight All Math Operator "======================================================== " C math operators syn match ? ? ? cMathOperator ? ? display "[-+/*/%=]" " C pointer operators syn match ? ? ? cPointerOperator ?display "->/|/." " C logical ? operators - boolean results syn match ? ? ? cLogicalOperator ?display "[!<>]=/=" syn match ? ? ? cLogicalOperator ?display "==" " C bit operators syn match ? ? ? cBinaryOperator ? display "/(&/||/|/^/|<</|>>/)=/=" syn match ? ? ? cBinaryOperator ? display "/~" syn match ? ? ? cBinaryOperatorError display "/~=" " More C logical operators - highlight in preference to binary syn match ? ? ? cLogicalOperator ?display "&&/|||" syn match ? ? ? cLogicalOperatorError display "/(&&/|||/)="
" Math Operator hi cMathOperator ? ? ? ? ? ?guifg=#3EFFE2 hi cPointerOperator ? ? ? ? guifg=#3EFFE2 hi cLogicalOperator ? ? ? ? guifg=#3EFFE2 hi cBinaryOperator ? ? ? ? ?guifg=#3EFFE2 hi cBinaryOperatorError ? ? guifg=#3EFFE2 hi cLogicalOperator ? ? ? ? guifg=#3EFFE2 hi cLogicalOperatorError ? ?guifg=#3EFFE2
再打開你的C文件看看, 是不是又明亮了許多. 還有一個壓箱底的要告訴你, 如果你自己增加了一個類型或者結構之類的, 怎么讓它也象"int", "void"這樣高亮起來呢? 再在上面的文件~/.vim/syntax/c.vim中添加下面的東東: "======================================================== " My Own DataType "======================================================== syn keyword cType ? ? ? My_Type_1 My_Type_2 My_Type_3 這樣你自己的類型My_Type_1, My_Type_2, My_Type_3就也可以向"int"一樣高亮起來了, 這樣的缺點是每增加一個類型, 就要手動在這里添加一下, 如果有人知道更簡單的方法請一定一定要告訴我
3.配置.vimrc文件 當vim在啟動時,如果沒有找到vimrc或gvimrc,它缺省工作VI兼容的模式。這意味著,你只能使用VI所具備的功能,而vim中的大量擴展功能將無法使用。也許這就是你的vim如此難用的原因。
vim中自帶了一個vimrc例子,以我所在的CentOS 6.2上的為例,使用下面的命令找到這個文件 locate vimrc_example.vim 發(fā)現(xiàn)它的真實目錄在 /usr/share/vim/vim72/vimrc_sample.vim 將其拷貝到我的主目錄下面 cp -f /usr/share/vim/vim72/vimrc_sample.vim ~/.vimrc 或者你在vim中執(zhí)行下面的命令,和上面的shell命令完成相同的功能: :!cp $VIMRUNTIME/vimrc_example.vim ~/.vimrc? 現(xiàn)在,你退出vim后再進入,你的vim和剛才已經(jīng)不一樣了。
你可以先讀一下你的vimrc,看看它都設定了什么: :e ~/.vimrc? 這是一個注釋良好的文件,不需要多解釋。 在今后使用vim的日子里,你會頻繁的更改你的vimrc。所以我們需要設置一些快捷方式,使我們能快速的訪問vimrc。
把下面這段內(nèi)容拷貝到你的vimrc中: 1 ? ?"Set mapleader 2 ? ?let mapleader = ";" 3 4 ? ?"Fast reloading of the .vimrc 5 ? ?map <silent> <leader>ss :source ~/.vimrc<cr> 6 ? ?"Fast editing of .vimrc 7 ? ?map <silent> <leader>ee :e ~/.vimrc<cr> 8 ? ?"When .vimrc is edited, reload it 9 ? ?autocmd! bufwritepost .vimrc source ~/.vimrc
為了方便解釋,我給每一行都加了一個行號。 在vimrc中,雙引號開頭的行,將被當作注釋忽略。 第2行,用來設置mapleader變量,當mapleader為未設置或為空時,使用缺省的”\”來作為mapleader。mapleader變量是作用是什么呢?看下面的介紹。 第5行定義了一個映射(map),這個映射把<leader>ss,映射為命令:source ~/.vimrc<cr>。當定義一個映射時,可以使用<leader>前綴。而在映射生效時,vim會把<leader>替換成mapleader變量的值。也就是說,我們這里定義的<leader>ss在使用時就變成了”,ss“,當輸入這一快捷方式時,就會source一次~/.vimrc文件(也就是重新執(zhí)行一遍.vimrc文件)。 第7行,定義了<leader>ee快捷鍵,當輸入,ee時,會打開~/.vimrc進行編輯。 第9行,定義了一個自動命令,每次寫入.vimrc后,都會執(zhí)行這個自動命令,source一次~/.vimrc文件。 有了上面的快捷鍵,我們就能快速的打開vimrc文件編輯,快速重新source vimrc文件,方便多了。
相關的配置文件參見趙攀提供的.vimrc文件的內(nèi)容。
注意:最后的源碼結構類似如下: ~--|--.vimrc |--.vim --|-plugin-- ?|-doc-- ?|-autoload ?|-vest
4.實戰(zhàn)體驗 4.1下載一個trafficserver的源碼,并以此為例來闡釋使用vim開發(fā)的方法 登陸192.168.16.237上,并在當前主目錄上新建一個program_dev目錄 ssh root@192.168.16.237 cd ~/ mkdir program_dev wget http://mirror.esocc.com/apache/trafficserver/trafficserver-3.2.4.tar.bz2 下載完成后,解壓縮 tar jxvf trafficserver-3.2.4.tar.bz2 ll
注意:使用首先生成3種類型的標簽,分別是ctags,cscope和lookupfile插件需要用到的標簽。
4.2生成ctags標簽(請參照下一種方法來生成tags并設置) ctags -R trafficserver-3.2.4 將在trafficserver-3.2.4同級目錄生成一個名為tags的文件 現(xiàn)在進入vim環(huán)境,輸入以下命令 :cd ~/program_dev/trafficserver-3.2.4 ?"切換到當前源碼目錄 :set tags=~/program_dev/tags "設置tags選項為當前目錄下的tags文件 注意這里設置tags需要明確寫出絕對路徑,否則將會導致很多函數(shù)找不到。tags文件是個純文本文件,你可以使用vim打開它看一下。
另外,根據(jù).vimrc中的配置,使用下面的快捷鍵來分別生成tags文件和cscope文件 cd trafficserver-3.2.4 find 'pwd' -name "*.cpp" -o -name "*.cc" -o -name "*.c" -o -name "*.h" > cscope.files cscope -bqk -i cscope.files ctags和cscope會自動區(qū)分和處理各自的索引。 這里注意使用cscope的方法,cscope在生成索引文件時,只搜索c,lex和yacc的文件(后綴名為.c,.h,.l,.y),要生成c++的文件索引,就得使用上面的方法,先產(chǎn)生一個文件列表cscope.files,然后讓cscope為這個列表中的每個文件都生成索引。
將上述內(nèi)容寫成一個腳本make_cscope_ctags_index.sh,其內(nèi)容如下: #!/bin/bash
find . -name "*.h" -o -name "*.c" -o -name "*.cc" > cscope.files cscope -bkq -i cscope.files ctags -R 保存在~/.vim/中,現(xiàn)在將其復制到trafficserver-3.2.4下面,并運行下面的命令 /bin/bash make_cscope_ctags_index.sh 命令在trafficserver-3.2.4下面生成如下文件 cscope.files cscope.in.out cscope.out cscope.po.out tags 經(jīng)過分析cscope.files,我們看到了很多文件。現(xiàn)在更新tags設置項 :set tags=~/program_dev/trafficserver-3.2.4/tags
至此,我們設置好了tags選項,接下來開始使用它: 在當前命令行輸入 vim -t main 這個命令將打開定義“main”(變量或函數(shù)或其它)的文件,并把光標定位到這一行。 在瀏覽源碼時,當要查詢某個函數(shù)的定義時,將光標放在該函數(shù)上,按<C-]>鍵,就會跳轉到該函數(shù)的定義處,按<C-t>鍵是返回。
注意:運行vim的時候,必須在“tags”文件所在的目錄下運行。否則,運行vim的時候還要用“:settags=”命令設定“tags”文件的路徑,這樣vim才能找到“tags”文件。 在完成編碼時,可以手工刪掉tags文件(帚把不到,灰塵不會自己跑掉^_^)。
現(xiàn)在打開編號為43的文件中的main函數(shù) 按F9打開winmanager,這時按照設置,將會出現(xiàn)3部分窗口布局。如果打開了多個文件(多緩沖區(qū)),將在最上角出現(xiàn)第四個窗口,MiniBufExplorer窗口。現(xiàn)在按住Ctrl,再連續(xù)按W,將在各個窗口之間按照逆時針順序來回切換。當然,按照趙攀的文檔,使用F2也一樣起到該作用。再按一次F9將關閉winmanager窗口布局。
當選中某個窗口時,都可以使用vim通常的移動鼠標的方式來選擇不同的標簽等,比如gg,G等快捷鍵。
將光標定位到main函數(shù)所在的文件中,將光標定位到某個函數(shù)上,按住Ctrl+]鍵,將會跳轉到該函數(shù)的定義位置。
4.3快速瀏覽和操作Buffer 用vim打開多個文件時,vim最上方會出現(xiàn)一個MiniBufExplorer窗口,其中列出了當前所有已經(jīng)打開的buffer,當你把光標置于這個窗口時(當你處于winmanager窗口布局中時,使用Ctrl+W來輪流切換), 有下面幾個快捷鍵可以用: <Tab> ? ?向前循環(huán)切換到每個buffer名上 <S-Tab> ?向后循環(huán)切換到每個buffer名上 <Enter> ?在打開光標所在的buffer d ? ? ? ?刪除光標所在的buffer 當你只編輯一個buffer的時候MiniBufExplorer派不上用場, 當你打開第二個buffer的時候, MiniBufExplorer窗口就自動彈出來了,
4.4bufexplorer插件用法 打開vim,輸入\be在當前窗口瀏覽緩存,\bs水平打開一個窗口瀏覽緩存,\bv垂直打開一個窗口瀏覽緩存。
但是在Filelist和taglist的窗口內(nèi),你可以移動上下移動光標,使用ghjk這四個鍵
附注: :cw change-word 改變到下一個詞的尾部,不含詞后面的空格
4.5Taglist窗口的快捷鍵操作 在taglist窗口中,可以使用下面的快捷鍵: <CR> ? ? ? ? ?跳到光標下tag所定義的位置,用鼠標雙擊此tag功能也一樣 o ? ? ? ? ? ? 在一個新打開的窗口中顯示光標下tag <Space> ? ? ? 顯示光標下tag的原型定義 u ? ? ? ? ? ? 更新taglist窗口中的tag s ? ? ? ? ? ? 更改排序方式,在按名字排序和按出現(xiàn)順序排序間切換 x ? ? ? ? ? ? taglist窗口放大和縮小,方便查看較長的tag + ? ? ? ? ? ? 打開一個折疊,同zo - ? ? ? ? ? ? 將tag折疊起來,同zc * ? ? ? ? ? ? 打開所有的折疊,同zR = ? ? ? ? ? ? 將所有tag折疊起來,同zM [[ ? ? ? ? ? ?跳到前一個文件 ]] ? ? ? ? ? ?跳到后一個文件 q ? ? ? ? ? ? 關閉taglist窗口 <F1> ? ? ? ? ?顯示幫助? 可以用”:TlistOpen“打開taglist窗口,用”:TlistClose“關閉taglist窗口。或者使用”:TlistToggle“在打開和關閉間切換。在我的vimrc中定義了下面的映射,使用<F9>鍵就可以打開/關閉taglist窗口: map <silent> <F8> :TlistToggle<cr>?
按照"typedef", "variable", "function"等進行了分類. 將光標移到VimMain上, 如圖中左邊紅色的方框, 按下回車后, 源程序會自動跳轉到VimMain的定義處, 如圖中右邊的紅色方框. 這就是TagList最基本也是最常用的操作。在瀏覽TagList窗口時, 如果還不想讓源碼跳轉, 但是想看看tag在源碼中完整的表達, 可以將光標移到你想要看的tag上, 如圖中上邊黃色的方框, 然后按下空格鍵, 在下面的命令欄中, 如圖下邊黃色的方框, 會顯示該tag在源碼中完整的寫法, 而不會跳轉到源碼處.
4.6cscope插件用法 在vim中使用cscope非常簡單,首先調(diào)用”cscope add“命令添加一個cscope數(shù)據(jù)庫,然后就可以調(diào)用”cscope find“命令進行查找了。vim支持8種cscope的查詢功能,如下:
s: 查找C語言符號,即查找函數(shù)名、宏、枚舉值等出現(xiàn)的地方 g: 查找函數(shù)、宏、枚舉等定義的位置,類似ctags所提供的功能 d: 查找本函數(shù)調(diào)用的函數(shù) c: 查找調(diào)用本函數(shù)的函數(shù) t: 查找指定的字符串 e: 查找egrep模式,相當于egrep功能,但查找速度快多了 f: 查找并打開文件,類似vim的find功能 i: 查找包含本文件的文件 例如,我們想在vim 7.0的源代碼中查找調(diào)用do_cscope()函數(shù)的函數(shù),我們可以輸入:”:cs find c do_cscope“,回車后發(fā)現(xiàn)沒有找到匹配的功能,可能并沒有函數(shù)調(diào)用do_cscope()。我們再輸入”:cs find s do_cscope“,查找這個C符號出現(xiàn)的位置,現(xiàn)在vim列出了這個符號出現(xiàn)的所有位置。
我們還可以進行字符串查找,它會雙引號或單引號括起來的內(nèi)容中查找。還可以輸入一個正則表達式,這類似于egrep程序的功能,但它是在交叉索引數(shù)據(jù)庫中查找,速度要快得多。
cscope的主要功能是通過同的子命令"find"來實現(xiàn)的 "cscope find"的用法: cs find c|d|e|f|g|i|s|t name 0 或 s 查找本 C 符號(可以跳過注釋) 1 或 g 查找本定義 2 或 d 查找本函數(shù)調(diào)用的函數(shù) 3 或 c 查找調(diào)用本函數(shù)的函數(shù) 4 或 t 查找本字符串 6 或 e 查找本 egrep 模式 7 或 f 查找本文件 8 或 i 查找包含本文件的文件
vim提供了一些選項可以調(diào)整它的cscope功能:
cscopecscopeprg選項用于設置cscope程序的位置。 cscopecscopequickfix設定是否使用quickfix窗口來顯示cscope的結果,詳情請”:help cscopequickfix“; 如果你想vim同時搜索tag文件以及cscope數(shù)據(jù)庫,設置cscopecscopetag選項; cscopecscopetagorder選項決定是先查找tag文件還是先查找cscope數(shù)據(jù)庫。設置為0則先查找cscope數(shù)據(jù)庫,設置為1先查找tag文件。我通常設置為1,因為在tag文件中查找到的結果,會把最佳匹配列在第一位。 vim的手冊中給出了使用cscope的建議方法,使用命令”:help cscope-suggestions“查看。
下面是我的vimrc中關于cscope接口的設置:
""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" " cscope setting """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" 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>
先在~/vimrc中增加一句: :set cscopequickfix=s-,c-,d-,i-,t-,e- 這個是設定是否使用 quickfix 窗口來顯示 cscope 結果, 用法在后面會說到。 我想查找vim_strsave()到底在那些地方被調(diào)用過了, 用命令: :cs find c vim_strsave 按下回車后vim會自動跳轉到第一個符合要求的地方, 并且在命令欄顯示有多少符合要求的結果, 如圖: 如果自動跳轉的位置你不滿意, 想看其他的結果, 可以用下面的命令打開QuickFix窗口: :cw 如圖:
4.7 quickfix窗口 QuickFix窗口的主要作用就是上面看到的那個功能: 輸出一些供選擇的結果, 可以被很多命令調(diào)用, 更詳細的介紹和使用方法請用下面的命令打開QuickFix的手冊來學習吧: :help quickfix 可以用下面的命令來跳轉: :cn ? ? ? ?// 切換到下一個結果 :cp ? ? ? ?// 切換到上一個結果 如果你經(jīng)常使用這兩個命令, 你還可以給他們設定快捷鍵, 比如在~/.vimrc中增加: nmap <F6> :cn<cr> nmap <F7> :cp<cr>
5.產(chǎn)生的疑問 5.1 cscope和ctags有啥區(qū)別? 兩者能并存,前者更強大,特別是查找字符串,前者威力更大。ctags是跳轉到標簽定義的地方,但如果想查找函數(shù)在哪里被調(diào)用,或者標簽在哪些地方出現(xiàn)過,就需要使用更為強大的cscope。
Cscope是一個交互式的屏幕下使用的工具,它被設計用來回答以下的問題: * 什么地方用到了這個符號? * 這是在什么地方定義的? * 這個變量在哪里被賦值? * 這個全局符號的定義在哪里? * 這個函數(shù)在源文件中的哪個地方? * 哪些函數(shù)調(diào)用了這個函數(shù)? * 這個函數(shù)調(diào)用了哪些函數(shù)? * 信息 "out of space" 從哪來? * 這個源文件在整個目錄結構中處于什么位置? * 哪些文件包含這個頭文件?
總結
以上是生活随笔為你收集整理的在CentOS 6.2上搭建vim开发环境的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vim学习笔记(三)
- 下一篇: PHP函数printf()、sprint