?? usr_29.cnx
字號(hào):
*usr_29.txt* For Vim version 6.3. 最近更新:2004年6月 VIM 用戶手冊(cè) - by Bram Moolenaar (譯者:wandys http://vimcdoc.sf.net) 在代碼間移動(dòng)Vim 的創(chuàng)造者是一名計(jì)算機(jī)程序員,因此這就不奇怪 Vim 中有許多幫助編寫程序的功能:跳轉(zhuǎn)到標(biāo)識(shí)符被定義和使用的地方;在另一個(gè)窗口中預(yù)覽有關(guān)的聲明等等。在下一章中還會(huì)介紹更多的功能。|29.1| 使用標(biāo)簽|29.2| 預(yù)覽窗口|29.3| 在代碼間移動(dòng)|29.4| 查找全局標(biāo)識(shí)符|29.5| 查找局部標(biāo)識(shí)符 下一章:|usr_30.txt| 編輯程序 前一章:|usr_28.txt| 折疊 目錄:|usr_toc.txt|==============================================================================*29.1* 使用標(biāo)簽什么是標(biāo)簽?標(biāo)簽就是一個(gè)標(biāo)識(shí)符被定義的地方。一個(gè)例子就是 C 或者 C++ 程序中的函數(shù)定義。標(biāo)簽列表可以保存在一個(gè)標(biāo)簽文件中。Vim 可以通過它來從任何地方跳轉(zhuǎn)到該標(biāo)簽,也就是一個(gè)標(biāo)識(shí)符被定義的地方。 在當(dāng)前目錄下為所有的 C 文件生成標(biāo)簽文件,使用下面的這個(gè)命令: > ctags *.c"ctags" 是一個(gè)獨(dú)立的程序。大多數(shù) Unix 系統(tǒng)上都已經(jīng)安裝了它。如果你還沒有安裝,可以在這里找到 "Exuberant ctags": http://ctags.sf.net ~現(xiàn)在你可以使用下面的命令跳轉(zhuǎn)到一個(gè)函數(shù)定義的地方: > :tag startlist這個(gè)命令會(huì)找到函數(shù) "startlist",即使該函數(shù)是在另一個(gè)文件中。 CTRL-] 命令會(huì)跳轉(zhuǎn)到當(dāng)前光標(biāo)下單詞的標(biāo)簽。這樣瀏覽毫無頭緒的 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 < cnt; ++i) | | write_line(s[i]); | |} | | +-----------|-------------------------+ | CTRL-] | | +----------------------------+ +--> |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)過的標(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ù),用來表示跳轉(zhuǎn)回去的標(biāo)簽個(gè)數(shù)。你已經(jīng)向前跳轉(zhuǎn),現(xiàn)在又跳轉(zhuǎn)了回去。現(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ù)。 通過這些命令,你可以用 CTRL-] 延著調(diào)用樹向前跳轉(zhuǎn), 用 CTRL-T 向回跳轉(zhuǎn),用 ":tags" 命令顯示當(dāng)前位置。分 割 窗 口":tag" 命令會(huì)將當(dāng)前窗口的文件替換為包含新函數(shù)的文件。怎樣才能同時(shí)查看兩個(gè)文件呢?你可以使用 ":split" 命令將窗口分開然后再用 ":tag" 命令。Vim 有個(gè)縮寫命令可以做到這些: > :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)簽。 通過設(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í),你無法找到 "~/proj/sub/tags" 目錄下的標(biāo)簽文件。對(duì)這種情況,Vim提供了一個(gè)查找整個(gè)目錄樹下標(biāo)簽文件的方法,比如: > :set tags=~/proj/**/tags單 個(gè) 標(biāo) 記 文 件當(dāng) Vim 在多個(gè)地方查找標(biāo)簽文件時(shí),你會(huì)聽到硬盤在格格作響。這樣會(huì)有點(diǎn)慢。在這種情況下,你最好將這些時(shí)間花在生成一個(gè)大的標(biāo)簽文件上。你可以要等一會(huì)兒。 這得借助上面提到的 "Exuberant ctags" 程序。它有一個(gè)選項(xiàng)可以搜索整個(gè)目錄樹: > cd ~/proj ctags -R .這樣做的好處是 "Exuberant ctags" 可以識(shí)別多種文件類型,它不僅適用于 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ù)(或類中的方法)被定義多次, ":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 (<CR> to abort): ~你現(xiàn)在可以輸入要跳轉(zhuǎn)到的匹配代號(hào)(在第一列)。其它列的信息可以讓你知道匹配在何處被定義。可以用這些命令在各匹配的標(biāo)簽間移動(dòng): :tfirst 到第一個(gè)匹配 :[count]tprevious 向前 [count] 個(gè)匹配 :[count]tnext 向后 [count] 個(gè)匹配 :tlast 到最后一個(gè)匹配如果沒有指定,[count] 省缺為一。猜 測(cè) 標(biāo) 簽 名命令行補(bǔ)全是避免輸入長(zhǎng)標(biāo)簽名的好辦法。只需輸入開始的一部分然后按 <Tab>: > :tag write_<Tab>你會(huì)得到第一個(gè)匹配。如果這不是你想要的,重復(fù)輸入 <Tab> 直到你找到正確的匹配。 有時(shí)你只知道一個(gè)函數(shù)名的一部分,或是你有很多以相同字符串開頭而結(jié)尾不同的標(biāo)記。這時(shí)你可以告訴 Vim 使用一個(gè)模式來查找標(biāo)簽。 假設(shè)你要跳轉(zhuǎn)到一個(gè)包含 "block" 的標(biāo)簽。首先輸入: > :tag /block現(xiàn)在再利用命令行補(bǔ)全功能:輸入 <Tab>。Vim 會(huì)找到所有包含 "block" 的標(biāo)簽并使用第一個(gè)匹配。 標(biāo)簽名前面的 "/" 告訴 Vim 這不是一個(gè)確定的標(biāo)簽名而是一個(gè)模式。你可以利用有關(guān)查找模式的所有特性。舉個(gè)列子,假設(shè)你要選擇所有以 "write_" 開頭的標(biāo)簽: > :tselect /^write_"^" 指定標(biāo)簽以 "write_" 開頭,否則在中間含有 "write_" 的標(biāo)簽名也會(huì)被找到。類似地,"$" 指定標(biāo)簽名結(jié)尾處的匹配。標(biāo) 簽 瀏 覽 器CTRL-] 可以讓你跳轉(zhuǎn)到光標(biāo)所在標(biāo)識(shí)符的定義處,因此你可以利用標(biāo)識(shí)符的列表來形成一個(gè)目錄。這里給出一個(gè)例子。 首先生成一個(gè)標(biāo)識(shí)符列表(需要 Exuberant ctags): > ctags --c-types=f -f functions *.c現(xiàn)在打開 Vim 并在一個(gè)垂直分割窗口中編輯這個(gè)文件: > vim :vsplit functions窗口中包含一個(gè)所有函數(shù)的列表。其它的東西可以被忽略。用 ":setlocal ts=99" 命令使其顯示得更清晰些。 在這個(gè)窗口中,定義一個(gè) mapping: > :nnoremap <buffer> <CR> 0ye<C-W>w:tag <C-R>"<CR>移動(dòng)光標(biāo)至要跳轉(zhuǎn)到函數(shù)的所在行,輸入 <Enter>。Vim 會(huì)在另一個(gè)窗口中跳轉(zhuǎn)到所選擇的函數(shù)定義處。相 關(guān) 雜 項(xiàng)你可以設(shè)定 'ignorecase' 選項(xiàng)來忽略標(biāo)簽名里的大小寫。'tagbsearch' 選項(xiàng)標(biāo)明標(biāo)簽文件是否經(jīng)過排序。省缺是假定為標(biāo)簽文件已排序,這樣會(huì)使查找更快,但如果文件沒有被排序是無法工作的。'taglength' 選項(xiàng)可用來告訴 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|。==============================================================================*29.2* 預(yù)覽窗口當(dāng)編輯含有函數(shù)調(diào)用的代碼時(shí),你需要使用正確的調(diào)用參數(shù)。要獲知所要傳遞的值,你可以查看這個(gè)函數(shù)是如何定義的。標(biāo)簽機(jī)制對(duì)此十分適用。如果定義可在另一個(gè)窗口內(nèi)顯示那就更好了。對(duì)此我們可以利用預(yù)覽窗口。 打開一個(gè)預(yù)覽窗口來顯示函數(shù) "write_char": > :ptag write_charVim 會(huì)打開一個(gè)窗口,跳轉(zhuǎn)到 "write_char" 標(biāo)簽。然后它會(huì)回到原來的位置。這樣你可以繼續(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" 可用來查找當(dāng)前文件和任何包含文件中的單詞并在預(yù)覽窗口中顯示匹配。這在使用沒有標(biāo)簽文件的庫函數(shù)時(shí)十分有用。例如: > :psearch popen
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -