*usr_27.txt* For Vim version 7.3. 最近更新: 2005年3月VIM 用戶手冊 - Bram Moolenaar 著
譯者
: Chimin Yen http://vimcdoc.sf.net查找命令及模式在第三章里,我們曾經(jīng)提到過幾個(gè)簡單的查找模式 |03.9|。Vim 能夠勝任復(fù)雜得多的查找。本章將解釋那些最常用到的模式。詳細(xì)的說明可以查閱: |pattern||27.1| 忽略大小寫|27.2| 在文件尾折返|27.3| 偏移|27.4| 匹配重復(fù)性模式|27.5| 多擇一|27.6| 字符范圍|27.7| 字符類|27.8| 匹配換行符|27.9| 舉例下一章: |usr_28.txt| 折疊前一章: |usr_26.txt| 重復(fù)目錄: |usr_toc.txt|
*27.1* 忽略大小寫
默認(rèn)情況下,Vim 的查找是大小寫敏感的。因此,"include","INCLUDE",和 "Include"為三個(gè)各不相同的詞,而一次查找將僅僅匹配其中的一個(gè)?,F(xiàn)在設(shè)定 'ignorecase' 選項(xiàng)::set ignorecase
再查找 "include",現(xiàn)在它將匹配 "Include","INCLUDE" 和 "InClUDe"。(設(shè)定'hlsearch' 選項(xiàng)可以快速查看哪兒有模式的匹配。)你可以這樣撤銷這個(gè)選項(xiàng):
:set noignorecase
讓我們保留這個(gè)設(shè)定,并查找 "INCLUDE"。它匹配的文本就跟查找 "include" 時(shí)一模一樣。現(xiàn)在我們設(shè)定 'smartcase' 選項(xiàng):
:set ignorecase smartcase
如果你采用的模式里至少有一個(gè)大寫字母,查找就成了大小寫敏感的??梢赃@樣理解,你不必鍵入大寫字母,也能查找到含有大寫字母的詞,所以,你若鍵入大寫字母,必然是因?yàn)槟阋笮懨舾械钠ヅ洹B斆?!設(shè)定了這兩個(gè)選項(xiàng),你會(huì)找到以下匹配:
模式 匹配
word word、Word、WORD、WoRd 等。Word WordWORD WORDWoRd WoRd單 個(gè) 模 式 里 的 大 小 寫如果你僅想忽略一個(gè)特定的模式里的大小寫,那么,在模式前添加 "\c" 字符串就行了。添加 "\C" 將使該模式的匹配大小寫敏感。這排除了 'ignorecase' 和 'smartcase' 選項(xiàng)的影響,當(dāng) "\c" 或 "\C" 起作用時(shí),它們設(shè)成什么值無關(guān)緊要。模式 匹配
\Cword word\CWord Word\cword word,Word,WORD,WoRd,等。\cWord word,Word,WORD,WoRd,等。采用 "\c" 和 "\C" 的好處在于它粘附在所用的模式上。因此,重復(fù)查找歷史記錄里的某個(gè)模式會(huì)產(chǎn)生同樣的結(jié)果。'ignorecase' 或 'smartcase' 是否更改不影響結(jié)果。備注
:在查找模式中使用以 "\" 開頭的項(xiàng),其效果取決于 'magic' 選項(xiàng)。在本章中,我們將假定 'magic' 為真。這也是標(biāo)準(zhǔn)和建議的設(shè)定。如果你把它改了,那么,許多查找模式就會(huì)突然變得無效了。備注
:如果你查了好久,超過了你預(yù)計(jì)的時(shí)間,你可以中斷查找,在 Unix 上用CTRL-C
,而在 MS-DOS 和微軟視窗上則用CTRL-Break
。
*27.2* 在文件尾折返
在默認(rèn)情況下,正向查找從當(dāng)前光標(biāo)位置開始,查找特定的字符串。然后它就遇到了文件尾。如果那個(gè)時(shí)候還沒找到那個(gè)字符串,它就從頭來過,從文件開頭一直查到光標(biāo)處。記住,當(dāng)你不斷以 "n" 命令查找下一個(gè)匹配時(shí),你最終回到第一個(gè)匹配。如果你不注意
,你將永遠(yuǎn)找下去!為了提醒你,Vim 顯示如下信息:search hit BOTTOM,continuing at TOP
如果你使用 "?" 命令按相反方向查找,你得到的信息是這樣的:search hit TOP,continuing at BOTTOM
可是,你還是不知道你何時(shí)回到了第一個(gè)匹配。一種辦法是設(shè)定 'ruler' 選項(xiàng)::set ruler
Vim 將把光標(biāo)位置顯示在窗口的右下角 (如果使用了狀態(tài)條的話,會(huì)顯示在哪里)??雌饋硐襁@樣:
101,29 84%
第一個(gè)數(shù)字是光標(biāo)所在的行號(hào)。在你開始查找的時(shí)候記住行號(hào),那樣你就能檢查是否越過了該位置。無 折 返 查 找要取消查找折返功能,請(qǐng)用以下命令::set nowrapscan
現(xiàn)在當(dāng)查找遇到文件末尾,一個(gè)出錯(cuò)信息就會(huì)顯示出來:
E385: search hit BOTTOM without match for: forever
這樣,你只要用 "gg" 命令回到文件開頭,并一直查到你看到以上信息,你就能找到所有的匹配。如果你用 "?" 從相反方向查找,你將得到:E384: search hit TOP without match for: forever
*27.3* 偏移
在默認(rèn)情況下,查找命令讓光標(biāo)停留在匹配的模式的開始。你可以指定一個(gè)偏移,告訴Vim 將光標(biāo)停留在別的位置上。在正向查找命令 "/" 中指定偏移,就是在模式后面附加一個(gè)斜線符 (/) 以及偏移值:/默認(rèn)/2
這個(gè)命令查找模式 "默認(rèn)"。找到后使光標(biāo)越過匹配的模式而前移兩行,并停留在該行的行首。把這個(gè)命令用于以上段落中,Vim 在第一行找到詞 "默認(rèn)"。接著光標(biāo)再往下移兩行,落在 "一個(gè)" 的 "一" 上。如果該偏移為一簡單數(shù)字,那么光標(biāo)就會(huì)被放置在距離匹配那么多行的那一行的行首。該偏移值可為正數(shù)或負(fù)數(shù)。如果它是正數(shù),光標(biāo)會(huì)向前移該數(shù)表示的行;若為負(fù)數(shù),則往回退該數(shù)表示的行。字 符 偏 移偏移符 "e" 表示一個(gè)偏移從匹配末尾算起。它把光標(biāo)移到匹配的最后一個(gè)字符上。命令:
/const/e
把光標(biāo)放到單詞 "const" 的 "t" 上。加一個(gè)數(shù)字,光標(biāo)就從該位置再前移該數(shù)字指定的那么多個(gè)字符。下面這個(gè)命令會(huì)將光標(biāo)移到匹配后面第一個(gè)字符:
/const/e+1
一個(gè)正數(shù)使光標(biāo)右移,負(fù)數(shù)使其左移。例如:
/const/e-1
會(huì)把光標(biāo)移到單詞 "const" 的 "s" 字符上。如果偏移以 "b" 開頭,那么光標(biāo)就移到匹配模式的首位。因?yàn)椴挥?"b" 光標(biāo)也一樣會(huì)被移到首位,所以單獨(dú)使用時(shí)沒什么意義。在將它與一個(gè)加上或減去的數(shù)字合起來時(shí),就很有用了。光標(biāo)就會(huì)前移或后移那么多個(gè)字符。例如:
/const/b+2
會(huì)把光標(biāo)移到匹配的首位,再往右移兩個(gè)字符。因而落在字符 "n" 上。重 復(fù)當(dāng)你重復(fù)前一次使用過的查找模式,只是偏移不同時(shí),你可以把模式省略了:
/that
//e
等于:
/that/e
再以同樣的偏移重復(fù)查找:
/
命令 "n" 具有同樣的作用。要取消一個(gè)以前用過的偏移可以用:
//
反 向 查 找命令 "?" 以相同的方式使用偏移,但你必須以 "?" 來分隔模式和偏移,而非 "/":
?const?e-2
偏移符 "b" 和 "e" 的用途是一樣的。它們并不因?yàn)槭褂昧?"?" 而改變方向。起 始 位 置查找時(shí),通常從光標(biāo)位置開始。當(dāng)你規(guī)定的是一個(gè)行偏移,這可能造成麻煩。例如:
/const/-2
這個(gè)命令找到下一個(gè)單詞 "const",然后上移兩行。如果你用命令 "n" 再找,Vim 就從當(dāng)前位置開始,找到同一個(gè) "const" 匹配。然后再一次在偏移的作用下,回到開始的地方。你給套住了!還有比這更糟糕的: 假定下一行另有一個(gè) "const" 匹配。那么,重復(fù)正向查找就會(huì)找到這個(gè)匹配,并上移兩行。這樣你實(shí)際上把光標(biāo)往回移了!當(dāng)你規(guī)定的是一個(gè)字符偏移,Vim 將為其作調(diào)整。因此,查找會(huì)向前或向后跳過幾個(gè)字符再開始,以便同一個(gè)匹配不至于再出現(xiàn)。
*27.4* 匹配重復(fù)性模式
星號(hào)項(xiàng) "*" 規(guī)定在它前面的項(xiàng)可以重復(fù)任意次。因此:/a*
匹配 "a","aa","aaa",等等。但也匹配 "" (空字串),因?yàn)榱愦我舶趦?nèi)。星號(hào) "*" 僅僅應(yīng)用于那個(gè)緊鄰在它前面的項(xiàng)。因此 "ab*" 匹配 "a"、"ab"、"abb"、"abbb" 等等。如要多次重復(fù)整個(gè)字符串,那么該字符串必須被組成一個(gè)項(xiàng)。組成一項(xiàng)的方法就是在它前面加 "\(",后面加 "\)"。因此這個(gè)命令:
/\(ab\)*
匹配: "ab","abab","ababab",等等。而且也匹配 ""。要避免匹配空字串,使用 "\+"。這表示前面一項(xiàng)可以被匹配一次或多次。
/ab\+
匹配 "ab"、"abb"、"abbb" 等等。它不匹配后面沒有跟隨 "b" 的 "a"。要匹配一個(gè)可選項(xiàng),用 "\="。 例如:
/folders\=
匹配 "folder" 和 "folders"。指 定 重 復(fù) 次 數(shù)要匹配某一項(xiàng)的特定次數(shù)重復(fù),使用 "\
{n,m}
" 這樣的形式。其中 "n" 和 "m" 都是數(shù)字。在它前面的那個(gè)項(xiàng)將被重復(fù) "n" 到 "m" 次 (|inclusive| 包含 "n" 和 "m")。例如 :/ab\
{3,5}
匹配 "abbb"、"abbbb" 以及 "abbbbb"。當(dāng) "n" 省略時(shí),被默認(rèn)為零。當(dāng) "m" 省略時(shí),被默認(rèn)為無限大。當(dāng) ",m" 省略時(shí),就表示重復(fù)正好 "n" 次。例如:
模式 匹配次數(shù)
\{,4}
0,1,2,3 或 4\{3,}
3,4,5 等等\{0,1}
0 或 1,同 \=\{0,}
0 或更多,同 *\{1,}
1 或更多,同 \+\{3}
3匹配盡可能少的字符迄今為止,我們所討論過的都試圖匹配盡可能多的字符。若要匹配盡可能少的字符,請(qǐng)用"\{-n,m}
"。它的用法跟 "\{n,m}
" 一樣,唯一的區(qū)別在于,它采用盡可能少的字符。例如,以下命令:/ab\
{-1,3}
將匹配 "abbb" 中的 "ab"。實(shí)際上,因?yàn)闆]理由匹配更多,所以它永遠(yuǎn)不會(huì)匹配超過一個(gè) b。它需要其它的來強(qiáng)制它超過其下限規(guī)定次數(shù),而匹配更多的重復(fù)。這些同樣的規(guī)則也適用于省略 "n" 和 "m" 的情形。甚至可以把兩個(gè)都省略,只剩"\
{-}
"。這個(gè)項(xiàng)匹配其前項(xiàng)的重復(fù),重復(fù)次數(shù)盡可能少,可以等于或大于零。這個(gè)項(xiàng)如單獨(dú)使用,則總是匹配前項(xiàng)的零次重復(fù)。當(dāng)它跟與其它的模式合起來時(shí),用處就大了。例如:/a.\
{-}
b這個(gè)命令匹配 "axbxb" 中的 "axb"。如果采用了下面這個(gè)模式:
/a.*b
由于 ".*" 匹配盡可能多的字符,整個(gè) "axbxb" 都會(huì)被匹配。
*27.5* 多擇一
在一個(gè)查找模式中,"或" 運(yùn)算符是 "\|"。例如:/foo\|bar
這個(gè)命令匹配了 "foo" 或 "bar"。更多的抉擇可以連在后面:
/one\|
two\
|three匹配 "one"、"two" 或 "three"。如要匹配其多次重復(fù),那么整個(gè)抉擇結(jié)構(gòu)須置于 "\(" 和 "\)" 之間:
/\(foo\|bar\)\+
這個(gè)命令匹配 "foo"、"foobar"、"foofoo"、"barfoobar" 等等。再舉個(gè)例子:
/end\(if\|
while\
|for\)這個(gè)命令匹配 "endif"、"endwhile" 和 "endfor"。一個(gè)與此相關(guān)的項(xiàng)是 "\&"。它要求兩個(gè)抉擇都與同一位置的文本相符。而最終匹配的則是最后面的那個(gè)抉擇。例如:
/forever\&...
這個(gè)命令匹配 "forever" 中的 "for" (
譯者
: 因?yàn)榈诙駬褚笕齻€(gè)字符)。它將不匹配,比如說 "fortuin" (譯者
: 不符合第一抉擇)。
*27.6* 字符范圍
你可以用 "/a\|b\
|c" 來匹配 "a","b" 或 "c"。當(dāng)你需要匹配自 "a" 至 "z" 所有的字母時(shí),以這樣的方式表達(dá)就嫌長了。這里有個(gè)比較簡短的表達(dá)方式:/[a-z]
方括號(hào)結(jié)構(gòu) [] 匹配單個(gè)字符。你在括號(hào)內(nèi)指定哪些字符可以匹配。你可以把一系列字符包含在內(nèi),像這樣:
/[0123456789abcdef]
這個(gè)命令將匹配其中的任何一個(gè)字符。你可以為一系列連續(xù)字符規(guī)定一個(gè)字符范圍。"0-3" 表示 "0123"。"w-z" 表示 "wxyz"。因此,上面那個(gè)命令可以縮短為:
/[0-9a-f]
若要匹配字符 "-" 本身,就得把它放在字符范圍的第一或最后的位置上。Vim 會(huì)識(shí)別下面這些特殊字符,以便在 [] 字符范圍里較為方便地使用它們 (它們實(shí)際上可被用于任何查找模式的任何地方):\e
<Esc>
\t<Tab>
\r<CR>
\b<BS>
還有若干特殊場合用得上 [] 字符范圍,參閱 |/[]| 以了解全部用法。范 圍 求 反為了避免匹配到一個(gè)特定的字符,在字符范圍首位使用 "^"。這樣方括號(hào)項(xiàng) [] 就會(huì)匹配任何括號(hào)內(nèi)不包括的字符。例如:/"[^"]*"
" 雙引號(hào)[^"] 雙引號(hào)以外的任何字符* 盡可能多個(gè)" 又一個(gè)雙引號(hào)這個(gè)命令匹配 "foo" 和 "3!x",包含雙引號(hào)在內(nèi)。預(yù) 定 義 范 圍有些字符范圍使用得很頻繁。Vim 為這些字符范圍提供了一些快捷方式。例如:/\a
這個(gè)命令找尋字母字符。這相當(dāng)于使用 "/[a-zA-Z]"。下面還有幾個(gè)這樣的字符范圍:
項(xiàng) 匹配 相當(dāng)于
\d 數(shù)位 [0-9]\D 非數(shù)位 [^0-9]\x 十六進(jìn)制數(shù)位 [0-9a-fA-F]\X 非十六進(jìn)制數(shù)位 [^0-9a-fA-F]\s 空白字符 [ ] (<Tab>
和<Space>
)\S 非空白字符 [^ ] (非<Tab>
和<Space>
)\l 小寫字母 [a-z]\L 非小寫字母 [^a-z]\u 大寫字母 [A-Z]\U 非大寫字母 [^A-Z]備注
:使用這些預(yù)定義的字符范圍要比使用它們所表示的那個(gè)字符范圍快很多。這些項(xiàng)不能用于 [] 方括號(hào)內(nèi)。因此 "[\d\l]" 不能用來匹配一個(gè)數(shù)字或一個(gè)小寫字母。請(qǐng)換用 "\(\d\|\l\)"。|/\s| 包括一個(gè)這類范圍的完整的列表。
*27.7* 字符類
一個(gè)特定的字符范圍匹配一組固定的字符。一個(gè)字符類與字符范圍相似,不過有個(gè)本質(zhì)的區(qū)別: 一個(gè)字符類代表的那組字符可以重新定義而無須改動(dòng)查找模式。例如,查找這個(gè)模式:/\f\+
其中 "\f" 項(xiàng)表示文件名字符。因而這個(gè)命令匹配一個(gè)由可用作文件名的字符字符組成的序列。哪些字符可以用來組成文件名取決于你所使用的系統(tǒng)。在微軟視窗上,反斜杠可以,而在 Unix 上卻不行。文件名字符由 'isfname' 選項(xiàng)來規(guī)定。在 Unix 上,該選項(xiàng)的默認(rèn)值為:
:set isfname
isfname=@,48-57,/,.,-,_,+,,,#,$,%,~,=
在其它系統(tǒng)上,其默認(rèn)值各不相同。因此你可以用 "\f" 組成一個(gè)查找模式,以匹配一個(gè)文件名。該查找模式將自動(dòng)調(diào)整以適應(yīng)你所使用的系統(tǒng)。
備注
:實(shí)際上,Unix 允許在文件名里使用幾乎所有的字符,包括空格字符。把這些字符包括在 'isfname' 里,在理論上是沒錯(cuò)的。但那樣就無法在文本中發(fā)現(xiàn)一個(gè)文件名在哪兒結(jié)束。因此選項(xiàng) 'isfname' 的默認(rèn)值是個(gè)折衷方案。字符類有如下這些:項(xiàng) 匹配 選項(xiàng)
\i 標(biāo)識(shí)符字符 'isident'\I 類似于 \i,但不包括數(shù)字字符\k 關(guān)鍵詞字符 'iskeyword'\K 類似于 \k,但不包括數(shù)字字符\p 可顯示字符 'isprint'\P 類似于 \p,但不包括數(shù)字字符\f 文件名字符 'isfname'\F 類似于 \f,但不包括數(shù)字字符
*27.8* 匹配換行符
Vim 能找尋含有換行符的模式。你需要指定換行符在哪兒出現(xiàn),因?yàn)槠駷橹顾形覀冊?jīng)提到過的項(xiàng),都不匹配換行符。用 "\n" 項(xiàng)可以在一個(gè)特定的位置查驗(yàn)一個(gè)換行符:/the\nword
這個(gè)命令將在一行以 "the" 結(jié)尾,而下一行以 "word" 開頭的地方找到匹配。如果還要匹配 "the word",那么你需要匹配一個(gè)空格或一個(gè)換行符。這可以用 "\_s" 表示:
/the\_sword
若要允許任意數(shù)量的空格:
/the\_s\+word
這個(gè)命令也匹配 "the " 在行尾,及 " word" 在下一行行首的情形。"\s" 匹配空格字符,"\_s" 匹配空格字符或一個(gè)換行符。同理,"\a" 匹配一個(gè)字母字符,而 "\_a" 匹配一個(gè)字母字符或一個(gè)換行符。其它字符類和字符范圍都可以通過插入一個(gè) "_" 來更改其范圍。很多別的項(xiàng)也可以在前面加 "\_" 以匹配一個(gè)換行符。例如: "\_." 匹配任意字符或一個(gè)換行符。
備注
:"\_.*" 匹配任何字符,直至文件結(jié)束。要小心,它會(huì)使查找命令執(zhí)行得非常緩慢。另一個(gè)例子是 "\_[]",一個(gè)包含了換行符的字符范圍:/"\_[^"]*"
這個(gè)命令找尋位于一對(duì)雙引號(hào)之間,可能分隔成數(shù)行的文本。
*27.9* 舉例
這兒有幾個(gè)查找模式,你也許會(huì)覺得有用。本節(jié)向你演示如何綜合使用前面提及的那些用法。尋 找 一 個(gè) 加 州 駕 駛 牌 照有一個(gè)駕駛牌照號(hào)碼為 "1MGU103"。它有一個(gè)數(shù)字,三個(gè)大寫字母,然后三位數(shù)字。直接把這個(gè)號(hào)碼放入查找模式:/\d\u\u\u\d\d\d
另一種方法是用一個(gè)計(jì)數(shù)器來指定其中有三個(gè)數(shù)字和三個(gè)字母:
/\d\u\
{3}
\d\{3}
換用 [] 字符范圍方法:
/[0-9][A-Z]\
{3}
[0-9]\{3}
這些方法之中你應(yīng)該使用哪一種?挑那種你記得住的。你記得住的簡單方法要比你記不住的華麗方法快得多。如果你能把它們都記住,那么避免使用最后那種,因?yàn)樗虻淖侄啵覉?zhí)行起來慢。尋 找 一 個(gè) 標(biāo) 識(shí) 符在 C 程序里 (以及其它很多計(jì)算機(jī)程序) 一個(gè)標(biāo)識(shí)符以字母開頭,其余部分由字母和數(shù)字組成。下劃線字符也可以。這樣一個(gè)標(biāo)識(shí)符可以用下面的命令找到:
/\
<\h\w*\>
"\
<" 和 "\>
" 用來尋找那些完整的詞。"\h" 表示 "[A-Za-z_]",而 "\w" 則表示"[0-9A-Za-z_]"。備注
:"\<" 和 "\>
" 取決于 'iskeyword' 選項(xiàng)。如果這個(gè)選項(xiàng)包括 "-" 的話,那么"ident-" 就不匹配了。在這種情況下,請(qǐng)用:/\w\@<!\h\w*\w\@!
這個(gè)命令查驗(yàn)是否 "\w" 不匹配標(biāo)識(shí)符之前或之后的字符。參見 |/\@<!| 和 |/\@!|。
下一章: |usr_28.txt| 折疊版權(quán): 參見 |manual-copyright| vim:tw=78:ts=8:ft=help:norl:
Generated by vim2html on Wed Sep 8 00:16:19 UTC 2010
聯(lián)系客服