十多年實(shí)戰(zhàn)總結(jié)linux下vim編輯.docx_第1頁(yè)
十多年實(shí)戰(zhàn)總結(jié)linux下vim編輯.docx_第2頁(yè)
十多年實(shí)戰(zhàn)總結(jié)linux下vim編輯.docx_第3頁(yè)
十多年實(shí)戰(zhàn)總結(jié)linux下vim編輯.docx_第4頁(yè)
十多年實(shí)戰(zhàn)總結(jié)linux下vim編輯.docx_第5頁(yè)
已閱讀5頁(yè),還剩18頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Linux 下Vim+ctags編輯,查看代碼和編輯代碼,運(yùn)用熟練比可視化軟件工具編寫(xiě)快很多。邊看邊操作,以后也要經(jīng)常養(yǎng)成用命令的習(xí)慣。忘記了就查閱。很棒的,值得收藏。首先簡(jiǎn)介下vim一些命令,然后再介紹Vim+ctags做代碼開(kāi)發(fā)。1. 查找 /xxx(?xxx) 表示在整篇文檔中搜索匹配xxx的字符串, / 表示向下查找, ? 表示 向上查找.其中xxx可以是正規(guī)表達(dá)式,關(guān)于正規(guī)式就不多說(shuō)了. 一般來(lái)說(shuō)是區(qū)分大小寫(xiě)的, 要想不區(qū)分大小寫(xiě), 那得先輸入 :set ignorecase 查找到以后, 再輸入 n 查找下一個(gè)匹配處, 輸入 N 反方向查找. *(#) 當(dāng)光標(biāo)停留在某個(gè)單詞上時(shí), 輸入這條命令表示查找與該單詞匹配的 下(上)一個(gè)單詞. 同樣, 再輸入 n 查找下一個(gè)匹配處, 輸入 N 反方 向查找. g*(g#) 此命令與上條命令相似, 只不過(guò)它不完全匹配光標(biāo)所在處的單詞, 而 是匹配包含該單詞的所有字符串. gd 本命令查找與光標(biāo)所在單詞相匹配的單詞, 并將光標(biāo)停留在文檔的非 注釋段中第一次出現(xiàn)這個(gè)單詞的地方. % 本命令查找與光標(biāo)所在處相匹配的反括號(hào), 包括 () f(F)x 本命令表示在光標(biāo)所在行進(jìn)行查找, 查找光標(biāo)右(左)方第一個(gè)x字符. 找到后: 輸入 ; 表示繼續(xù)往下找 輸入 , 表示反方向查找2. 快速移動(dòng)光標(biāo) 在 vi 中, 移動(dòng)光標(biāo)和編輯是兩件事, 正因?yàn)閰^(qū)分開(kāi)來(lái), 所以可以很方便的進(jìn)行光標(biāo)定位和編輯. 因此能更快一點(diǎn)移動(dòng)光標(biāo)是很有用的. w(e) 移動(dòng)光標(biāo)到下一個(gè)單詞. b 移動(dòng)光標(biāo)到上一個(gè)單詞. 0 移動(dòng)光標(biāo)到本行最開(kāi)頭. 移動(dòng)光標(biāo)到本行最開(kāi)頭的字符處. $ 移動(dòng)光標(biāo)到本行結(jié)尾處. H 移動(dòng)光標(biāo)到屏幕的首行. M 移動(dòng)光標(biāo)到屏幕的中間一行. L 移動(dòng)光標(biāo)到屏幕的尾行. gg 移動(dòng)光標(biāo)到文檔首行. G 移動(dòng)光標(biāo)到文檔尾行. c-f (即 ctrl 鍵與 f 鍵一同按下) 本命令即 page down. c-b (即 ctrl 鍵與 b 鍵一同按下, 后同) 本命令即 page up. 此命令相當(dāng)有用, 它移動(dòng)光標(biāo)到上一個(gè)標(biāo)記處, 比如用 gd, * 等查 找到某個(gè)單詞后, 再輸入此命令則回到上次停留的位置. . 此命令相當(dāng)好使, 它移動(dòng)光標(biāo)到上一次的修改行. . 此命令相當(dāng)強(qiáng)大, 它移動(dòng)光標(biāo)到上一次的修改點(diǎn).3. 拷貝, 刪除與粘貼 在 vi 中 y 表示拷貝, d 表示刪除, p 表示粘貼. 其中拷貝與刪除是與光標(biāo)移動(dòng)命令結(jié)合的, 看幾個(gè)例子就能夠明白了. yw 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在單詞結(jié)尾的內(nèi)容. dw 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在單詞結(jié)尾的內(nèi)容. y0 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在行首的內(nèi)容. d0 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行首的內(nèi)容. y$ 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容. d$ 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容. yfa 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)后面的第一個(gè)a字符之間的內(nèi)容. dfa 表示刪除從當(dāng)前光標(biāo)到光標(biāo)后面的第一個(gè)a字符之間的內(nèi)容. 特殊地: yy 表示拷貝光標(biāo)所在行. dd 表示刪除光標(biāo)所在行. D 表示刪除從當(dāng)前光標(biāo)到光標(biāo)所在行尾的內(nèi)容. 關(guān)于拷貝, 刪除和粘貼的復(fù)雜用法與寄存器有關(guān), 可以自行查詢.4. 數(shù)字與命令 在 vi 中數(shù)字與命令結(jié)合往往表示重復(fù)進(jìn)行此命令, 若在擴(kuò)展模式的開(kāi)頭出現(xiàn)則表示行號(hào)定位. 如: 5fx 表示查找光標(biāo)后第 5 個(gè) x 字符. 5w(e) 移動(dòng)光標(biāo)到下五個(gè)單詞. 5yy 表示拷貝光標(biāo)以下 5 行. 5dd 表示刪除光標(biāo)以下 5 行. y2fa 表示拷貝從當(dāng)前光標(biāo)到光標(biāo)后面的第二個(gè)a字符之間的內(nèi)容. :12,24y 表示拷貝第12行到第24行之間的內(nèi)容. :12,y 表示拷貝第12行到光標(biāo)所在行之間的內(nèi)容. :,24y 表示拷貝光標(biāo)所在行到第24行之間的內(nèi)容. 刪除類(lèi)似.5. 快速輸入字符 在 vi 中, 不要求你輸入每一個(gè)字符, 可以有很多種方法快速輸入一些字符. 使用 linux/unix 的同學(xué)一定有一個(gè)經(jīng)驗(yàn), 在命令行下輸入命令時(shí)敲入頭幾個(gè)字符再按TAB 系統(tǒng)就會(huì)自動(dòng)將剩下的字符補(bǔ)齊, 假如有多個(gè)匹配則會(huì)打印出來(lái). 這就是著名的命令補(bǔ)齊(其實(shí)windows中也有文件名補(bǔ)齊功能). vi 中有許多的字符串補(bǔ)齊命令, 非常方便. c-p(c-n) 在編輯模式中, 輸入幾個(gè)字符后再輸入此命令則 vi 開(kāi)始向上(下)搜 索開(kāi)頭與其匹配的單詞并補(bǔ)齊, 不斷輸入此命令則循環(huán)查找. 此命令 會(huì)在所有在這個(gè) vim 程序中打開(kāi)的文件中進(jìn)行匹配. c-x-l 在編輯模式中, 此命令快速補(bǔ)齊整行內(nèi)容, 但是僅在本窗口中出現(xiàn)的 文檔中進(jìn)行匹配. c-x-f 在編輯模式中, 這個(gè)命令表示補(bǔ)齊文件名. 如輸入: /usr/local/tom 后再輸入此命令則它會(huì)自動(dòng)匹配出: /usr/local/tomcat/ abbr 即縮寫(xiě). 這是一個(gè)宏操作, 可以在編輯模式中用一個(gè)縮寫(xiě)代替另一個(gè) 字符串. 比如編寫(xiě)java文件的常常輸入 System.out.println, 這很 是麻煩, 所以應(yīng)該用縮寫(xiě)來(lái)減少敲字. 可以這么做: :abbr sprt System.out.println 以后在輸入sprt后再輸入其他非字母符號(hào), 它就會(huì)自動(dòng)擴(kuò)展為System. out.println6. 替換 替換是 vi 的強(qiáng)項(xiàng), 因?yàn)榭梢杂谜?guī)表達(dá)式來(lái)匹配字符串.以下提供幾個(gè)例子. :s/aa/bb/g 將光標(biāo)所在行出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb :s/bb/g 將光標(biāo)所在行出現(xiàn)的所有 aa 替換為 bb, 僅替換 aa 這個(gè)單詞 :%s/aa/bb/g 將文檔中出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb :12,23s/aa/bb/g 將從12行到23行中出現(xiàn)的所有包含 aa 的字符串中的 aa 替換為 bb :12,23s/#/ 將從12行到23行的行首加入 # 字符 :%s= *$= 將所有行尾多余的空格刪除 :g/s*$/d 將所有不包含字符(空格也不包含)的空行刪除.7. 多文件編輯 在一個(gè) vim 程序中打開(kāi)很多文件進(jìn)行編輯是挺方便的. :sp(:vsp) 文件名 vim 將分割出一個(gè)橫(縱)向窗口, 并在該窗口中打開(kāi)新文件. 從 vim6.0 開(kāi)始, 文件名可以是一個(gè)目錄的名稱(chēng), 這樣, vim 會(huì) 把該目錄打開(kāi)并顯示文件列表, 在文件名上按回車(chē)則在本窗口打 開(kāi)該文件, 若輸入 O 則在新窗口中打開(kāi)該文件, 輸入 ? 可以看 到幫助信息. :e 文件名 vim 將在原窗口中打開(kāi)新的文件, 若舊文件編輯過(guò), 會(huì)要求保存. c-w-w vim 分割了好幾個(gè)窗口怎么辦? 輸入此命令可以將光標(biāo)循環(huán)定位 到各個(gè)窗口之中. :ls 此命令查看本 vim 程序已經(jīng)打開(kāi)了多少個(gè)文件, 在屏幕的最下方 會(huì)顯示出如下數(shù)據(jù): 1 %a usevim.html 行 162 2 # xxxxxx.html 行 0 其中: 1 表示打開(kāi)的文件序號(hào), 這個(gè)序號(hào)很有用處. %a 表示文件代號(hào), % 表示當(dāng)前編輯的文件, # 表示上次編輯的文件 usevim.html 表示文件名. 行 162 表示光標(biāo)位置. :b 序號(hào)(代號(hào)) 此命令將指定序號(hào)(代號(hào))的文件在本窗口打開(kāi), 其中的序號(hào)(代號(hào)) 就是用 :ls 命令看到的. :set diff 此命令用于比較兩個(gè)文件, 可以用 :vsp filename 命令打開(kāi)另一個(gè)文件, 然后在每個(gè)文件窗口中輸入此命令,就能看 到效果了.8. 宏替換 vi 不僅可以用 abbr 來(lái)替換文字, 也可以進(jìn)行命令的宏定義. 有些命令輸起來(lái)很費(fèi)勁,因此我把它們定義到 - 上, 這樣就很方便了.這些配置可以預(yù)先寫(xiě)到 /.vimrc(windows 下為 $VIM/_vimrc) 中, 寫(xiě)進(jìn)去的時(shí)候不用寫(xiě)前面的冒號(hào). :nmap :nohls 取消被搜索字串的高亮 :nmap w 命令模式下轉(zhuǎn)移光標(biāo)到不同窗口 :imap 輸入模式下運(yùn)行 :nmap :%s= *$= 刪除所有行尾多余的空格. :imap 同上 :java 中: (注, 這里為什么說(shuō) java 中, 因?yàn)橐韵露x對(duì)其他文件格式不起作用, 下文 會(huì)說(shuō)到如何實(shí)現(xiàn)這一點(diǎn)) :nmap :comp javac:mak -d . % 此命令用 javac 編譯 java 文件, 它會(huì)自動(dòng)將光標(biāo)定位到出錯(cuò)點(diǎn). 不過(guò)這需要定 義一個(gè) javac.vim 文件在 $VIM/compiler 下, 在 javac.vim 里面只有兩行字: setlocal makeprg=javac setlocal errorformat=%A%f:%l: %m,%-Z%p,%-C%.%# :nmap :comp ant:mak 此命令用 ant 編譯 java 文件, 它會(huì)自動(dòng)將光標(biāo)定位到出錯(cuò)點(diǎn). 一般來(lái)說(shuō), 安裝 vim 后已經(jīng)有了compiler/ant.vim文件, 因此這個(gè)命令可以直接使用. 但是需要 在當(dāng)前目錄下有 build.xml 文件, 當(dāng)然還必須安裝 ant 才行. :nmap :cl 此命令用于查看所有的編譯錯(cuò)誤. :imap :nmap :cc 此命令用于查看當(dāng)前的編譯錯(cuò)誤. :imap :nmap :cn 此命令用于跳到下一個(gè)出錯(cuò)位置. :imap :nmap :cp 此命令用于跳到上一個(gè)出錯(cuò)位置. :imap :nmap :JavaBrowser 此命令用于在窗口左部分割出一個(gè)新窗口, 里面的內(nèi)容是 java 的資源樹(shù), 包括 本文件中出現(xiàn)的類(lèi), 類(lèi)的成員變量及成員方法, 就好像 JCreator 表現(xiàn)的那樣. 在這個(gè)窗口中輸入 ? 會(huì)看到幫助. 嘿嘿, 很好用, 不過(guò)需要 ctags 支持. :imap 9. TAB TAB 就是制表符, 單獨(dú)拿出來(lái)做一節(jié)是因?yàn)檫@個(gè)東西確實(shí)很有用. 輸入此命令則光標(biāo)所在行向右移動(dòng)一個(gè) tab. 5 輸入此命令則光標(biāo)后 5 行向右移動(dòng)一個(gè) tab. :12,24 此命令將12行到14行的數(shù)據(jù)都向右移動(dòng)一個(gè) tab. :12,24 此命令將12行到14行的數(shù)據(jù)都向右移動(dòng)兩個(gè) tab. 那么如何定義 tab 的大小呢? 有人愿意使用 8 個(gè)空格位, 有人用4個(gè), 有的用2個(gè). 有的人希望 tab 完全用空格代替, 也有的人希望 tab 就是 tab. 沒(méi)關(guān)系, vim 能 幫助你.以下的設(shè)置一般也都先寫(xiě)入配置文件中, 免得老敲. :set shiftwidth=4 設(shè)置自動(dòng)縮進(jìn) 4 個(gè)空格, 當(dāng)然要設(shè)自動(dòng)縮進(jìn)先. :set sts=4 即設(shè)置 softtabstop 為 4. 輸入 tab 后就跳了 4 格. :set tabstop=4 實(shí)際的 tab 即為 4 個(gè)空格, 而不是缺省的 8 個(gè). :set expandtab 在輸入 tab 后, vim 用恰當(dāng)?shù)目崭駚?lái)填充這個(gè) tab.10. autocmd 這個(gè)命令十分的強(qiáng)大, 可以用這個(gè)命令實(shí)現(xiàn)對(duì)不同的文件格式應(yīng)用不同的配置; 可以在新建文件時(shí)自動(dòng)添加上版權(quán)聲明等等. 這些命令一般定義在 /.vimrc 這樣的配置文件里面. 由于他很強(qiáng)大, 所以我不能給出很具體的說(shuō)明, 只能舉幾個(gè)例子, 詳細(xì)的請(qǐng)看幫助. :autocmd! 刪除所有之前的自動(dòng)命令. autocmd FileType java source /.vim/files/java.vim autocmd FileType java source /.vim/files/jcommenter.vim 以上兩條命令讓我在打開(kāi) java 文件時(shí)才應(yīng)用后面提到的兩個(gè)配置文件. autocmd BufNewFile *.java 0r /.vim/files/skeletons/java.skel 以上這條命令讓我在新建 java 文件時(shí)自動(dòng)加入 java.skel 文件的內(nèi)容. autocmd BufNewFile *.java normal gnp 以上這條命令讓我在新建 java 文件時(shí)自動(dòng)運(yùn)行 gnp 命令, 這個(gè)命令進(jìn)行一些特殊化 處理, 比如將新 java 文件中的 _date_ 替換成今天的日期什么的.11. 常用腳本 在 你可以發(fā)現(xiàn)很多腳本(script), 這些腳本常常有讓你意想不到的作用.我常用的有: jcommenter.vim 自動(dòng)加入 javadoc 風(fēng)格的注釋. JBrowser.vim 類(lèi)資源瀏覽. C, C+ 等可以用 Tlist 還有許多有用的, 比如 checkstyle.vim 可以檢驗(yàn)?zāi)愕木幊田L(fēng)格, jad.vim 可以直接 反編譯 .class 文件等等.12. 常用配置 在/.vimrc 配置文件中你常常需要一些個(gè)性化配置. 比如上面寫(xiě)的一些宏定義, 一些autocmd 定義等等. 比如: set suffixes=.bak,.o,.h,.info,.swp,.aux,.bbl,.blg,.dvi,.lof,.log,.lot,.ps,.toc 這樣在vim中打開(kāi)文件時(shí), 按 tab 鍵補(bǔ)齊文件名時(shí)它會(huì)忽略上述文件. set nu 顯示行號(hào) set ai 設(shè)置自動(dòng)縮進(jìn) map Y y$ 讓 Y 和 D 一樣, 要不然 Y 的本意和 yy 一樣.vim+ctags用法:/home/brimmer/src$ctags-R-R表示遞歸創(chuàng)建,也就包括源代碼根目錄下的所有子目錄下的源程序。tags文件中包括這些對(duì)象的列表:l用#define定義的宏l枚舉型變量的值l函數(shù)的定義、原型和聲明l名字空間(namespace)l類(lèi)型定義(typedefs)l變量(包括定義和聲明)l類(lèi)(class)、結(jié)構(gòu)(struct)、枚舉類(lèi)型(enum)和聯(lián)合(union)l類(lèi)、結(jié)構(gòu)和聯(lián)合中成員變量或函數(shù)VIM用這個(gè)tags文件來(lái)定位上面這些做了標(biāo)記的對(duì)象,下面介紹一下定位這些對(duì)象的方法:1)用命令行。在運(yùn)行vim的時(shí)候加上-t參數(shù),例如:/home/brimmer/src$vim-t foo_bar這個(gè)命令將打開(kāi)定義foo_bar(變量或函數(shù)或其它)的文件,并把光標(biāo)定位到這一行。2)在vim編輯器內(nèi)用:ta命令,例如::ta foo_bar3)最方便的方法是把光標(biāo)移到變量名或函數(shù)名上,然后按下Ctrl-。用Ctrl-o退回原來(lái)的地方。注意:運(yùn)行vim的時(shí)候,必須在tags文件所在的目錄下運(yùn)行。否則,運(yùn)行vim的時(shí)候還要用:set tags=命令設(shè)定tags文件的路徑,這樣vim才能找到tags文件。在函數(shù)中移動(dòng)光標(biāo)轉(zhuǎn)到上一個(gè)位于第一列的轉(zhuǎn)到下一個(gè)位于第一列的轉(zhuǎn)到上一個(gè)空行轉(zhuǎn)到下一個(gè)空行g(shù)d轉(zhuǎn)到當(dāng)前光標(biāo)所指的局部變量的定義*轉(zhuǎn)到當(dāng)前光標(biāo)所指的單詞下一次出現(xiàn)的地方#轉(zhuǎn)到當(dāng)前光標(biāo)所指的單詞上一次出現(xiàn)的地方Vim的創(chuàng)造者是一名計(jì)算機(jī)程序員,因此這就不奇怪Vim中有許多幫助編寫(xiě)程序的功能:跳轉(zhuǎn)到標(biāo)識(shí)符被定義和使用的地方;在另一個(gè)窗口中預(yù)覽有關(guān)的聲明等等。在下一章中還會(huì)介紹更多的功能。使用標(biāo)簽什么是標(biāo)簽?標(biāo)簽就是一個(gè)標(biāo)識(shí)符被定義的地方。一個(gè)例子就是 C 或者 C+ 程序中的函數(shù)定義。標(biāo)簽列表可以保存在一個(gè)標(biāo)簽文件中。Vim 可以通過(guò)它來(lái)從任何地方跳轉(zhuǎn)到該標(biāo)簽,也就是一個(gè)標(biāo)識(shí)符被定義的地方。 在當(dāng)前目錄下為所有的 C 文件生成標(biāo)簽文件,使用下面的這個(gè)命令: ctags *.cctags 是一個(gè)獨(dú)立的程序。大多數(shù) Unix 系統(tǒng)上都已經(jīng)安裝了它。如果你還沒(méi)有安裝,可以在這里找到 Exuberant ctags: 現(xiàn)在你可以使用下面的命令跳轉(zhuǎn)到一個(gè)函數(shù)定義的地方: :tag startlist這個(gè)命令會(huì)找到函數(shù) startlist,即使該函數(shù)是在另一個(gè)文件中。 CTRL- 命令會(huì)跳轉(zhuǎn)到當(dāng)前光標(biāo)下單詞的標(biāo)簽。這樣瀏覽毫無(wú)頭緒的 C 代碼會(huì)變得更容些易。舉個(gè)例子,假設(shè)你在函數(shù) write_block 中。你可以看到它調(diào)用了函數(shù)write_line。但 write_line 做了什么呢?將光標(biāo)置于調(diào)用 write_line 的地方然后按 CTRL-,你就跳轉(zhuǎn)到了這個(gè)函數(shù)的定義的地方了。 write_line 函數(shù)調(diào)用了 write_char。你需要知道它做了什么。將光標(biāo)定位到調(diào)用 write_char 的地方然后按 CTRL-,你就到了定義write_char 的地方。 +-+ |void write_block(char *s; int cnt) | | | | int i; | | for (i = 0; i |void write_line(char *s) | | | | while (*s != 0) | | write_char(*s+); | | | | +-|-+ | CTRL- | | +-+ +- |void write_char(char c) | | | | putchar(int)(unsigned char)c); | | | +-+:tags 命令顯示你經(jīng)過(guò)的標(biāo)簽列表: :tags # TO tag FROM line in file/text 1 1 write_line 8 write_block.c 2 1 write_char 7 write_line.c 現(xiàn)在介紹向回跳轉(zhuǎn)。 CTRL-T 命令跳轉(zhuǎn)到上一個(gè)標(biāo)簽。在上例中,你會(huì)回到 write_line函數(shù)調(diào)用 write_char 的地方。 這個(gè)命令接受一個(gè)計(jì)數(shù)參數(shù),用來(lái)表示跳轉(zhuǎn)回去的標(biāo)簽個(gè)數(shù)。你已經(jīng)向前跳轉(zhuǎn),現(xiàn)在又跳轉(zhuǎn)了回去?,F(xiàn)在我們?cè)僖淮蜗蚯疤D(zhuǎn)。下面的命令跳轉(zhuǎn)到標(biāo)簽列表中最上面的標(biāo)簽: :tag你可以在前面加上要向前跳轉(zhuǎn)的標(biāo)簽個(gè)數(shù)。比如::3tag。 CTRL-T 同樣可以加上一個(gè)計(jì)數(shù)參數(shù)。 通過(guò)這些命令,你可以用 CTRL- 延著調(diào)用樹(shù)向前跳轉(zhuǎn), 用 CTRL-T 向回跳轉(zhuǎn),用:tags 命令顯示當(dāng)前位置。分 割 窗 口:tag 命令會(huì)將當(dāng)前窗口的文件替換為包含新函數(shù)的文件。怎樣才能同時(shí)查看兩個(gè)文件呢?你可以使用 :split 命令將窗口分開(kāi)然后再用 :tag 命令。Vim 有個(gè)縮寫(xiě)命令可以做到這些: :stag tagname使用下面的命令可以分割當(dāng)前窗口并跳轉(zhuǎn)到光標(biāo)下的標(biāo)簽: CTRL-W 如果指定了計(jì)數(shù)參數(shù),新窗口將包含指定的那么多行。多 個(gè) 標(biāo) 記 文 件如果在多個(gè)目錄中都有文件,你可以在每一個(gè)目錄下創(chuàng)建一個(gè)標(biāo)簽文件。Vim 只能跳轉(zhuǎn)到那個(gè)目錄下的標(biāo)簽。 通過(guò)設(shè)定 tags 選項(xiàng),你可以使用多個(gè)相關(guān)的標(biāo)簽文件。 比如: :set tags=./tags,././tags,./*/tags這會(huì)使 Vim 找到當(dāng)前文件所在目錄及其父目錄和所有子目錄下的標(biāo)簽文件。 這已經(jīng)是不少的標(biāo)簽文件了,但也許仍不夠。比如,當(dāng)編輯 /proj/src 目錄下的一個(gè)文件時(shí),你無(wú)法找到 /proj/sub/tags 目錄下的標(biāo)簽文件。對(duì)這種情況,Vim提供了一個(gè)查找整個(gè)目錄樹(shù)下標(biāo)簽文件的方法,比如: :set tags=/proj/*/tags單 個(gè) 標(biāo) 記 文 件當(dāng) Vim 在多個(gè)地方查找標(biāo)簽文件時(shí),你會(huì)聽(tīng)到硬盤(pán)在格格作響。這樣會(huì)有點(diǎn)慢。在這種情況下,你最好將這些時(shí)間花在生成一個(gè)大的標(biāo)簽文件上。你可以要等一會(huì)兒。 這得借助上面提到的 Exuberant ctags 程序。它有一個(gè)選項(xiàng)可以搜索整個(gè)目錄樹(shù): cd /proj ctags -R .這樣做的好處是 Exuberant ctags 可以識(shí)別多種文件類(lèi)型,它不僅適用于 C 和 C+程序,還適用于 Eiffel 甚至 Vim 腳本。請(qǐng)參考 ctags 文檔進(jìn)行調(diào)整所用參數(shù)。 現(xiàn)在你只需要告訴 Vim 你的標(biāo)簽文件在何處: :set tags=/proj/tags多 個(gè) 匹 配當(dāng)一個(gè)函數(shù)(或類(lèi)中的方法)被定義多次, :tags 命令會(huì)跳轉(zhuǎn)到第一處。如果在當(dāng)前文件中存在匹配,那它將會(huì)被首先使用。 你現(xiàn)在可以跳轉(zhuǎn)到同一個(gè)標(biāo)簽的其它匹配處: :tnext重復(fù)執(zhí)行這個(gè)命令可以找到更多的匹配。如果存在很多匹配,你可以選擇要跳轉(zhuǎn)到哪一個(gè): :tselect tagnameVim 會(huì)為你展示一個(gè)選擇列表: # pri kind tag file 1 F f mch_init os_amiga.c mch_init() 2 F f mch_init os_mac.c mch_init() 3 F f mch_init os_msdos.c mch_init(void) 4 F f mch_init os_riscos.c mch_init() Enter nr of choice ( to abort): 你現(xiàn)在可以輸入要跳轉(zhuǎn)到的匹配代號(hào)(在第一列)。其它列的信息可以讓你知道匹配在何處被定義??梢杂眠@些命令在各匹配的標(biāo)簽間移動(dòng): :tfirst 到第一個(gè)匹配 :counttprevious 向前 count 個(gè)匹配 :counttnext 向后 count 個(gè)匹配 :tlast 到最后一個(gè)匹配如果沒(méi)有指定,count 省缺為一。猜 測(cè) 標(biāo) 簽 名命令行補(bǔ)全是避免輸入長(zhǎng)標(biāo)簽名的好辦法。只需輸入開(kāi)始的一部分然后按 : :tag write_你會(huì)得到第一個(gè)匹配。如果這不是你想要的,重復(fù)輸入 直到你找到正確的匹配。 有時(shí)你只知道一個(gè)函數(shù)名的一部分,或是你有很多以相同字符串開(kāi)頭而結(jié)尾不同的標(biāo)記。這時(shí)你可以告訴 Vim 使用一個(gè)模式來(lái)查找標(biāo)簽。 假設(shè)你要跳轉(zhuǎn)到一個(gè)包含 block 的標(biāo)簽。首先輸入: :tag /block現(xiàn)在再利用命令行補(bǔ)全功能:輸入 。Vim 會(huì)找到所有包含 block 的標(biāo)簽并使用第一個(gè)匹配。 標(biāo)簽名前面的 / 告訴 Vim 這不是一個(gè)確定的標(biāo)簽名而是一個(gè)模式。你可以利用有關(guān)查找模式的所有特性。舉個(gè)列子,假設(shè)你要選擇所有以 write_ 開(kāi)頭的標(biāo)簽: :tselect /write_ 指定標(biāo)簽以 write_ 開(kāi)頭,否則在中間含有 write_ 的標(biāo)簽名也會(huì)被找到。類(lèi)似地,_FCKpd_0quot; 指定標(biāo)簽名結(jié)尾處的匹配。標(biāo) 簽 瀏 覽 器CTRL- 可以讓你跳轉(zhuǎn)到光標(biāo)所在標(biāo)識(shí)符的定義處,因此你可以利用標(biāo)識(shí)符的列表來(lái)形成一個(gè)目錄。這里給出一個(gè)例子。 首先生成一個(gè)標(biāo)識(shí)符列表(需要 Exuberant ctags): ctags -c-types=f -f functions *.c現(xiàn)在打開(kāi) Vim 并在一個(gè)垂直分割窗口中編輯這個(gè)文件: vim :vsplit functions窗口中包含一個(gè)所有函數(shù)的列表。其它的東西可以被忽略。用 :setlocal ts=99 命令使其顯示得更清晰些。 在這個(gè)窗口中,定義一個(gè) mapping: :nnoremap 0yew:tag 移動(dòng)光標(biāo)至要跳轉(zhuǎn)到函數(shù)的所在行,輸入 。Vim 會(huì)在另一個(gè)窗口中跳轉(zhuǎn)到所選擇的函數(shù)定義處。相 關(guān) 雜 項(xiàng)你可以設(shè)定 ignorecase 選項(xiàng)來(lái)忽略標(biāo)簽名里的大小寫(xiě)。tagbsearch 選項(xiàng)標(biāo)明標(biāo)簽文件是否經(jīng)過(guò)排序。省缺是假定為標(biāo)簽文件已排序,這樣會(huì)使查找更快,但如果文件沒(méi)有被排序是無(wú)法工作的。taglength 選項(xiàng)可用來(lái)告訴 Vim 一個(gè)標(biāo)簽的有效字符個(gè)數(shù)。當(dāng)你使用 SNiFF+ 程序時(shí),你可以利用 Vim 的有關(guān)接口 |sniff| 。SNiFF+ 是一個(gè)商業(yè)軟件。Cscope 是一個(gè)自由軟件。它不僅可以找到一個(gè)標(biāo)識(shí)符被聲明的地方,還可以找到標(biāo)識(shí)符被使用的地方。 請(qǐng)參考 |cscope|。預(yù)覽窗口當(dāng)編輯含有函數(shù)調(diào)用的代碼時(shí),你需要使用正確的調(diào)用參數(shù)。要獲知所要傳遞的值,你可以查看這個(gè)函數(shù)是如何定義的。標(biāo)簽機(jī)制對(duì)此十分適用。如果定義可在另一個(gè)窗口內(nèi)顯示那就更好了。對(duì)此我們可以利用預(yù)覽窗口。 打開(kāi)一個(gè)預(yù)覽窗口來(lái)顯示函數(shù) write_char: :ptag write_charVim 會(huì)打開(kāi)一個(gè)窗口,跳轉(zhuǎn)到 write_char 標(biāo)簽。然后它會(huì)回到原來(lái)的位置。這樣你可以繼續(xù)輸入而不必使用 CTRL-W 命令。 如果函數(shù)名出現(xiàn)在文本中,你可以用下面的命令在預(yù)覽窗口中得到其定義: CTRL-W 有一個(gè)腳本可以自動(dòng)顯示光標(biāo)處的標(biāo)簽定義。請(qǐng)參考 |CursorHold-example| 。用下面的命令關(guān)閉預(yù)覽窗口: :pclose要在預(yù)覽窗口中編輯一個(gè)指定的文件,用 :pedit 。這在編輯頭文件時(shí)很有用,比如: :pedit defs.h最后, psearch 可用來(lái)查找當(dāng)前文件和任何包含文件中的單詞并在預(yù)覽窗口中顯示匹配。這在使用沒(méi)有標(biāo)簽文件的庫(kù)函數(shù)時(shí)十分有用。例如: :psearch popen這會(huì)在預(yù)覽窗口中顯示含有 popen() 原型的 stdio.h 文件: FILE *popen _P(const char *, const char *); 你可以用 previewheight 選項(xiàng)指定預(yù)覽窗口打開(kāi)時(shí)的高度。在代碼間移動(dòng)因?yàn)槌绦虼a是結(jié)構(gòu)化的,Vim 可以識(shí)別其中的有關(guān)項(xiàng)目。一些特定的命令可用來(lái)完成相關(guān)的移動(dòng)。 C 程序中經(jīng)常包含類(lèi)似下面的代碼: #ifdef USE_POPEN fd = popen(ls, r) #else fd = fopen(tmp, w) #endif 有時(shí)會(huì)更長(zhǎng),也許還有套嵌。將光標(biāo)置于 #ifdef 處按 %。Vim 會(huì)跳轉(zhuǎn)到#else。繼續(xù)按 % 會(huì)跳轉(zhuǎn)到 #endif。再次按下 % 又回到原來(lái)的 #ifdef。 當(dāng)代碼套嵌時(shí),Vim 會(huì)找到相匹配的項(xiàng)目。這是檢查你是否忘記了一個(gè) #endif 的好辦法。 當(dāng)你在一個(gè) #ifdef - #endif 塊內(nèi)的某個(gè)位置,你可以用下面的命令回到開(kāi)始處:

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論