標(biāo)簽: VIM 搜索 替換 文本 編輯
VIM是被譽(yù)為非常高效的文本編輯軟件。但是掌握并高效的使用是件有難度的事情。在VIM中進(jìn)行快速的查找和替換是提高VIM使用效率的重要方法。下面是我在閱讀VIM用戶(hù)手冊(cè)時(shí)整理的一些資料:
- 行內(nèi)搜索。
- f命令可以進(jìn)行行內(nèi)搜索。輸入fx可以找到下一個(gè)x字符。
- F命令可以在反方向進(jìn)行行內(nèi)搜索,輸入Fx可以找到上一個(gè)x字符。
- t命令同樣是進(jìn)行行內(nèi)搜索,但是光標(biāo)停留在符合條件的字符的前面。輸入tx使光標(biāo)停留在下一個(gè)x字符的前面。
- T命令可以在反方向進(jìn)行行內(nèi)搜索,但是光標(biāo)停留在符合條件的字符的下一個(gè)字符上。輸入tx使光標(biāo)停留在上一個(gè)x的后面的字符上。
- %可以搜索與之匹配的對(duì)應(yīng)的()[]{}。這個(gè)功能對(duì)于書(shū)寫(xiě)程序特別有用。
全文的搜索。鍵入/后,光標(biāo)進(jìn)入VIM底部的命令行,這時(shí)就可以輸入以/為開(kāi)始的/搜索命令了。 - 最簡(jiǎn)單的查找。輸入/string就可以查找string字符串。
- 繼續(xù)查找。在第一次搜索后輸入n將會(huì)繼續(xù)進(jìn)行上一次搜索,如果輸入3n那么會(huì)找到后面第三個(gè)符合的字符串。大寫(xiě)的N會(huì)在反方向,也就是向上進(jìn)行搜索。
- 向上搜索。輸入?可以向上搜索。隨后的n命令將會(huì)繼續(xù)向上搜索,N向下搜索,其他和/一樣。
- 對(duì)大小寫(xiě)的匹配。
- 在命令行輸入:set ignorecase可以設(shè)置搜索以忽略大小寫(xiě)的方式進(jìn)行。輸入:set noignorecase可以設(shè)置搜索以匹配大小寫(xiě)的方式進(jìn)行。默認(rèn)的,將匹配大小寫(xiě)。這個(gè)默認(rèn)設(shè)置可以在.vimrc中修改。
- 大小寫(xiě)智能匹配模式。輸入命令:set ignorecase smartcase可以設(shè)置為智能大小寫(xiě)匹配模式。在這種模式下,如果你輸入的字符串中至少包含一個(gè)大寫(xiě)字母,那么就會(huì)以大小寫(xiě)敏感模式進(jìn)行搜索,否則以忽略大小寫(xiě)模式進(jìn)行搜索。
- 在搜索命令中指定大小寫(xiě)。在幾種大小寫(xiě)搜索模式中進(jìn)行轉(zhuǎn)換總要輸入長(zhǎng)長(zhǎng)的一串指令,如果需要不斷地轉(zhuǎn)換模式,確實(shí)有些麻煩。所以你可以直接在搜索命令中指定大小寫(xiě)匹配模式。\c表示忽略大小寫(xiě),而\C表示對(duì)大小寫(xiě)敏感。
查找當(dāng)前詞。一個(gè)簡(jiǎn)單的方法可以讓你查找下一個(gè)和當(dāng)前詞一樣的詞,你不比輸入/currentword,你可以直接按下*就可以查找下一個(gè)currentword。#可以讓你向上查找同一個(gè)單詞。 調(diào)整查找后的光標(biāo)位置。 - 使用/string/3會(huì)使在光標(biāo)轉(zhuǎn)到找到string字符串的行下面的第3行。第1行從包含string的行算起。同樣可以使用/string/-2來(lái)使光標(biāo)停留在包含string的行的前面2行。
- 使用/string/e可以使光標(biāo)停留在string字符串的末尾而不是默認(rèn)的第一個(gè)字符位置。/string/b則表示停留在string第一個(gè)字符的位置,不過(guò)默認(rèn)就是如此,我們不比多此一舉。但是/string/b+2卻可以使光標(biāo)停留在string字符串的第二個(gè)字符的位置,這里是r。在e或者b的后面+或者-數(shù)字,可以進(jìn)一步調(diào)整光標(biāo)的位置。
特殊字符。在搜索命令中, .*[]^%/?~$這10個(gè)字符有著特殊意義,所以在使用這些字符的時(shí)候要在前面加上一個(gè)反斜杠/。而\e表示<esc>;\t表示<tab>;\r表示<cr>;\b表示<bs>。 匹配換行或空格。使用\n可以表示一個(gè)換行;而\s表示匹配空白,注意是空白不是空格。\_s表示匹配換行或者空格;\_a表示匹配換行或者一個(gè)字母。比如:/the\nword查找以the結(jié)束并且下一行以word開(kāi)始的行的位置。/the\_sword查找the和word之間以空白或者換行分割的位置。/the\_s\+word表示the和word之間可以有多個(gè)空白。\+的含義可以在后面找到。 限定詞首或者詞尾。\<可以限定找到是以指定字符串開(kāi)始的單詞。比如/\<the可以找到以the開(kāi)始在字符串,但是會(huì)忽略在單詞中間包含the的字符串。而\>則是限定必須是以指定字符串結(jié)尾的單詞。 行首和行尾。輸入/^string查找以string開(kāi)始的行,并且光標(biāo)停留在這個(gè)string的第一個(gè)字符。輸入/string$則查找以string結(jié)束的行,并將光標(biāo)停留在這個(gè)string的第一個(gè)字符。這個(gè)模式不會(huì)忽略前導(dǎo)或者后置的空格。 匹配任何一個(gè)字符。句號(hào).可以匹配任何一個(gè)字符。例如/t.e可以找到the或者tae或者tue。 更加復(fù)雜的匹配模式。實(shí)際上,/搜索可以使用非常復(fù)雜的匹配模式。下面列出了其中一些復(fù)雜的匹配模式。 - 可重復(fù)的字符。
- 使用*表示它前面的字符可以重復(fù)多次或者0次。比如/be*可以匹配b,be,bee,beee等等。但是這也會(huì)包含b,因?yàn)閑重復(fù)0后是空。如果要匹配諸如be,bebe,bebebe的字符串可以使用\(和\)把他們包括起來(lái),形如:/\(be\)*。
- 使用\+來(lái)限定為重復(fù)至少一次到無(wú)數(shù)次。如:/be\+可以匹配be,bee,bee等等。
- 重復(fù)0次或者一次。\=可以指定重復(fù)0次或者一次。/strings\=表示匹配string或者strings。這在查找單詞的復(fù)數(shù)形式特別有用.
- 指定重復(fù)的次數(shù)。\{n,m}可以指定重復(fù)n到m次。比如:/be\{2,4}將會(huì)匹配bee,beee,beeee。同樣可以使用\{,4}表示匹配0到4次;\{4,}表示4次到無(wú)數(shù)次;\{4}表示重復(fù)4次。
匹配列表中的一個(gè)。使用一個(gè)以\|分割的列表,可以表示匹配列表中任何一項(xiàng)。比如/one\|two表示查找one或者two;/one\|two\|three表示查找one或者two或者three。 - 一個(gè)復(fù)雜的實(shí)例:/end\(if\|while\|for\)將會(huì)查找endif,endwhile以及endfor。
- 字符列表。使用[0-9]可以表示一個(gè)0到9范圍的字符。比如/string[1-5]表示查找string1,string2,string3,string4,string5。當(dāng)然也可以使用[a-z]表示字符a到z中間的一個(gè)。
- 特殊的字符集合。使用\d也可以表示0到9的數(shù)字,這個(gè)選項(xiàng)可以代替[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表示小寫(xiě)字母代替[a-z];\L表示非小寫(xiě)字母代替[^a-z];\u表示大寫(xiě)字母代替[A-Z];\U表示非大寫(xiě)字母代替[^A-Z]
搜索并替換。輸入:[range]s/from/to/[flags]命令可以搜索匹配的字符串并且替換為指定的字符串。這是一個(gè)稍微復(fù)雜的命令。其中[range]是一個(gè)可選項(xiàng),用來(lái)指定搜索替換的范圍。[flags]也是一個(gè)可選項(xiàng),用來(lái)指定搜索替換的處理方式。所以這個(gè)命令的簡(jiǎn)單形式是:s/from/to/。 - 搜索替換的范圍。如果沒(méi)有指定范圍,則只在當(dāng)前行進(jìn)行搜索替換。
- 在所有行進(jìn)行搜索替換。范圍符號(hào)%表示在所有行進(jìn)行搜索替換。:%s/from/to/就是在全文查找from并替換為to。
- 在指定的行上進(jìn)行搜索替換。:1,50s/from/to/表示在第1行和第50行之間(包括1和50行)進(jìn)行搜索和替換。:45s/from/to/表示僅僅在第45行進(jìn)行搜索和替換。而"1,$"行號(hào)范圍和“%“是等價(jià)的。
處理方式。我現(xiàn)在使用的VIM默認(rèn)的方式是無(wú)須確認(rèn)。不過(guò)好像不同版本的默認(rèn)的處理方式是不同的。
- 無(wú)須確認(rèn)。方式符號(hào)g表示直接替換無(wú)須進(jìn)行確認(rèn)。:%s/from/to/g表示在全文中查找from并且直接全部替換為to。
- 列印。處理方式符號(hào)p表示在替換時(shí)列出每個(gè)被改變的行。手冊(cè)中這么說(shuō),但是實(shí)際效果卻讓我很迷惑。
- 確認(rèn)后處理。處理方式符號(hào)c表示在進(jìn)行替換前需要用戶(hù)進(jìn)行確認(rèn)。這時(shí)你可以選擇(y/n/a/q/1/^E/^Y):y表示同意當(dāng)前替換;n表示不同意當(dāng)前替換;a表示替換當(dāng)前和后面的并且不再確認(rèn);q表示立即結(jié)束替換操作;1表示把當(dāng)前的替換后結(jié)束替換操作;^E向上滾屏^Y向下滾屏,用來(lái)幫助查看前后內(nèi)容以決定進(jìn)行操作。
記下來(lái)…………