在第二章你已經(jīng)學(xué)過使用 "x" 命令來刪除一個字符以及通過計(jì)數(shù)前綴,例如 "4x" 去刪除多個字符。"dw" 命令刪除一個單詞。你可能認(rèn)出來了,"w" 是詞移動命令。實(shí)際上,"d" 命令后面可以跟任何 "動作" (motion) 命令,它會刪除從當(dāng)前位置到光標(biāo)移動到的目標(biāo)位置的全部內(nèi)容。例如 "4w" 命令能夠向后移動四個單詞。所以 "d4w" 命令刪除 4 個單詞。 To err is human. To really foul up you need a computer.
------------------>d4w To err is human. you need a computer.
Vim 只刪除從當(dāng)前位置到 "動作" 把光標(biāo)移動到的位置的前一個位置。這是因?yàn)?Vim 認(rèn)為你可能不想刪掉一個單詞的第一個字符。如果你用 "e" 命令作為動作來移動到單詞結(jié)尾,Vim 這時認(rèn)為你是想刪掉整個單詞 (包括最后一個字符): To err is human. you need a computer.
-------->d2e To err is human. a computer.
是否包括光標(biāo)所在的字符取決于你使用的移動命令。在參考手冊中,當(dāng)不包括這個字符時,稱為 "非包含的" (exclusive),而包括這個字符時,稱為 "包含的" (inclusive)。"$" 命令移動到行尾。所以,"d$" 命令從當(dāng)前的位置一直刪除到本行行尾。這是一個"包含的" 命令,所以,這行的最后一個字符也會被刪除: To err is human. a computer.
------------>d$ To err is human
以上定義了一個命令組合模式:操作符-動作。你首先輸入一個操作符命令,例如,"d"就是一個刪除操作符。然后你輸入一個動作命令,例如 "4l" 或者 "w"。這種方法使你可以在任何你能越過的文本上執(zhí)行各種操作。
另一個操作符命令是 "c",表示修改,change。它的作用方式與 "d" 操作符相似,只是完成后會切換到插入模式。例如,"cw" 修改一個詞,更精確的說,它刪除一個詞,并切換到插入模式。 To err is human
------->c2wbe<Esc>
To be human
這里 "c2wbe<Esc>
" 包括如下操作:c 修改操作符2w 移動兩個單詞的距離 (與操作符合起來,它刪除兩個單詞并進(jìn)入插入模式)be 插入 be 這個單詞<Esc>
切換回普通模式如果你留意,你會發(fā)現(xiàn)一個奇怪的地方:human 前面的空格沒有被刪除。有一句諺語說道:任何問題都有一個簡單,清楚但錯誤的回答。"cw" 命令就屬于這種情況。c 操作符在很多地方都和 d 一樣,但有一個例外,"cw"。它實(shí)際上象 "ce" 一樣,刪除到單詞尾。這樣單詞后面的空格就不包括在內(nèi)了。這要追溯到使用 Vi 的舊日子。由于很多人已經(jīng)習(xí)慣了這種方式,這個不一致之處就留在 Vim 里了。更 多 的 修 改 命 令像 "dd" 可以刪除一行一樣,"cc" 修改一整行。但它會保留這一行的縮進(jìn) (前導(dǎo)空格)。"d$" 刪除到行尾;"c$" 則修改到行尾。這相當(dāng)于先用 "d$" 刪除一行再用 "a" 啟動插入模式,以便加入新的文字???捷 鍵有些 "操作符-動作" 命令由于經(jīng)常被使用,所以被設(shè)置為單字符命令:x 表示 dl (刪除當(dāng)前光標(biāo)下的字符)X 表示 dh (刪除光標(biāo)左邊的字符)D 表示 d$ (刪除到行尾)C 表示 c$ (修改到行尾)s 表示 cl (修改一個字符)S 表示 cc (修改一整行)在 什 么 地 方 加 入 計(jì) 數(shù) 前 綴命令 "3dw" 和 "d3w" 都是刪除 3 個單詞。如果你非要尋根問底,那么:"3dw" 表示刪除一個單詞 3 次,而 "d3w" 表示刪除三個單詞一次。這是一個沒有分別的分別。實(shí)際上你可以放兩個計(jì)數(shù)前綴,例如,"3d2w" 刪除兩個單詞三次,共計(jì)六個單詞。替 換 單 個 字 符"r" 命令不是操作符。它只是等你輸入一個字符然后用這個字符替換當(dāng)前光標(biāo)上的字符。你可以用 "cl" 命令或者 "s" 命令完成相同的功能,但 "r" 命令不需要使用 <Esc>
退出插入狀態(tài): there is somerhing grong here
rT rt rw There is something wrong here
通過計(jì)數(shù)前綴,"r" 命令可以使多個字符被同一個字符替換,例如: There is something wrong here
5rx There is something xxxxx here
要用換行符替換一個字符可以用命令 "r<Enter>
"。這會刪除一個字符并插入一個換行符。在這里使用計(jì)數(shù)前綴會刪除多個字符但只插入一個換行符:"4r<Enter>
" 用一個換行符替換四個字符。
*04.3* 重復(fù)一個修改
"." 是 Vim 中一個非常簡單而有用的命令。它重復(fù)最后一次的修改操作。例如,假設(shè)你在編輯一個 HTML 文件,你想刪除所有的 <B>
標(biāo)記。你把光標(biāo)移到第一個 "<" 上,然后用 "df>" 命令刪除 <B>
。然后你就可以移到 </B>
的 < 上面用 "." 命令刪除它。"."命令執(zhí)行最后一次的修改命令 (在本例中,就是 "df>")。要刪除下一個 <B>
標(biāo)記,移動到下一個 < 的位置,再執(zhí)行 "." 命令即可。 To <B>
generate</B>
a table of <B>
contents
f< 找第一個 < --->
df> 刪除到 > -->f< 找下一個 < --------->
. 重復(fù) df> --->f< 找下一個 < ------------->
. 重復(fù) df > -->"." 命令重復(fù)任何除 "u" (撤銷),CTRL-R
(重做) 和冒號命令外的修改。再舉一個例子:你想把 "four" 修改成 "five"。有好幾個地方都要作這種修改。你可以用如下命令快速完成這個操作:/four<Enter>
找到第一個 "four"cwfive<Esc>
修改成 "five"n 找下一個 "four". 重復(fù)修改操作n 找下一個 "four". 重復(fù)修改如此類推......
要刪除一些簡單的東西,用 "操作符-動作" 命令可以完成得很好。但很多情況下,并不容易確定用什么命令可以移到你想修改的地方。這時候,你就需要可視模式了。你可以用 "v" 命令啟動可視模式。你可以移動光標(biāo)到需要的地方。當(dāng)你這樣做的時候,中間的文本會被高亮顯示。最后執(zhí)行一下 "操作符" 命令即可。例如,要從一個單詞的一半刪除到下一個單詞的一半: This is an examination sample of visual mode
---------->velllld This is an example of visual mode
但你這樣做的時候,你不需要真的算要按 l 多少次,你可以在按 "d" 前清楚得看到將要被刪除的是哪些文本。如果任何時候你改了主意,只用按一下 <Esc>
就能退出可視模式。按 行 選 擇如果你想對整行做操作,可以使用 "V" 命令來啟動可視模式。你會發(fā)現(xiàn)在你作任何移動之前,整行都被高亮顯示了。左右移動不會有任何效果。而通過上下移動,你可以一次選擇多行。例如,用 "Vjj" 可以選中三行:+------------------------+| text more text |>> | more text more text | |選中的行 >> | text text text | | Vjj>> | text more | V| more text more |+------------------------+列 塊 選 擇如果你要處理一個矩形塊內(nèi)的文本,可以使用 CTRL-V
啟動可視模式。這在處理表格時非常有用。name Q1 Q2 Q3pierre 123 455 234john 0 90 39steve 392 63 334要刪除中間 "Q2" 這一欄,把光標(biāo)移動到 "Q2" 的 "Q" 上面。按 CTRL-V
啟動列塊可視模式?,F(xiàn)在用 "3j" 向下移動三行,然后用 "w" 移到下一個單詞。你可以看到最后一欄的第一個字符也被包括進(jìn)來了。要去掉它,用 "h" 命令即可?,F(xiàn)在按 "d",中間一欄就被刪除了。移 動 到 另 一 端如果你在可視模式下選中了一些文字,然后你又發(fā)現(xiàn)你需要改變被選擇的文字的另一端,用 "o" 命令即可 (提示:"o" 表示 other end),光標(biāo)會移動到被選中文字的另一端,現(xiàn)在你可以移動光標(biāo)去改變選中文字的開始點(diǎn)了。再按 "o" 光標(biāo)還會回到另一端。當(dāng)使用列塊可視模式的時候,你會有四個角,"o" 只是把你移到對角上。而用 "O" 則能移到同一行的另一個角上。備注
: "o" 和 "O" 在可視模式下與在普通模式下的作用有很大的不同;在普通模式下,它們的作用是在光標(biāo)后或前加入新的一行。
當(dāng)你用 "d","x" 或者其它命令刪除文本的時候,這些文字會被存起來。你可以用 p 命令重新粘貼出來 (p 在 Vim 中表示 put,放置)。看看下面的例子。首先,你會在你要刪除的那一行上輸入 "dd" 刪除一整行,然后移動到你要重新插入這行的地方輸入 "p" (put),這樣這一行就會被插入到光標(biāo)下方。a line a line a lineline 2 dd line 3 p line 3line 3 line 2由于你刪除的是一整行,"p" 命令把該行插入到光標(biāo)下方。如果你刪除的是一行的一部分(例如一個單詞),"p" 命令會把它插入到光標(biāo)的后面。 Some more boring try text to out commands.
---->dw Some more boring text to out commands.
-------->welp Some more boring text to try out commands.
關(guān) 于 粘 貼 的 更 多 知 識"P" 命令象 "p" 一樣也是插入字符,但插入點(diǎn)在光標(biāo)前面。當(dāng)你用 "dd" 刪除一行,"P" 會把它插入到光標(biāo)所在行的前一行。而當(dāng)你用 "dw" 刪除一個單詞,"P" 會把它插入到光標(biāo)前面。你可以執(zhí)行這個命令多次,每次會插入相同的文本。"p" 和 "P" 命令接受計(jì)數(shù)前綴,被插入的文本就會被插入指定的次數(shù)。所以 "dd" 后加一個 "3p" 會把刪除行的三個拷貝插入到文本中。交 換 兩 個 字 符經(jīng)常發(fā)生這樣的情況,當(dāng)你輸入字符的時候,你的手指比腦子轉(zhuǎn)得快 (或者相反?)。這樣的結(jié)果是你經(jīng)常把 "the" 敲成 "teh"。Vim 讓你可以很容易得修正這種錯誤。只要把光標(biāo)移到 "teh" 的 "e" 上,然后執(zhí)行 "xp" 即可。這個工作過程是:"x" 刪除一個字符,保存到寄存器。"p" 把這個被保存的字符插入到光標(biāo)的后面,也就是在 "h" 的后面了。 teh th the
x p
要把文本從一個地方拷貝到另一個地方,你可以先刪除它,然后用 "u" 命令恢復(fù),再用"p" 拷到另一個地方。這里還有一種簡單的辦法:抽出 (yank)。"y" 命令可以把文字拷貝到寄存器中。然后用 "p" 命令粘貼到別處。yanking 是 Vim 中拷貝命令的名字。由于 "c" 已經(jīng)被用于表示 change 了,所以拷貝 (copy) 就不能再用 "c" 了。但 "y" 還是可用的。把這個命令稱為 "yanking" 是為了更容易記住 "y" 這個鍵。(譯者注
:這里只是把原文譯出以作參考,"抽出" 文本畢竟是不妥的。后文中將統(tǒng)一使用 "拷貝"。中文可不存在 change 和 copy 的問題。)由于 "y" 是一個操作符,所以 "yw" 命令就是拷貝一個單詞了。當(dāng)然了,計(jì)數(shù)前綴也是有效的。要拷貝兩個單詞,就可以用 "y2w"。例如: let sqr = LongVariable *
-------------->y2w let sqr = LongVariable *
p let sqr = LongVariable * LongVariable
注意
:"yw" 命令包括單詞后面的空白字符。如果你不想要這個字符,改用 "ye" 命令。"yy" 命令拷貝一整行,就像 "dd" 刪除一整行一樣。出乎意料地是,"D" 刪除到行尾而"Y" 卻是拷貝一整行。要注意
這個區(qū)別!"y$" 拷貝到行尾。a text line yy a text line a text lineline 2 line 2 p line 2last line last line a text linelast line
如果你使用 Vim 的 GUI 版本 (gvim),你可以在 "Edit" 菜單中找到 "Copy" 項(xiàng)。你可以先用可視模式選中一些文本,然后使用 Edit/Copy 菜單?,F(xiàn)在被選中的文本被拷進(jìn)了剪貼板。你可以把它粘貼到其它程序,或者在 Vim 內(nèi)部使用。如果你已經(jīng)從其它程序中拷貝了一些文字到剪貼板,你可以在 Vim 中用 Edit/Paste 菜單粘貼進(jìn)來,這在普通模式和插入模式中都是有效的。如果在可視模式,被選中的文字會被替換掉。"Cut" 菜單項(xiàng)會在把文字拷進(jìn)剪貼板前刪除它。"Copy","Cut" 和 "Paste" 命令在彈出菜單中也有 (當(dāng)然了,前提是有彈出式菜單)。如果你的 Vim 有工具條,在工具條上也能找到這些命令。如果你用的不是 GUI,或者你根本不喜歡用菜單,你只能用其它辦法了。你還是可以用普通的 "y" (yank) 和 "p" (put) 命令,但在前面必須加上 "* (一個雙引號加一個星號)。例如,要拷貝一行到剪貼板中: "*yy
要粘貼回來: "*p
這僅在支持剪貼板的 Vim 版本中才能工作。關(guān)于剪貼板的更多內(nèi)容請參見 |09.3| 和|clipboard|。
如果你在一個單詞的中間而又想刪掉這個單詞,在你用 "dw" 前,你必須先移到這個單詞的開始處。這里還有一個更簡單的方法:"daw"。 this is some example text.
daw this is some text.
"daw" 的 "d" 是刪除操作符。"aw" 是一個文本對象。提示:"aw" 表示 "A Word" (一個單詞),這樣,"daw" 就是 "Delete A Word" (刪除一個單詞)。確切地說,該單詞后的空格字符也被刪除掉了。使用文本對象是 Vim 中執(zhí)行修改的第三種方法。我們已經(jīng)有 "操作符-動作" 和可視模式兩種方法了?,F(xiàn)在我們又有了 "操作符-文本對象"。這種方法與 "操作符-動作" 很相似,但它不是操作于從當(dāng)前位置到移動目標(biāo)間的內(nèi)容,而是對光標(biāo)所在位置的 "文本對象" 進(jìn)行操作。文本對象是作為一個整體來處理的。現(xiàn)在光標(biāo)在對象中的位置無關(guān)緊要。用 "cis" 可以改變一個句子??聪旅娴木渥樱?code class="section"> Hello there. This is an example. Just
some text.
移動到第二行的開始處。現(xiàn)在使用 "cis": Hello there. Just
some text.
現(xiàn)在你輸入新的句子 "Another line.": Hello there. Another line. Just
some text.
"cis" 包括 "c" (change,修改) 操作符和 "is" 文本對象。這表示 "Inner Sentence"(內(nèi)含句子)。還有一個文本對象是 "as",區(qū)別是 "as" 包括句子后面的空白字符而 "is"不包括。如果你要刪除一個句子,而且你還想同時刪除句子后面空白字符,就用 "das";如果你想保留空白字符而替換一個句子,則使用 "cis"。你還可以在可視模式下使用文本對象。這樣會選中一個文本對象,而且繼續(xù)留在可視模式,你可以繼續(xù)多次執(zhí)行文本對象命令。例如,先用 "v" 啟動可視模式,再用 "as" 就可以選中一個句子?,F(xiàn)在重復(fù)執(zhí)行 "as",就會繼續(xù)選中更多的句子。最后你可以使用一個操作符去處理這些被選中的句子。你可以在這里找到一個詳細(xì)的文本對象的列表:|text-objects|。
"R" 命令啟動替換模式。在這個模式下,你輸入的每個字符都會覆蓋當(dāng)前光標(biāo)上的字符。這會一直持續(xù)下去,直到你輸入 <Esc>
。在下面的例子中,你在 "text" 的第一個 "t" 上啟動替換模式: This is text.
Rinteresting.<Esc>
This is interesting.
你可能會注意
到,這是用十二個字符替換一行中的五個字符。如果超出行的范圍,"R" 命令自動進(jìn)行行擴(kuò)展,而不是替換到下一行。你可以通過 <Insert>
在插入模式和替換模式間切換。但當(dāng)你使用 <BS>
(退格鍵) 進(jìn)行修正時,你會發(fā)現(xiàn)原來被替換的字符又回來了。這就好像一個 "撤消" 命令一樣。
操作符,移動命令和文本對象可以有各種組合。現(xiàn)在你已經(jīng)知道它是怎么工作了,你可以用 N 個操作符加上 M 個移動命令,組合出 N*M 個命令!你可以在這里找到一個操作符的列表:|operator|還有很多方法可以刪除文本。這是一些經(jīng)常用到的:x 刪除光標(biāo)下的字符 ("dl" 的縮寫)X 刪除光標(biāo)前的字符 ("dh" 的縮寫)D 從當(dāng)前位置刪除到行尾 ("d$" 的縮寫)dw 從當(dāng)前位置刪除到下一個單詞開頭db 從當(dāng)前位置刪除到前一個單詞的開頭diw 刪除光標(biāo)上的單詞 (不包括空白字符)daw 刪除光標(biāo)上的單詞 (包括空白字符)dG 刪除到文件末dgg 刪除到文件首如果你用 "c" 代替 "d",這會變成修改命令;而改用 "y",則變成拷貝命令,等等等等。還有一些常用的進(jìn)行修改的命令,放在哪一章都不合適,列在這里:~ 修改光標(biāo)下字符的大小寫,并移動到下一個字符。這不是一個操作符(除非設(shè)置了 'tildeop'),所以你不能連接一個動作命令。這個命令在可視模式下也有效,它會改變被選中的所有文本的大小寫。I 移到當(dāng)前行的第一個非空字符并啟動插入模式。A 移動到行尾并啟動插入模式。