vim 命令(全)
本章提供足夠的信息使你用夠使用 Vim 來做基本的編輯。這里提供的方法不一定是高效?
快捷的。但起碼是有效的。花些時間去練習(xí)這些命令,這是后面的知識的基礎(chǔ)。
|02.1|? 第一次運(yùn)行 Vim?
|02.2|? 插入文本?
|02.3|? 移動光標(biāo)?
|02.4|? 刪除字符?
|02.5|? 撤銷與重做?
|02.6|? 其它編輯命令?
|02.7|? 退出?
|02.8|? 尋求幫助
??? 下一章:|usr_03.txt| 移動?
??? 前一章:|usr_01.txt| 關(guān)于本手冊?
????? 目錄:|usr_toc.txt|
?
--------------------------------------------------------------------------------
*02.1*? 第一次運(yùn)行 Vim
啟動 Vim 的命令如下:
??????? gvim file.txt
在 UNIX 操作系統(tǒng)中,你可以在任意命令提示符下輸入這個命令。如果你用的是 Microsoft?
Windows, 啟動一個 MS-DOS 窗口,再輸入這個命令。?
??? 無論哪一種方式,現(xiàn)在 Vim 開始編輯一個名為 file.txt 的文件了。由于這是一個新建?
文件,你會得到一個空的窗口。屏幕看起來會象下面這樣:
??????? +---------------------------------------+?
??????? |#????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |"file.txt" [New file]????????????????? |?
??????? +---------------------------------------+?
??????????????? ('#"是當(dāng)前光標(biāo)的位置)
以波紋線(~)開頭的行表示該行在文件中不存在。換句話說,如果 Vim 打開的文件不能充滿?
這個顯示的屏幕,它就會顯示以波紋線開頭的行。在屏幕的底部,有一個消息行指示文件?
名為 file.txt 并且說明這是一個新建的文件。這行信息是臨時的,新的信息可以覆蓋它。
VIM 命 令
gvim 命令建立一個新窗口用于編輯。如果你用的是這個命令:
??????? vim file.txt
則編輯在命令窗口內(nèi)進(jìn)行。換句話說,如果你在 xterm 中運(yùn)行,編輯器使用 xterm 窗口。?
如果你用的是 Microsoft Window 的 MS-DOS 窗口,編輯器使用這個 MS-DOS 窗口。兩個?
版本顯示出來的文本看起來是一樣的。但如果你用的是 gvim,就會有其他特性,如菜單條。?
后面會有更多的描述。
?
--------------------------------------------------------------------------------
*02.2*? 插入文本
Vim 是一個多模式的編輯器。就是說,在不同模式下,編輯器的響應(yīng)是不同的。在普通模式?
下,你敲入的字符只是命令;而在插入模式,你敲入的字符就成為插入的文本了。?
??? 當(dāng)你剛剛進(jìn)入 Vim,它處在普通模式。通過敲入"i"命令(i是 Insert 的縮寫)可以啟動?
插入模式,這樣你就可以輸入文字了,這些文字將被插入到文件中。不用擔(dān)心輸錯了, 你還?
能夠隨后修正它。要輸入下文的程序員打油詩,你可以這樣敲:
??????? iA very intelligent turtle?
??????? Found programming UNIX a hurdle
輸入"turtle"后,你通過輸入回車開始一個新行。最后,你輸入 <Esc> 鍵退出插入模式而?
回到普通模式。現(xiàn)在在你的 Vim 窗口中就有兩行文字了:
??????? +---------------------------------------+?
??????? |A very intelligent turtle????????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+
我 在 什 么 模 式?
要看到你在什么模式,輸入如下命令:
??????? :set showmode
你會發(fā)現(xiàn)當(dāng)你敲入冒號后,Vim 把光標(biāo)移到窗口的最后一行。那里是你輸入“冒號命令”?
(以冒號開頭的命令)的地方,敲入回車結(jié)束這個命令的輸入(所有的冒號命令都用?
這種方式結(jié)束)。?
??? 現(xiàn)在,如果你輸入 "i" 命令,Vim 會在窗口的底部顯示 --INSERT--(中文模式?
顯示的是--插入-- —— 譯者注),這表示你在插入模式。
??????? +---------------------------------------+?
??????? |A very intelligent turtle????????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |-- INSERT --?????????????????????????? |?
??????? +---------------------------------------+
如果你輸入<Esc>回到普通模式,最后一行又變成空白。
解 決 問 題
Vim 新手常常遇到的一個問題是不知道自己在什么模式下,可能是因?yàn)橥?#xff0c;也可能?
是因?yàn)椴恍⌒那昧艘粋€切換模式的命令。無論你在什么模式,要回到普通模式,只?
要敲 <Esc> 就可以了。有時你需要敲兩次,如果 Vim 發(fā)出“嘀”一聲,就表示你已經(jīng)?
在普通模式了。
?
--------------------------------------------------------------------------------
*02.3*? 移動光標(biāo)
回到普通模式后,你可以使用如下命令移動光標(biāo):
??????? h?????? 左????????????????????????????????????????????? *hjkl*?
??????? j?????? 下?
??????? k?????? 上?
??????? l?????? 右
這些命令看起來是隨便選的。無論如何,誰聽說過用 l 表示右的?但實(shí)際上,作這些選擇?
是有理由的:移動光標(biāo)是最常用的編輯器命令。而這些鍵位是在你本位的右手。也就是說:?
這種鍵位的設(shè)定使你可以以最快的速度執(zhí)行移動操作(特別是當(dāng)你用十指輸入的時候)。
??????? Note:?
??????? 你還可以用方向鍵移動光標(biāo),但這樣會減慢你輸入的速度,因?yàn)槟惚仨毎涯愕氖謴?
??????? 字母鍵移動到方向鍵。想象一下,你在一個小時內(nèi)可要這樣做幾百次,這可要花?
??????? 相當(dāng)多的時間的。?
??????????? 而且,有一些鍵盤是沒有方向鍵的,或者放在一些很特別的地方。所以,?
??????? 知道 hjkl 的用法在這些情況下就很有幫助了。
記住這些命令的一個方法是:h 在左邊,l 在右邊,j 指著下面。用圖表示如下:
?????????????????????? k?
?????????????????? h???? l?
???????????????????? j
學(xué)習(xí)這些命令的最好方法是使用它。用 "i" 命令輸入更多的文字。然后用 hjkl 鍵移動?
光標(biāo)并在某些地方輸入一些單詞。別忘了用 <Esc> 切換回普通模式。|vimtutor|也是一個?
練習(xí)的好辦法。
?
--------------------------------------------------------------------------------
*02.4*? 刪除字符
要刪除一個字符,把光標(biāo)移到它上面然后輸入 "x"。(這是對以前的打字機(jī)的一種回歸,?
那時你通過在字符上輸入xxxx刪除它) 例如,把光標(biāo)移到行首,然后輸入xxxxxxx(七個x)?
可以刪除 "A very"。結(jié)果看起來這樣:
??????? +---------------------------------------+?
??????? |intelligent turtle???????????????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+
現(xiàn)在你可以輸入新的字符了,例如,通過輸入:
??????? iA young <Esc>
這個命令啟動一次插入操作(那個"i"),并插入 "A young",然后退出?
插入模式(最后一個<Esc>)。結(jié)果是:
??????? +---------------------------------------+?
??????? |A young intelligent turtle???????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+
刪 除 一 行
要刪除一整行,使用 "dd" 命令,后一行會移上來填掉留下的空行:
??????? +---------------------------------------+?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+
刪 除 一 個 分 行 符
在 Vim 中你可以把兩行連起來,這意味著兩行間的換行符被刪除了。"J" 命令?
用于完成這個功能。?
??? 以下面兩行為例子:
??????? A young intelligent?
??????? turtle
把光標(biāo)移到第一行,然后按 "J":
??????? A young intelligent turtle
?
--------------------------------------------------------------------------------
*02.5*? 撤銷與重做
假設(shè)現(xiàn)在你刪得太多了。當(dāng)然,你可以重新輸入需要的內(nèi)容。不過,你還有一個更簡單的?
選擇。"u" 命令撤銷上一個編輯操作。看看下面這個操作:先用 "dd" 刪除一行,再敲?
"u",該行又回來了。?
??? 再給一個例子:把光標(biāo)移到第一行的 A 上:
??????? A young intelligent turtle
現(xiàn)在輸入 xxxxxxx 刪除 "A young"。結(jié)果如下:
??????? intelligent turtle
輸入"u" 撤銷最后一個刪除操作。那個刪除操作刪除字符 g,所以撤銷命令恢復(fù)這個字符:
??????? g intelligent turtle
下一個 u 命令恢復(fù)倒數(shù)第二個被刪除的字符:
??????? ng intelligent turtle
下一個 u 命令恢復(fù) u,如此類推:
??????? ung intelligent turtle?
??????? oung intelligent turtle?
??????? young intelligent turtle?
??????? young intelligent turtle?
??????? A young intelligent turtle
??????? Note:?
??????? 如果你輸入 "u" 兩次,你的文本恢復(fù)原樣,那應(yīng)該是你的 Vim 被配置在 Vi 兼容?
??????? 模式了。看這里修正這個問題:|not-compatible|。?
??????? 本文假定你工作在 "Vim 的方式"。你可能更喜歡舊的 Vi 的模式,但是你必須?
??????? 小心本文中的一些小區(qū)別。
重 做
如果你撤銷得太多,你可以輸入CTRL-R(redo)回退前一個命令。換句話說,它撤銷?
一個撤銷。要看執(zhí)行的例子,輸入CTRL-R兩次。字符 A 和它后面的空格就出現(xiàn)了:
??????? young intelligent turtle
有一個特殊版本的撤銷命令:"U" (行撤銷)。行撤銷命令撤銷所有在前一個編輯行?
上的操作。 輸入這些命令兩次取消前一個 "U":
??????? A very intelligent turtle?
????????? xxxx????????????????? 刪除 very
??????? A intelligent turtle?
????????????????????? xxxxxx??????????? 刪除turtle
??????? A intelligent?
??????????????????????????????? 用 "U" 恢復(fù)行?
??????? A very intelligent turtle?
??????????????????????????????? 用 "u" 撤銷 "U"?
??????? A intelligent
"U" 命令本身就是一個改變操作,"u" 命令撤銷該操作,CTRL-R 命令重做該操作。?
有點(diǎn)亂吧, 但不用擔(dān)心,用 "u" 和 CTRL-R 命令你可以切換到任何你編輯過的狀態(tài)。
?
--------------------------------------------------------------------------------
*02.6*? 其它編輯命令
Vim 有大量的命令可以修改文本。參見|Q_in|和下文。這里是一些經(jīng)常用到的:
添 加
"i" 命令在光標(biāo)所在字符前面插入字符。一般情況下,這就夠用了,但如果你剛好想在?
行尾加?xùn)|西怎么辦?要解決這個問題,你需要在文本后插入字符。這通過 "a" (append)?
命令實(shí)現(xiàn)。?
??? 例如,要把如下行
??????? and that's not saying much for the turtle.?
改為?
??????? and that's not saying much for the turtle!!!
把光標(biāo)移到行尾的句號上。然后輸入 "x" 刪除它。現(xiàn)在光標(biāo)處于一行的尾部了,現(xiàn)在輸入
??????? a!!!<Esc>
添加三個感嘆號到 turtle 的 "e" 后面:
??????? and that's not saying much for the turtle!!!
開 始 一 個 新 行
"o" 命令在光標(biāo)下方建立一個新的空行,并把 Vim 切換到插入模式。然后你可以在這個?
新行內(nèi)輸入文本了。?
??? 假定你的光標(biāo)在下面兩行中第一行的某個地方:
??????? A very intelligent turtle?
??????? Found programming UNIX a hurdle
如果你現(xiàn)在用 "o" 命令并輸入新的文字:
??????? oThat liked using Vim<Esc>
結(jié)果會是:
??????? A very intelligent turtle?
??????? That liked using Vim?
??????? Found programming UNIX a hurdle
"O" 命令(大寫)在光標(biāo)上方打開一個新行。
指 定 次 數(shù)
假定你想向上移動 9 行,你可以輸入 "kkkkkkkkk" 或者你可以輸入"9k"。實(shí)際上,?
你可以在很多命令前面加一個數(shù)字。例如在這章的前面,你通過輸入 "a!!!<Esc>"?
增加三個感嘆號。另一個方法是使用命令 "3a!<Esc>"。次數(shù) 3 要求把后面的命令?
執(zhí)行三次。同樣的,要刪除三個字符,可以使用 "3x"。次數(shù)總是放在要被處理多次?
的命令的前面。
?
--------------------------------------------------------------------------------
*02.7*? 退出
使用 "ZZ" 命令可以退出。這個命令保存文件并退出。?
??????? Note:?
??????? 與其他編輯器不一樣,Vim 不會自動建立一個備份文件。如果你輸入 "ZZ",?
??????? 你的修改立即生效并且不能恢復(fù)。你可以配置 Vim 讓它產(chǎn)生一個備份文件,?
??????? 參見|07.4|。
放 棄 修 改
有時你會做了一系列的修改才突然發(fā)現(xiàn)還不如編輯之前。不用擔(dān)心,Vim 有“放棄修改?
并退出”的命令,那就是:
??????? :q!
別忘了按回車使你的命令生效。
這個命令執(zhí)行的細(xì)節(jié)是:命令有三部分,包括冒號(:),它使 Vim 進(jìn)入命令模式,?
q 命令,它告訴 Vim 退出,而感嘆號是強(qiáng)制命令修飾符。?
??? 這里,強(qiáng)制命令修飾符是必要的,它強(qiáng)制性地要求 Vim 放棄修改并退出。如果你只是?
輸入":q",Vim 會顯示一個錯誤信息并拒絕退出:
??????? E37: No write since last change (use ! to override)
通過指定強(qiáng)制執(zhí)行,你實(shí)際上在告訴 Vim:“我知道我所做的看起來很傻,但我長大了,?
知道自己在做什么。”
如果你放棄修改后還想重新編輯,用 ":e!" 命令可以重新裝載原來的文件。
?
--------------------------------------------------------------------------------
*02.8*? 尋求幫助
所有你想知道的東西,都可以在 Vim 幫助文件中找到答案,隨便問!?
??? 要獲得一般的幫助用這個命令:
??????? :help
你還可以用第一個功能鍵 <F1>。如果你的鍵盤上有一個 <Help> 鍵,可能也有效。?
??? 如果你不指定主題,":help" 將命令顯示一個總攬的幫助窗口。Vim 的作者在幫助系?
統(tǒng)方面使用了一個很聰明的方案(也許可以說是很懶惰的方案):他們用一個普通的編輯窗?
口來顯示幫助。你可以在幫助窗口中使用任何普通的 Vim 命令移動光標(biāo)。所以,h,j,k?
和 l 還是表示左,下,上和右。?
??? 要退出幫助窗口,用退出一個普通窗口的命令:"ZZ"。這只會退出幫助窗口,而不會?
退出 Vim。
當(dāng)你閱讀幫助的時候,你會發(fā)現(xiàn)有一些文字被一對豎線括起來了(例如|help|)。這表示?
一個超級鏈接。如果你把光標(biāo)移到這兩個豎線之間并按 CTRL-](標(biāo)簽跳轉(zhuǎn)命令), 幫助?
系統(tǒng)會把你引向這個超級鏈接指向的主題。(由于不是本章的重點(diǎn),這里不詳細(xì)討論,?
Vim 對超級鏈接的術(shù)語是 "標(biāo)簽"(tag),所以 CTRL-] 實(shí)際是跳轉(zhuǎn)到光標(biāo)所在單詞為名?
的標(biāo)簽所在的位置。)?
??? 跳轉(zhuǎn)幾次以后,你可能想回到原來的地方。CTRL-T(標(biāo)簽退棧)把你送回前一個?
跳轉(zhuǎn)點(diǎn)。CTRL-O (跳轉(zhuǎn)到前一個位置)也能完成相同的功能。?
??? 在幫助屏幕的頂上,有一個符號: *help.txt*。這個名字被幫助系統(tǒng)用來定義一個標(biāo)簽?
(也就是超級鏈接的目標(biāo))。?
??? 參見|29.1|可以了解更多關(guān)于標(biāo)簽的內(nèi)容。
要獲得特定主題的幫助,使用如下命令:
??????? :help {主題}
例如,要獲得 "x" 命令的幫助,輸入如下命令:
??????? :help x
要知道如何刪除文本,使用如下命令:
??????? :help deleting
要獲得所有命令的幫助索引,使用如下命令:
??????? help index
如果你需要獲得一個包含控制字符的命令的幫助(例如 CTRL-A),你可以在它前面?
加上前綴"CTRL-"。
??????? help CTRL-A
Vim 有很多模式。在默認(rèn)情況下,幫助系統(tǒng)顯示普通模式的命令。例如,如下命令顯示?
普通模式的 CTRL-H 命令的幫助:
??????? :help CTRL-H
要表示其他模式,可以使用模式前綴。如果你需要插入模式的命令幫助,使用 "i_" 前?
綴。例如對于 CTRL-H,你可以用如下命令:
??????? :help i_CTRL-H
當(dāng)你啟動 Vim,你可以使用一些命令行參數(shù)。這些參數(shù)以短橫線開頭(-)。例如知道要-t?
這個參數(shù)是干什么用的,可以使用這個命令:
??????? :help -t
Vim 有大量的選項(xiàng)讓你定制這個編輯器。如果你要獲得選項(xiàng)的幫助,你需要把它括在一個?
單引號中。例如,要知道 'number' 這個選項(xiàng)干什么的,使用如下命令:
??????? :help 'number'
如果你看到一個你不能理解的錯誤信息,例如:
??????? E37: No write since last change (use ! to override)
你可以使用使用E開頭的錯誤號找關(guān)于它的幫助:
??????? :help E37?
移 動
在你插入或者刪除之前,你需要移動到合適的位置。Vim 有一大堆命令可以移動光標(biāo)。?
本章向你介紹最重要的那些。你可以在 |Q_lr| 下面找到這些命令的列表。
|03.1|? 詞移動?
|03.2|? 移動到行首或行尾?
|03.3|? 移動到指定的字符?
|03.4|? 括號匹配?
|03.5|? 移動到指定的行?
|03.6|? 確定當(dāng)前位置?
|03.7|? 滾屏?
|03.8|? 簡單查找?
|03.9|? 簡單的查找模式?
|03.10| 使用標(biāo)記
??? 下一章:|usr_04.txt|? 做小改動?
??? 前一章:|usr_02.txt|? Vim 初步?
????? 目錄:|usr_toc.txt|
?
--------------------------------------------------------------------------------
*03.1*? 詞移動
要移動光標(biāo)向前跳一個詞,可以使用 "w" 命令。象大多數(shù) Vim 命令一樣,你可以在命令前?
加數(shù)字前綴表示把這個命令重復(fù)多次。例如,"3w" 表示向前移動3個單詞。用圖表示如下:
??????? This is a line with example text?
????????? --->-->->----------------->?
?????????? w? w? w??? 3w
要注意的是,如果光標(biāo)已經(jīng)在一個單詞的詞首,"w" 移動到下一個單詞的詞首。?
??? "b" 命令向后移動到前一個詞的詞首:
??????? This is a line with example text?
??????? <----<--<-<---------<---?
?????????? b?? b b??? 2b????? b
還有一個 "e" 命令可以移到下一個單詞的詞末,而 "ge" 則移動到前一個單詞的末尾:
??????? This is a line with example text?
?????????? <-?? <--- ----->?? ---->?
?????????? ge??? ge???? e?????? e
如果你在一行的最后一個單詞,"w" 命令將把你帶到下一行的第一個單詞。這樣你可以?
用這個命令在一段中移動,這比使用 "l" 要快得多。"b" 則在反方向完成這個功能。
一個詞以非單詞字符結(jié)尾,例如 ".","-" 或者 ")"。要改變 Vim 使用的 "分詞符",?
請參見 'iskeyword' 選項(xiàng)。?
??? 還可以以 "空白字符" 分割的 "大單詞" 移動。這不是我們通常意義的 "單詞”。這?
就是為什么稱之為 "大單詞" 的原因。如下圖所示:
?????????????? ge????? b????????? w???????????????????????????? e?
?????????????? <-???? <-???????? --->????????????????????????? --->?
??????? This is-a line, with special/separated/words (and some more).?
?????????? <----- <-----???????? -------------------->???????? ----->?
???????????? gE????? B?????????????????? W?????????????????????? E?
?????????????? ge????? b????????? w???????????????????????????? e
組合運(yùn)用這些大寫和小寫的命令,你可以很快地在一段中前后移動。
?
--------------------------------------------------------------------------------
*03.2*? 移動到行首或行尾
"$" 命令把光標(biāo)移動到當(dāng)前行行尾。如果你的鍵盤上有 <End> 鍵,也可以完成相同的功能。
"^" 命令把光標(biāo)移動到當(dāng)前行的第一個非空字符,而 "0" 命令則移到一行的第一個字符,?
<Home> 鍵也可以完成相同的功能。圖示如下:
????????????????? ^?
???????????? <------------?
??????? .....This is a line with example text?
??????? <-----------------?? --------------->?
??????????????? 0????????????????? $
(這里 "....." 表示空白字符)
??? 象大多數(shù)移動命令一樣,"$" 命令接受個次數(shù)前綴。但是 "移動到一行的行尾n次" 沒?
有什么意義,所以它會使光標(biāo)移動到另一行。例如,"1$" 移動到當(dāng)前行的行尾,而?
"2$" 則移動到下一行的行尾,如此類推。?
??? "0" 命令不能加個數(shù)前綴,因?yàn)?"0" 本身就是個數(shù)字。而且,出人意料地是,"^" 命?
令也不支持?jǐn)?shù)字前綴。
?
--------------------------------------------------------------------------------
*03.3*? 移動到一個指定的字符
單字符查找命令是最有用的移動命令之一。"fx" 命令向前查找本行中的字符 x。提示:?
"f" 表示 "Find"。?
??? 例如,假定你在下面例子行的行首,而你想移動到單詞 "human" 的h那里。只要執(zhí)行?
命令 "fh" 即可:
??????? To err is human.? To really foul up you need a computer.?
??????? ---------->--------------->?
??????????? fh?????????? fy
這個例子還演示了用 "fy" 命令移動到 "really" 的詞尾。?
??? 你可以在這個命令前面加數(shù)字前綴,所以,你可以用 "3fl" 命令移動到 "foul" 的?
"l":
??????? To err is human.? To really foul up you need a computer.?
????????????????? --------------------->?
?????????????????????????? 3fl
"F" 命令用于向左查找:
??????? To err is human.? To really foul up you need a computer.?
????????????????? <---------------------?
??????????????????????????? Fh
"tx" 命令與 "fx" 相似,但它只把光標(biāo)移動到目標(biāo)字符的前一個字符上。提示:"t"?
表示 "To"。這個命令的反向版本是 "Tx"。
??????? To err is human.? To really foul up you need a computer.?
?????????????????? <------------? ------------->?
??????????????????????? Th????????????? tn
這四個命令可以通過 ";" 命令重復(fù),"," 命令則用于反向重復(fù)。無論用哪個命令,光標(biāo)?
永遠(yuǎn)都不會移出當(dāng)前行,哪怕是這兩行是連續(xù)的一個句子。
有時你啟動了一個查找命令后才發(fā)現(xiàn)自己執(zhí)行了一個錯誤的命令。例如,你啟動了一個?
"f" 命令后才發(fā)現(xiàn)你本來想用的是 "F"。要放棄這個查找,輸入 <Esc>。所以?
"f<Esc>" 取消一個向前查找命令而不做任何操作。 Note: <Esc> 可以中止大部分命令,?
而不僅僅是查找。
?
--------------------------------------------------------------------------------
*03.4*? 括號匹配
當(dāng)你寫程序的時候,你經(jīng)常會遇到嵌套的()結(jié)構(gòu)。這時,"%" 是一個非常方便的命令?
了:它能匹配一對括號。如果光標(biāo)在 "(" 上,它移動到對應(yīng)的 ")" 上,反之,如果它在?
")" 上,它移動到 "(" 上。
??????????????????????????? %?
???????????????????????? <----->?
??????????????? if (a == (b * c) / d)?
?????????????????? <---------------->?
??????????????????????????? %
這個命令也可適用于 [] 和 {}。(可用'matchpairs'選項(xiàng)定義)
當(dāng)光標(biāo)不在一個有用的字符上,"%" 會先向前找到一個。比如當(dāng)光標(biāo)停留在上例中的行?
首時,"%" 會向前查找到第一個 "("。然后會移動到它的匹配處。
??????????????? if (a == (b * c) / d)?
??????????????? ---+---------------->?
?????????????????????????? %
?
--------------------------------------------------------------------------------
*03.5*? 移動到指定的行
如果你是一個 C 或者 C++ 程序員,你對下面這樣的錯誤信息應(yīng)該非常熟悉:
??????? prog.c:33: j?? undeclared (first use in this function)
這表示你可能要移動到 33 行去作一些修改了。那么怎樣找到 33 行?一個辦法是執(zhí)行?
"9999k" 命令移到文件頭,再執(zhí)行 "32j" 下移到32行。這不是一個好辦法,但肯定有效。?
更好的方法是使用 "G" 命令。加上一個次數(shù)前綴,這個命令可以把你送到指定的行。?
例如,"33G" 把你送到 33 行。(要用更好的方法在編譯器的錯誤列表中移動,參見?
|usr_30.txt| 的 ":make" 命令部分。)?
??? 如果沒有數(shù)字前綴,"G" 命令把光標(biāo)移動到文末。移動到文首的命令是 "gg"。"1G"?
也能完成這個功能,但稍復(fù)雜一點(diǎn)。
??????????? |?? first line of a file?? ^?
??????????? |?? text text text text??? |?
??????????? |?? text text text text??? |? gg?
??????? 7G? |?? text text text text??? |?
??????????? |?? text text text text?
??????????? |?? text text text text?
??????????? V?? text text text text??? |?
??????????????? text text text text??? |? G?
??????????????? text text text text??? |?
??????????????? last line of a file??? V
另一個定位行的方法是使用帶數(shù)字前綴的 "%" 命令。例如,"50%" 移動到文件的中間,?
而 "90%" 移到差不多結(jié)尾的位置。
前面的描述假定你想移動到文件中的某一行,而不在乎它是否可見。那么如何移動到視野?
之內(nèi)的一行呢?下圖演示了三個可以使用的命令:
??????????????????????? +---------------------------+?
??????????????? H -->?? | text sample text????????? |?
??????????????????????? | sample text?????????????? |?
??????????????????????? | text sample text????????? |?
??????????????????????? | sample text?????????????? |?
??????????????? M -->?? | text sample text????????? |?
??????????????????????? | sample text?????????????? |?
??????????????????????? | text sample text????????? |?
??????????????????????? | sample text?????????????? |?
??????????????? L -->?? | text sample text????????? |?
??????????????????????? +---------------------------+
提示:"H" 表示 "Home","M" 表示 "Middle" 而 "L" 表示 "Last"。
?
--------------------------------------------------------------------------------
*03.6*? 確定當(dāng)前位置
要確定你在文件中的位置,有三種方法:
1.? 使用 CTRL-G 命令,你會獲得如下消息(假定 'ruler' 選項(xiàng)已經(jīng)被關(guān)閉):
??????? "usr_03.txt" line 233 of 650 --35%-- col 45-52
??? 這里顯示了你正在編輯的文件的名稱,你所處的當(dāng)前行的行號,全文的總行數(shù),光標(biāo)?
??? 以前的行占全文的百分比,和你所處的列的列號。?
??? 有時你會看到一個分開的兩個列號。例如,"col 2-9"。這表示光標(biāo)處于第二個字符?
??? 上,但由于使用了制表符,在屏幕上的位置是 9。
2. 設(shè)置 'number' 選項(xiàng)。這會在每行的前面加上一個行號:
??????? :set number
??? 要重新關(guān)閉這個選項(xiàng):
??????? :set nonumber
??? 由于'number'是一個布爾類型的選項(xiàng),在它前面加上 "no" 表示關(guān)閉它。布爾選項(xiàng)只會?
??? 有兩個值,on 或者 off。?
????? Vim 有很多選項(xiàng),除了布爾類型的,還有數(shù)字或者字符串類型的。在用到的時候會給?
??? 處一些例子的。
3.? 設(shè)置 'ruler' 選項(xiàng)。這會在 Vim 窗口的右下角顯示當(dāng)前光標(biāo)的位置:
??????? :set ruler
使用 'ruler' 的好處是它不占多少地方,從而可以留下更多的地方給你的文本。
?
--------------------------------------------------------------------------------
*03.7*? 滾屏
CTRL-U 命令向下滾動半屏。想象一下通過一個視口看著你的文本,然后把這個視口向上移動?
該視口的一半高度。這樣,窗口移動到當(dāng)前文字的上面,而文字則移到窗口的下面。不用擔(dān)心?
記不住那邊是上。很多人都是這樣。?
??? CTRL-D命令把視窗向下移動半屏,所以把文字向上移動半屏。
?????????????????????????????????????? +----------------+?
?????????????????????????????????????? | some text????? |?
?????????????????????????????????????? | some text????? |?
?????????????????????????????????????? | some text????? |?
??????? +---------------+????????????? | some text????? |?
??????? | some text???? |? CTRL-U? --> |??????????????? |?
??????? |?????????????? |????????????? | 123456???????? |?
??????? | 123456??????? |????????????? +----------------+?
??????? | 7890????????? |?
??????? |?????????????? |????????????? +----------------+?
??????? | example?????? |? CTRL-D -->? | 7890?????????? |?
??????? +---------------+????????????? |??????????????? |?
?????????????????????????????????????? | example??????? |?
?????????????????????????????????????? | example??????? |?
?????????????????????????????????????? | example??????? |?
?????????????????????????????????????? | example??????? |?
?????????????????????????????????????? +----------------+
每次滾一行的命令是 CTRL-E(上滾)和 CTRL-Y(下滾)。可以把 CTRL-E 想象為是多給你?
一行(one line Extra)。
向前滾動一整屏的命令是 CTRL-F(實(shí)際上會留下兩行不滾動)。反向的命令是 CTRL-B。?
幸運(yùn)地,CTRL-F 是向前 (forward) 滾動,CTRL-B 是向后 (backward) 滾動,這比較好記。
移動中的一個常見問題是,當(dāng)你用 "j" 向下移動的時候,你的光標(biāo)會處于屏幕的底部,?
你可能希望,光標(biāo)所在行處于屏幕的中間。這可以通過 "zz" 命令實(shí)現(xiàn)。
??????? +------------------+???????????? +------------------+?
??????? | some text??????? |???????????? | some text??????? |?
??????? | some text??????? |???????????? | some text??????? |?
??????? | some text??????? |???????????? | some text??????? |?
??????? | some text??????? |?? zz? -->?? | line with cursor |?
??????? | some text??????? |???????????? | some text??????? |?
??????? | some text??????? |???????????? | some text??????? |?
??????? | line with cursor |???????????? | some text??????? |?
??????? +------------------+???????????? +------------------+
"zt" 把光標(biāo)所在行移動到屏幕的頂部,而 "zb" 則移動到屏幕的底部。Vim 中還有另外?
一些用于滾動的命令,可以參見|Q_sc|。要使光標(biāo)上下總保留有幾行處于視口中用作上下?
文,可以使用'scrolloff'選項(xiàng)。
?
--------------------------------------------------------------------------------
*03.8*? 簡單查找
查找命令是 "/String"。例如,要查找單詞 "include",使用如下命令:
??????? /include
你會注意到,當(dāng)你輸入 "/" 的時候,光標(biāo)移到了 Vim 窗口的最后一行,這與 "冒號命令"?
一樣,在那里你可以輸入要查找的字符串。你可以使用退格鍵 (退格箭頭或<BS>) 進(jìn)行?
修改,如果需要的時候還可以使用 <Left> 和 <Right> 鍵。?
?? 使用 <Enter> 開始執(zhí)行這個命令。
??????? Note:?
??????? 字符.*[]^%//?~$有特殊含義。如果你要查找它們,需要在前面加上一個 ""。?
??????? 請參見下文。
要查找下一個匹配可以使用 "n" 命令。用下面命令查找光標(biāo)后的第一個 #include:
??????? /#include
然后輸入 "n" 數(shù)次。你會移動到后面每一個 #include。如果你知道你想要的是第幾個,?
可以在這個命令前面增加次數(shù)前綴。這樣,"3n" 表示移動到第三個匹配點(diǎn)。要注意,?
"/" 不支持次數(shù)前綴。
"?" 命令功能與 "/" 的功能類似,但是是反方向查找:
??????? ?word
"N" 命令在反方向重復(fù)前一次查找。因此,在 "/" 命令后執(zhí)行 "N" 命令是向后查找,?
在 "?" 命令后執(zhí)行 "N" 命令是向前查找。
忽 略 大 小 寫
通常,你必須區(qū)分大小寫地輸入你要查找的內(nèi)容。但如果你不在乎大小寫。可以設(shè)置?
'ignorecase' 選項(xiàng):
??????? :set ignorecase
如果你現(xiàn)在要查找 "word",它將匹配 "word" 和 "WORD"。如果想再次區(qū)分大小寫:
??????? :set noignorecase
歷 史 記 錄
假設(shè)你執(zhí)行了三個查找命令:
??????? /one?
??????? /two?
??????? /three
現(xiàn)在,讓我們輸入 "/" 啟動一次查找,但先不按下回車鍵。現(xiàn)在按 <Up>(上箭頭),Vim?
把 "/three" 放到你的命令行上。回車就會從當(dāng)前位置查找 "three"。如果你不回車,?
繼續(xù)按 <Up>,Vim 轉(zhuǎn)而顯示 "/two",而下一次 <Up> 變成 "/one"。?
??? 你還可以用 <Down> 命令在歷史記錄中反向查找。
如果你知道前面用過的一個模式以什么開頭,而且你想再使用這個模式的話,可以在輸入?
<Up> 前輸入這個開頭。繼續(xù)前面的例子,你可以輸入 "/o<Up>",Vim 就會在命令行上?
顯示 "/one"。
冒號開頭的命令也有歷史記錄。這允許你取回前一個命令并再次執(zhí)行。這兩種歷史記錄?
是相互獨(dú)立的。
在 文 本 中 查 找 一 個 單 詞
假設(shè)你在文本中看到一個單詞 "TheLongFunctionName" 而你想找到下一個相同的單詞。?
你可以輸入 "/TheLongFunctionName",但這要輸入很多東西。而且如果輸錯了,Vim?
是不可能找到你要找的單詞的。?
??? 有一個簡單的方法:把光標(biāo)移到那個單詞下面使用 "*" 命令。Vim 會取得光標(biāo)上?
的單詞并把它作為被查找的字符串。?
??? "#" 命令在反向完成相同的功能。你可以在命令前加一個次數(shù):"3*" 查找光標(biāo)下?
單詞第三次出現(xiàn)的地方。
查 找 整 個 單 詞
如果你輸入 "/the",你也可能找到 "there"。要找到以 "the" 結(jié)尾的單詞,可以用:
??????? /the>
"/>" 是一個特殊的記號,表示只匹配單詞末尾。類似地,"/<" 只匹配單詞的開頭。?
這樣,要匹配一個完整的單詞 "the",只需:
??????? /<the>
這不會匹配 "there" 或者 "soothe"。注意 "*" 和 "#" 命令也使用了 "詞首" 和 "詞尾"?
標(biāo)記來匹配整個單詞(要部分匹配,使用 "g*" 和 "g#")
高 亮 匹 配
當(dāng)你編輯一個程序的時候,你看見一個變量叫 "nr"。你想查一下它在哪被用到了。你可以?
把光標(biāo)移到 "nr" 下用 "*" 命令,然后用 n 命令一個個遍歷。?
??? 這里還有一種辦法。輸入這個命令:
??????? :set hlsearch
現(xiàn)在如果你查找 "nr",Vim會高亮顯示所有匹配的地方。這是一個很好的確定變量在哪被使?
用,而不需要輸入更多的命令的方法。?
??? 要關(guān)掉這個功能:
??????? :set nohlsearch
然后你又需要在下一次查找的時候又切換回來。如果你只是想去掉高亮顯示的東西,用如下?
命令:
??????? :nohlsearch
這不會復(fù)位 hlsearch 選項(xiàng)。它只是關(guān)閉高亮顯示。當(dāng)你執(zhí)行下一次查找的時候,高亮功能?
會被再次激活。使用 "n" 和 "N" 命令時也一樣。
調(diào) 節(jié) 查 找 方 式
有一些選項(xiàng)能改變查找命令的工作方式。其中有幾個是最基本的:
??????? :set incsearch
這個命令使 Vim 在你輸入字符串的過程中就顯示匹配點(diǎn)。用這個可以檢查正確的地方是否已經(jīng)?
被找到了。然后輸入 <Enter> 跳到那個地方。或者繼續(xù)輸入更多的字符改變要被查找的字符串。
??????? :set nowrapscan
這個選項(xiàng)在找到文件結(jié)尾后停止查找。或者當(dāng)你往回查找的時候遇到文件開頭停止查找。默認(rèn)?
情況下 'wrapscan' 的狀態(tài)是 "on"。所以在找到文件尾的時候會自動折返。
插 曲
如果你喜歡前面的選項(xiàng),而且每次用 Vim 都要設(shè)置它,那么,你可以把這些命令寫到?
Vim 的啟動文件中。?
??? 編輯 |not-compatible| 中提到的文件,或者用如下命令確定這個文件在什么地方:
??????? :scriptnames
編輯這個文件,例如,象下面這樣:
??????? :edit ~/.vimrc
然后在文中加一行命令來設(shè)置這些選項(xiàng),就好像你在 Vim 中輸入一樣,例如:
??????? Go:set hlsearch<Esc>
"G" 移動到文件的結(jié)尾,"o" 開始一個新行,然后你在那里輸入 ":set" 命令。?
最后你用 <Esc> 結(jié)束插入模式。然后用如下命令存盤:
??????? ZZ
現(xiàn)在如果你重新啟動 Vim,'hlsearch' 選項(xiàng)就已經(jīng)被設(shè)置了。
?
--------------------------------------------------------------------------------
*03.9*? 簡單的查找模式
Vim 用正則表達(dá)式來定義要查找的對象。正則表達(dá)式是一種非常強(qiáng)大和緊湊的定義查找模式?
的方法。但是非常不幸,這種強(qiáng)大的功能是有代價的,因?yàn)槭褂盟枰莆找恍┘记伞?
??? 本章我們只介紹一些基本的正則表達(dá)式。要了解更多的關(guān)于查找模式和命令,請參考?
|usr_27.txt|。你還可以在|pattern|中找到正則表達(dá)式的完整描述。
行 首 與 行 尾
^字符匹配行首。在美式英文鍵盤上,它在數(shù)字鍵 6 的上面。模式 "include" 匹配一行中?
任何位置的單詞 include。而模式 "^include" 僅匹配在一行開始的 include。?
??? $字符匹配行尾。所以,"was$" 僅匹配在行尾的單詞 was。
我們在下面的例子中用 "x" 標(biāo)記出被 "the" 模式匹配的位置:
??????? the solder holding one of the chips melted and the?
??????? xxx?????????????????????? xxx????????????????? xxx
用 "/the$" 則匹配如下位置:
??????? the solder holding one of the chips melted and the?
?????????????????????????????????????????????????????? xxx
而使用 "/^the" 則匹配:
??????? the solder holding one of the chips melted and the?
??????? xxx
你還可以試著用這個模式: "/^the$",它會匹配僅包括 "the" 的行。并且不包括空格。?
例如包括 "the " 的行是不會被這個模式匹配的。
匹 配 任 何 單 個 字 符
點(diǎn) "." 字符匹配任何字符。例如,模式 "c.m" 匹配一個第一個字符是c,第二個字符是?
任意字符,而第三個字符是m的字符串。例如:
??????? We use a computer that became the cummin winter.?
???????????????? xxx???????????? xxx????? xxx
匹 配 特 殊 字 符
如果你確實(shí)想匹配一個點(diǎn)字符,你可以在前面加一個反斜杠去消除它的特殊含義。?
??? 如果你用 "ter." 為模式去查找,你會匹配這些地方:
??????? We use a computer that became the cummin winter.?
????????????????????? xxxx????????????????????????? xxxx
但如果你查找 "ter/.",你只會匹配第二個位置。
?
--------------------------------------------------------------------------------
*03.10* 使用標(biāo)記
當(dāng)你用 "G" 命令跳到另一個地方,Vim 會記住你從什么地方跳過去的。這個位置成為一個?
標(biāo)記,要回到原來的地方,使用如下命令:
??????? ``
` 用單引號 ' 也可以。?
?? 如果再次執(zhí)行這個命令你會跳回去原來的地方,這是因?yàn)?` 記住了自己跳轉(zhuǎn)前的位置。?
通常,每次你執(zhí)行一個會將光標(biāo)移動到本行之外的命令,這種移動即被稱為一個 "跳轉(zhuǎn)"。?
這包括查找命令 "/" 和 "n"(無論跳轉(zhuǎn)到多遠(yuǎn)的地方)。但不包括 "fx" 和 "tx" 這些?
行內(nèi)查找命令或者 "w" 和 "e" 等詞移動命令。?
??? 另外 "j" 和 "k" 不會被當(dāng)做是一次 "跳轉(zhuǎn)",即使你在前面加上個數(shù)前綴也不例外。?
``命令可以在兩個位置上跳來跳去。而 CTRL-O 命令則跳到一個 "較老" 的地方(提示:O?
表示older)。CTRL-I 則跳到一個 "較新" 的地方(提示:I在鍵盤上緊靠著O)。考慮一下?
如下命令序列:
??????? 33G?
??????? /^The?
??????? CTRL-O
你首先跳到第 33 行,然后查找以 "The" 開頭的一行,然后用 CTRL-O 你會跳回到 33 行。?
再執(zhí)行 CTRL-O 你會跳到最初的地方。現(xiàn)在你使用 CTRL-I,就又跳到 33 行。而再用一次?
CTRL-I 你又會到達(dá)找到 "The" 的地方。
???????????? |? example text?? ^???????????? |?
??????? 33G? |? example text?? |? CTRL-O???? | CTRL-I?
???????????? |? example text?? |???????????? |?
???????????? V? line 33 text?? ^???????????? V?
???????????? |? example text?? |???????????? |?
?????? /^The |? example text?? |? CTRL-O???? | CTRL-I?
???????????? V? There you are? |???????????? V?
??????????????? example text
??????? Note:?
??????? CTRL-I的功能與<Tab>一樣。
":jumps" 命令能輸出一個你可以跳往的位置的列表。最后一個你使用的到的標(biāo)記會用?
">" 符號標(biāo)記出來。
有 名 字 的 標(biāo) 記
Vim 允許你在文本中放置自定義的標(biāo)記。命令 "ma" 用 a 標(biāo)記當(dāng)前的光標(biāo)位置。你可以在?
文本中使用 26 個標(biāo)記(a到z)。這些標(biāo)記是不可見的,只是一個由 Vim 記住的位置。?
??? 要跳到一個你定義的標(biāo)記,可以使用命令 `{mark},這里 {mark} 是指定義標(biāo)記?
的那個字母。所以,移到標(biāo)記a的命令是:
??????? `a
命令 'mark(單引號加上一個標(biāo)記)會移到標(biāo)記所在行的行首。這與 `mark 命令是不同的,?
后者是移到標(biāo)記所在行上被標(biāo)記的列。
標(biāo)記在需要處理一個文件的兩個相關(guān)地方的時候非常有用。假設(shè)你在處理文末的時候需要?
查看文首的一些內(nèi)容,先移動到行首,設(shè)置一個標(biāo)記 s (start):
??????? ms
然后移動到你需要處理的地方,再設(shè)置一個標(biāo)記 e (end):
??????? me
現(xiàn)在你可以隨意移動,當(dāng)你需要看開頭的地方,可以使用這個命令移到那里:
??????? 's
然后使用 '' 跳回來。或者用 'e 跳到你正在處理的文尾的地方。?
??? 這里使用 s 和 e 作標(biāo)記名沒有特別的含義,只是為了好記而已。
你可以用如下命令取得所有的標(biāo)記的列表:
??????? :marks
你會注意到有一些特殊的標(biāo)記,包括:
??????? '?????? 跳轉(zhuǎn)前的位置?
??????? "?????? 最后編輯的位置?
??????? [?????? 最后修改的位置的開頭?
??????? ]?????? 最后修改的位置的結(jié)尾?
作小改動
本章介紹幾種修正和移動文本的方法,這包括三種修改文本的基本方法:操作符-動作,?
可視模式以及文本對象。
|04.1|? 操作符與動作?
|04.2|? 改變文本?
|04.3|? 重復(fù)一個修改?
|04.4|? 可視模式?
|04.5|? 移動文本?
|04.6|? 拷貝文本?
|04.7|? 使用剪貼板?
|04.8|? 文本對象?
|04.9|? 替換模式?
|04.10| 結(jié)論
下一章: |usr_05.txt|? 選項(xiàng)設(shè)置?
前一章: |usr_03.txt|? 移動?
? 目錄: |usr_toc.txt|
?
--------------------------------------------------------------------------------
*04.1*? 操作符與動作
在第二章你已經(jīng)學(xué)過使用 "x" 命令來刪除一個字符以及通過個數(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" 命令作為動作,這時 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í)行各種操作。
?
--------------------------------------------------------------------------------
*04.2*? 修改文本
另一個操作符命令是 "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$" 刪除到行尾;"c$" 則修改到行尾。這就象先用 "d$" 刪除一行再用 "a" 啟動?
插入模式并加入新的文字。
快 捷 鍵
有些 "操作符-動作" 命令由于經(jīng)常被使用,所以被設(shè)置為單字符命令:
??????? x? 表示? dl? (刪除當(dāng)前光標(biāo)下的字符)?
??????? X? 表示? dh? (刪除光標(biāo)左邊的字符)?
??????? D? 表示? d$? (刪除到行尾)?
??????? C? 表示? c$? (修改到行尾)?
??????? s? 表示? cl? (修改一個字符)?
??????? S? 表示? cc? (修改一整行)
在 什 么 地 方 加 入 個 數(shù) 前 綴
命令 "3dw" 和 "d3w" 都是刪除3個單詞。如果你非要尋根問底,那么:"3dw" 表示?
刪除一個單詞3次,而 "d3w" 表示刪除三個單詞一次。這是一個沒有分別的分別。?
實(shí)際上你可以放兩個次數(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
通過個數(shù)前綴,"r" 命令可以使多個字符被同一個字符替換,例如:
??????? There is something wrong here?
?????????????????????????? 5rx
??????? There is something xxxxx here
要用換行符替換一個字符可以用命令 "r<Enter>"。這會刪除一個字符并插入一個換行?
符。在這里使用個數(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" (undo),CTRL-R (redo) 和冒號命令外的修改。
再舉一個例子:你想把 "four" 修改成"five"。有好幾個地方都要作這種修改。你可?
以用如下命令快速完成這個操作:
??????? /four<Enter>??? 找到第一個 "four"?
??????? cwfive<Esc>???? 修改成 "five"?
??????? n?????????????? 找下一個 "four"?
??????? .?????????????? 重復(fù)修改操作?
??????? n?????????????? 找下一個 "four"?
??????? .?????????????? 重復(fù)修改?
??????????????????????? 如此類推......
?
--------------------------------------------------------------------------------
*04.4*? 可視模式
要刪除一些簡單的東西,用 "操作符-動作" 命令可以完成得很好。但很多情況下,并?
不容易確定用什么命令可以移到你想修改的地方。這時候,你就需要可視模式了。
你可以用 "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??? | |?
??????? selected lines >> | text text text???????? | | Vjj?
?????????????????????? >> | text more????????????? | V?
????????????????????????? | more text more???????? |?
????????????????????????? +------------------------+
塊 選 擇
如果你要處理一個矩形塊內(nèi)的文本,可以使用 CTRL-V 啟動可視模式。這在處理表格時?
非常有用。
??????????????? name??????????? Q1????? Q2????? Q3?
??????????????? pierre????????? 123???? 455???? 234?
??????????????? john??????????? 0?????? 90????? 39?
??????????????? steve?????????? 392???? 63????? 334
要刪除中間 "Q2" 這一欄,把光標(biāo)移動到 "Q2" 的 "Q" 上面。按 CTRL-V 啟動塊可視模式。?
現(xiàn)在用 "3j" 向下移動三行,然后用 "w" 移到下一個單詞。你可以看到最后一欄的第一?
個字符也被包括進(jìn)來了。要去掉它,用 "h" 命令即可。現(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" 則能?
移到同一行的另一個角上。
Note: "o" 和 "O" 在可視模式下與在普通模式下的作用有很大的不同;在普通模式下,?
它們的作用是在光標(biāo)后或前加入新的一行。
?
--------------------------------------------------------------------------------
*04.5*? 移動文本
當(dāng)你用 "d","x" 或者其它命令刪除文本的時候,這些文字會被存起來。你可以用 p 命?
令重新粘貼出來(p 在 Vim 中表示 put)。?
??? 看看下面的例子。首先,你會在你要刪除的那一行上輸入 "dd" 刪除一整行,然后?
移動到你要重新插入這行的地方輸入 "p" (put),這樣這一行就會被插入到光標(biāo)下方。
??????? a line????????? a line??????? a line?
??????? line 2??? dd??? line 3??? p?? line 3?
??????? line 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" 命令接受個數(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
?
--------------------------------------------------------------------------------
*04.6*? 拷貝文本
要把文本從一個地方拷貝到另一個地方,你可以先刪除它,然后用 "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)然了,個數(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 line?
??????? line 2????????????????? line 2????????? p????? line 2?
??????? last line?????????????? last line????????????? a text line?
?????????????????????????????????????????????????????? last line
?
--------------------------------------------------------------------------------
*04.7*? 使用剪貼板
如果你使用 Vim 的 GUI 版本 (gvim),你可以在 "Edit" 菜單中找到 "Copy" 項(xiàng)。你可以?
先用可視模式選中一些文本,然后使用 Edit/Copy 菜單。現(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|。
?
--------------------------------------------------------------------------------
*04.8*? 文本對象
如果你在一個單詞的中間而又想刪掉這個單詞,在你用 "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)有 "操作符-動作" 和可視模式?
兩種方法了。現(xiàn)在我們又有了 "操作符-文本對象"。?
??? 這種方法與 "操作符-動作" 很相似,但它不是操作于從當(dāng)前位置到移動目標(biāo)間的內(nèi)容,?
而是對光標(biāo)所在位置的 "文本對象" 進(jìn)行操作。文本對象是作為一個整體來處理的。現(xiàn)在光?
標(biāo)在對象中的位置無關(guān)緊要。
用 "cis" 可以改變一個句子。看下面的句子:
??????? 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"(譯者注:實(shí)在很難用中文表示這個意思了,各位還是記英文名吧)。還有?
一個文本對象是 "as",區(qū)別是 "as" 包括句子后面的空白字符而 "is" 不包括。如果?
你要刪除一個句子,而且你還想同時刪除句子后面空白字符,就用 "das";如果你想保?
留空白字符而替換一個句子,則使用"cis"。
你還可以在可視模式下使用文本對象。這樣會選中一個文本對象,而且繼續(xù)留可視模式,?
你可以繼續(xù)多次執(zhí)行文本對象命令。例如,先用 "v" 啟動可視模式,再用 "as"?
就可以選中一個句子。現(xiàn)在重復(fù)執(zhí)行 "as",就會繼續(xù)選中更多的句子。最后你可以使用?
一個操作符去處理這些被選中的句子。
你可以在這里找到一個詳細(xì)的文本對象的列表:|text-objects|。
?
--------------------------------------------------------------------------------
*04.9*? 替換模式
"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)原來被替換的字符又回來了。這就好像?
一個 "撤消" 命令一樣。
?
--------------------------------------------------------------------------------
*04.10* 結(jié)論
操作符,移動命令和文本對象可以有各種組合。現(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",則變成拷貝命令,等等等等。
還有一些常用的命令,放在哪一章都不合適,列在這里:
??????? ~?????? 修改光標(biāo)下字符的大小寫,并移動到下一個字符。這不是一個操作符?
??????????????? (除非設(shè)置了 'tildeop'),所以你不能連接一個動作命令。這個命?
??????????????? 令在可視模式下也有效,它會改變被選中的所有文本的大小寫。
??????? I?????? 移到當(dāng)前行的第一個非空字符并啟動插入模式
??????? A?????? 移動到行尾并啟動插入模式
Vim 可以按你的需要進(jìn)行設(shè)置。本章告訴你怎樣使 Vim 用你指定的選項(xiàng)啟動,怎樣增加插件?
以增強(qiáng) Vim 的功能;以及怎樣進(jìn)行宏定義。
|05.1|? vimrc 文件?
|05.2|? vimrc 示例解釋?
|05.3|? 簡單鍵盤映射?
|05.4|? 增加插件?
|05.5|? 增加幫助?
|05.6|? 選項(xiàng)窗口?
|05.7|? 常用選項(xiàng)
????? 下一章:|usr_06.txt|? 使用語法加亮?
????? 前一章:|usr_04.txt|? 做小改動?
??????? 目錄:|usr_toc.txt|
?
--------------------------------------------------------------------------------
*05.1*? vimrc 文件
可能你已經(jīng)厭倦了輸入那些經(jīng)常用到的命令了。要讓 Vim 用你習(xí)慣的設(shè)置啟動,你可以?
把這些設(shè)置寫到一個叫 vimrc 的文件中。Vim 會在啟動的時候讀入這個文件。
如果你不知道你的 vimrc 在什么地方,可以使用如下命令:
??????? :scriptnames
命令列出的文件列表開頭的幾個中應(yīng)該有一個叫 ".vimrc" 或者 "_vimrc" 的文件在你的?
home 目錄中。?
??? 如果你還沒有 vimrc,請參考 |vimrc| 一節(jié)看看你應(yīng)該在什么地方創(chuàng)建 vimrc 文件。?
另外 ":version" 命令能告訴你 vim 在什么地方找 "用戶的 vimrc 文件"。
對于 Unix 系統(tǒng),肯定是如下文件:
??????? ~/.vimrc
對于 MS-DOS 和 MS-Windows,常常使用下面其中一個文件:
??????? $HOME/_vimrc?
??????? $VIM/_vimrc
vimrc 文件可以包含任何冒號命令。最簡單的是設(shè)置選項(xiàng)命令。例如,如果你想 Vim 啟動?
的時候始終開啟 'incsearch' 選項(xiàng),可以在你的 vimrc 文件中加上:
??????? set incsearch
要使這個命令生效,你需要重啟動 Vim。后面我們還會學(xué)到如何不退出 Vim 就能讓它生效。
這一章只解釋最基本的東西。要學(xué)習(xí)更多關(guān)于寫 Vim 腳本的知識,請參見|usr_41.txt|。
?
--------------------------------------------------------------------------------
*05.2*? vimrc 示例解釋
在第一章中,我們曾經(jīng)介紹過怎樣用 vimrc 示例文件(包括在 Vim 發(fā)布中)使 Vim 以非?
vi 兼容模式啟動(參見|not-compatible|)。這個文件可以在這里找到:
??????? $VIMRUNTIME/vimrc_example.vim
我們在這一節(jié)中介紹這個文件中用到的一些命令。這會對你自行參數(shù)設(shè)置有一定的幫助。?
但我們不會介紹所有的內(nèi)容。你需要用 ":help" 獲得更多的幫助。
??????? set nocompatible
如第一章所述,這個命令人為地告訴 Vim 工作在 vi 增強(qiáng)模式,因此與 Vi 不完全兼容。?
要關(guān)閉 'compatible' 選項(xiàng)設(shè),'nocompatible' 可以用于完成這個功能。
??????? set backspace=indent,eol,start
這指明在插入模式下 <BS> 如何刪除光標(biāo)前面的字符。逗號分隔的三個值分別指:行首的?
空白字符,分行符和插入模式開始處之前的字符。
??????? set autoindent
這使 Vim 在啟動一個新行的時候使用與前一行一樣的縮進(jìn)。就是說,新行前面會有同樣?
多的空白字符。啟動新行是指用 <Enter> 換行,在普通模式下執(zhí)行 "o" 命令等情況。
??????? if has("vms")?
????????? set nobackup?
??????? else?
????????? set backup?
??????? endif
這告訴 Vim 當(dāng)覆蓋一個文件的時候保留一個備份。但 VMS 系統(tǒng)除外,因?yàn)?VMS 系統(tǒng)會?
自動產(chǎn)生備份文件。備份文件的名稱是在原來的文件名上加上 "~" 字符。參見 |07.4|
??????? set history=50
這個命令保存 50 個命令和 50 個查找模式的歷史。如果你想 Vim 記住多些或者少些?
命令,可以把這個數(shù)改成其它值。
??????? set ruler
總在 Vim 窗口的右下角顯示當(dāng)前光標(biāo)位置。
??????? set showcmd
在 Vim 窗口右下角,標(biāo)尺的右邊顯示未完成的命令。例如,當(dāng)你輸入 "2f",Vim 在等?
你輸入要查找的字符并且顯示 "2f"。當(dāng)你再輸入w,"2fw" 命令被執(zhí)行,"2f" 自動消?
失。
??????? +-------------------------------------------------+?
??????? |text in the Vim window?????????????????????????? |?
??????? |~??????????????????????????????????????????????? |?
??????? |~??????????????????????????????????????????????? |?
??????? |-- VISUAL --?????????????????? 2f???? 43,8?? 17% |?
??????? +-------------------------------------------------+?
???????? ^^^^^^^^^^^????????????????? ^^^^^^^^ ^^^^^^^^^^?
????????? 'showmode'???????????????? 'showcmd'? 'ruler'
??????? set incsearch
在查找模式輸入完前顯示匹配點(diǎn)。
??????? map Q gq
這定義一個鍵映射。下一節(jié)會介紹更多的相關(guān)內(nèi)容。這將定義 "Q" 命令用來完成與 "gq"?
操作符相同的功能,這是在 Vim 5.0 版前 "Q" 命令的作用。如果沒有設(shè)置這個映射,?
"Q" 會啟動 Ex 模式,這也許不是你想要的情況。
??????? vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc>
這是一個復(fù)雜映射。這里不介紹它是怎么工作的。它的作用是使 "p" 命令在可視模式下?
用拷貝的字符覆蓋被選中的字符。你可以看到映射可以被用來執(zhí)行相當(dāng)復(fù)雜的操作。但其?
本質(zhì)依然是一個命令序列而已,與你直接輸入沒有什么兩樣。
??????? if &t_Co > 2 || has("gui_running")?
????????? syntax on?
????????? set hlsearch?
??????? endif
這激活語法加亮功能,但僅在顏色功能有效的時候才有效。而 'hlsearch' 選項(xiàng)告訴?
Vim 加亮上次查找模式匹配的地方。"if" 命令在設(shè)置選項(xiàng)的時候非常有用,它使設(shè)置?
命令在某些條件下才執(zhí)行。更多的內(nèi)容請參見|usr_41.txt|。
??????????????????????????????????????????????????????? *vimrc-filetype*?
??????? filetype plugin indent on
這啟動三個非常靈巧的機(jī)制:?
1. 文件類型探測?
??? 當(dāng)你開始編輯一個文件的時候,Vim 會試圖確定這個文件的類型。當(dāng)你編輯 "main.c"?
??? 時,Vim 會根據(jù)擴(kuò)展名 ".c" 認(rèn)為這是一個 C 源文件。當(dāng)你編輯一個文件前面是?
??? "#!/bin/sh" 的文件時,Vim 會把它認(rèn)作 "sh" 文件。文件類型探測用于語法加亮?
??? 和以下另兩項(xiàng)。請參見|filetypes|。
2. 使用文件類型相關(guān)的插件?
??? 不同的文件需要不同的選項(xiàng)支持。例如,當(dāng)你編輯一個 "c" 文件,用 'cindent'?
??? 選項(xiàng)來自動縮進(jìn)就非常有用。這些文件類型相關(guān)的選項(xiàng)在 Vim 中是通過文件類型?
??? 插件來實(shí)現(xiàn)的。你也可以加入自己的插件,請參見 |write-filetype-plugin|。
3. 使用縮進(jìn)文件?
??? 當(dāng)編輯程序的時候,行縮進(jìn)通常可以被自動決定。Vim 用不同的策略處理不同的?
??? 文件類型。請參見 |:filetype-indent-on| 和 'indentexpr'。
??????? autocmd FileType text setlocal textwidth=78
這使 Vim 在一行長于 78 個字符的時候自動換行,但僅對純文本文件中有效。這里包括?
兩個部分。其中 "autocmd FileType text" 定義個自動命令,表示當(dāng)文件類型被設(shè)置為?
"text" 的時候,后面的命令自動執(zhí)行。"setlocal textwidth=78" 設(shè)置 'textwidth'?
選項(xiàng)為78,但僅對本文件有效。
??????? autocmd BufReadPost *?
???????????? if line("'/"") > 0 && line("'/"") <= line("$") |?
?????????????? exe "normal g`/"" |?
???????????? endif
這是又一個自動命令。這回它設(shè)置為在讀入任何文件之后自動執(zhí)行。后面那堆復(fù)雜的東?
西檢查 '" 標(biāo)記是否已被定義,如果是,則跳轉(zhuǎn)到該標(biāo)記。行首的反斜杠用于把所有語句?
連接成一行。這可以避免一行寫得太長,請參見 |line-continuation|。這只在 Vim?
腳本文件中有效,在命令行中無效。
?
--------------------------------------------------------------------------------
*05.3*? 簡單鍵盤映射
映射可以使你把一系列 Vim 命令綁定為一個單鍵。假設(shè)你要用一個大括號將一個特定的?
單詞括起來。例如,把 "amount" 變成 "{amount}"。用 ":map" 命令,就可以讓 F5 來?
完成這個工作。命令如下:
??????? :map <F5> i{<Esc>ea}<Esc>
??????? Note:?
??????? 在輸入這個命令時,<F5> 要用四個字符表示。相似地,輸入 <Esc> 不是直接按?
??????? <Esc> 鍵,而是輸入五個字符。在讀這份手冊要注意這些區(qū)別!
讓我們來分解一下這個命令:?
??? <F5>??????? F5 功能鍵。這是命令的觸發(fā)器。當(dāng)這個鍵被按下時,相應(yīng)的命令即被?
??????????????? 執(zhí)行。
??? i{<Esc>???? 插入 { 字符。<Esc> 鍵用于退出插入模式。
??? e?????????? 移動到詞尾。
??? a}<Esc>???? 插入 } 到單詞尾。
執(zhí)行 ":map" 命令后,要在單詞兩端加上 {},只需要移到單詞上的第一個字符并按 F5。
在這個例子中,觸發(fā)器是一個單鍵;它還可以是任何字符串。但若你使用一個已經(jīng)存在?
的 Vim 命令,該命令將不在有效。所以你最好避免出現(xiàn)這種情況。?
??? 一個可用于映射的鍵是反斜杠。因?yàn)槟愫芸赡芟攵x多個映射,那就加上另一個字符。?
你可以映射 "/p" 為在單詞兩端加園括號,而映射 "/c" 為加花括號,例如:
??????? :map /p i(<Esc>ea)<Esc>?
??????? :map /c i{<Esc>ea}<Esc>
你需要在敲入/后,立即敲入p,以便 Vim 知道它們組成一個命令。
":map" 命令(無參數(shù))列出當(dāng)前已定義的映射,至少會包括普通模式下的那些。更多的內(nèi)?
容參見 |40.1|。
?
--------------------------------------------------------------------------------
*05.4*? 增加插件??????????????????????????????????????? *add-plugin*??? *plugin*
Vim 可以通過插件增強(qiáng)功能。插件其實(shí)是一個當(dāng) Vim 啟動的時候能被自動執(zhí)行的腳本。?
簡單地把插件放到你 Vim 的 plugin 目錄中就可以使它生效。?
(這個功能在 |+eval| 被編譯進(jìn) Vim 中時才有效)
Vim 中有兩種插件:?
?????? 全局插件:用于所有類型的文件?
?? 文件類型插件:僅用于特定類型的文件
我們將先討論全局插件,然后涉及文件類型插件 |add-filetype-plugin|。
全 局 插 件???????????????????????????????????????????? *standard-plugin*
當(dāng)你啟動 Vim,它會自動加載一些插件。你不需要為此做任何事。這些插件增加一些?
很多人想用的,但由 Vim 腳本實(shí)現(xiàn)而非編譯進(jìn) Vim 中的功能。你可以在幫助索引中?
找到這些插件:|standard-plugin-list|。還可以參照 |load-plugin|。
??????????????????????????????????????????????????????? *add-global-plugin*?
你可以加入一個全局插件使得某些功能在你每次使用 Vim 時都被開啟。添加一個全局?
插件只要兩步:?
1. 獲得一個插件的拷貝?
2. 把它塞進(jìn)合適的目錄
獲 得 一 個 全 局 插 件
在什么地方可以找到插件??
- 有一些與 Vim 一起發(fā)布,你可以在 $VIMRUNTIME/macros 目錄或其子目錄中找到。?
- 從網(wǎng)上下載,查一下這個地方:[url]http://vim.sf.net。[/url]?
- 在 Vim 的郵件列表中找:|maillist|。?
- 自己寫一個,參見|write-plugin|。
使 用 一 個 全 局 插 件
首先閱讀插件包括的說明文字,看看有沒有什么特殊的限制。然后拷貝到你的插件?
目錄:
??????? 系統(tǒng)??????????? 插件目錄?
??????? Unix??????????? ~/.vim/plugin/?
??????? PC and OS/2???? $HOME/vimfiles/plugin 或 $VIM/vimfiles/plugin?
??????? Amiga?????????? s:vimfiles/plugin?
??????? Macintosh?????? $VIM:vimfiles:plugin?
??????? RISC-OS???????? Choices:vimfiles.plugin
以 Unix 系統(tǒng)為例(假設(shè)你還沒有 plugin 目錄):
??????? mkdir ~/.vim?
??????? mkdir ~/.vim/plugin?
??????? cp /usr/local/share/vim/vim60/macros/justify.vim ~/.vim/plugin
就是這樣了!現(xiàn)在你可以用這個插件定義的命令調(diào)整文字了。
文件類型插件???????????????????? *add-filetype-plugin* *ftplugins*
Vim 的發(fā)布中包括一套針對不同文件類型的插件。你可以用如下命令啟用它們:
??????? :filetype plugin on
這樣就行了! 參閱 |vimrc-filetype|。
如果你缺少某種文件類型的插件,或者你找到一個更好的,你可以自行添加一個。這也?
只需兩步:?
1. 獲取一個插件的拷貝?
2. 塞到合適的目錄。
取 得 文 件 類 型 插 件
你可以在找全局插件的相同地方找到文件類型插件。注意一下插件有沒有注明文件?
類型,據(jù)此你可以知道這個插件是全局的還是文件類型相關(guān)的。在 $VIMRUNTIME/macros?
中的是全局插件;文件類型插件在 $VIMRUNTIME/ftplugin 中。
使 用 文 件 類 型 插 件???????????????????????????????? *ftplugin-name*
你可以通過把插件文件放到合適的目錄中來增加一個插件。目錄的名字與前面提過的全局?
插件的位置一樣,但最后一級目錄是 "ftplugin"。假設(shè)你找到一個用于 "stuff" 文?
件類型的插件,而且你的系統(tǒng)是Unix。那么,你可以把這個文件用如下命令移入ftplugin?
目錄:
??????? mv thefile ~/.vim/ftplugin/stuff.vim
如果這個文件已經(jīng)存在,你可以檢查一下兩個插件有沒有沖突。如果沒有,你可以用另?
一個名字:
??????? mv thefile ~/.vim/ftplugin/stuff_too.vim
這里,下劃線用來分開文件類型和其它部分(這些部分可以由任意字符組成)。但如果你?
用 "otherstuff.vim" 就不行了。那是用于 "otherstuff" 類型的文件的。
在 MS-DOS 中不能使用長文件名。如果你增加第二個插件,而這個插件超過 6 個字符,?
你就沒法用了。你可以通過使用另一層目錄來解決這個問題:
??????? mkdir $VIM/vimfiles/ftplugin/fortran?
??????? copy thefile $VIM/vimfiles/ftplugin/fortran/too.vim
總的來說,一個文件類型相關(guān)的插件的名稱是:
??????? ftplugin/<filetype>.vim?
??????? ftplugin/<filetype>_<name>.vim?
??????? ftplugin/<filetype>/<name>.vim
這里 "<name>" 可以是任何你喜歡的名字。例如,在 Unix 下,"stuff" 文件類型的插件?
可以是:
??????? ~/.vim/ftplugin/stuff.vim?
??????? ~/.vim/ftplugin/stuff_def.vim?
??????? ~/.vim/ftplugin/stuff/header.vim
這里, <filetype> 部分是相應(yīng)文件類型的名稱。只有對應(yīng)文件類型的文件才會用這個?
插件內(nèi)的設(shè)置。插件的 <name> 部分則不重要,你可以對同一個文件類型使用多個插件。?
Note 插件必須以 ".vim" 結(jié)尾。
深入?yún)⒖甲x物:?
|filetype-plugins|????? 文件類型插件的文檔和有關(guān)如何避免映射引起的問題。?
|load-plugins|????????? 全局插件的啟動時間?
|ftplugin-overrule|???? 控制全局文件類型插件的選項(xiàng)?
|write-plugin|????????? 如何寫插件?
|plugin-details|??????? 關(guān)于如何使用插件的信息或者當(dāng)你的插件不工作的時候如何?
??????????????????????? 處理。
?
--------------------------------------------------------------------------------
*05.5*? 增加幫助??????????????????????????? *add-local-help*
如果幸運(yùn)的話,你安裝的插件還會包括幫助文件。我們這里解釋如何安裝這個幫助文件,?
以便你能方便地獲得新插件的幫助。
我們以 "matchit.vim" 插件為例(包括在 Vim 中)。這個插件使 "%" 命令可以在兩個?
對應(yīng)的 HTML 標(biāo)記間,Vim 腳本的 if/else/endif 間等匹配點(diǎn)間跳轉(zhuǎn)。這非常有用,但?
它不向前兼容(這也是為什么默認(rèn)的情況下它不會被激活)。?
??? 這個插件有一個文檔:"matchit.txt"。我們先來把該插件拷貝到合適的位置。?
這次,我們在 Vim 內(nèi)完成這個工作,以便利用$VIMRUNTIME。(如果某些目錄已經(jīng)存在?
你可以省略一些 "mkdir" 命令)
??????? :!mkdir ~/.vim?
??????? :!mkdir ~/.vim/plugin?
??????? :!cp $VIMRUNTIME/macros/matchit.vim ~/.vim/plugin
現(xiàn)在在某個 'runtimepath' 目錄中建立一個 doc 目錄。
??????? :!mkdir ~/.vim/doc
再把幫助文件拷貝進(jìn)去:
??????? :!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc
現(xiàn)在開始玩技巧了,怎樣使 Vim 允許你跳轉(zhuǎn)到新的主題上?用 |:helptags| 命令產(chǎn)生?
一個本地的tags文件即可:
??????? :helptags ~/.vim/doc
現(xiàn)在,你可以用這個命令
??????? :help g%
來獲得 "g%" 的幫助了。在使用如下命令的時候,可以看見一個新的條目:
??????? :help local-additions
本地幫助的標(biāo)題行被自動的加入到該節(jié)了。在那里你可以看到 Vim 添加了那些本地的?
幫助文件。你還可以從這里跳轉(zhuǎn)到新的幫助中。
要寫一個本地幫助文件,請參考 |write-local-help|。
?
--------------------------------------------------------------------------------
*05.6*? 選項(xiàng)窗口
如果要找一個選項(xiàng),你可以查找這個位置的幫助:|options|。另一個方法是用如下命?
令:
??????? :options
這會打開一個新窗口,其中給出一個選項(xiàng)的列表,并對每個選項(xiàng)提供一行解釋。這些選項(xiàng)?
被根據(jù)種類分組。把光標(biāo)移到一個主題上然后按回車就可以跳轉(zhuǎn)到那里。再按一下回車或?
者 CTRL-O 就可以跳回來。
你可以通過這個窗口改變一個選項(xiàng)的值。例如,移到 "displaying text" 主題。然后把?
光標(biāo)下移到這一行:
??????? set wrap??????? nowrap
當(dāng)你在上面鍵入回車,這行會改變?yōu)?#xff1a;
??????? set nowrap????? wrap
現(xiàn)在,這個選項(xiàng)被關(guān)閉了。
這行的上面是對這個選項(xiàng)的簡要描述。將光標(biāo)向上移動一行,然后按 <Enter>,你可以?
跳轉(zhuǎn)到 'wrap' 的完整幫助,再用 CTRL-O 可以跳回來。
對于那些值為數(shù)字或者字符串的選項(xiàng),你可以編輯它的值,然后按 <Enter> 來啟用該?
值。例如,把光標(biāo)移動到下面這行:
??????? set so=0
用 $ 移到行尾,再用 "r5" 命令修改為五,然后按 <Enter> 使修改生效。現(xiàn)在如果你?
移動一下光標(biāo),你會發(fā)現(xiàn)在你的光標(biāo)移到窗口邊界前,你的文字就開始滾動了。這就是?
選項(xiàng) 'scrolloff' 完成的功能:它指定在距離邊界多遠(yuǎn)的地方開始滾動文字。
?
--------------------------------------------------------------------------------
*05.7*? 常用選項(xiàng)
Vim 中有很多選項(xiàng)。大部分你很少用得上。我們在這個介紹一些常用的。別忘了你可以?
通過 ":help" 命令獲得更多的幫助。方法是在選項(xiàng)命令前后加上單引號,例如:
??????? :help 'wrap'
如果你搞亂了一個選項(xiàng),你可以通過在選項(xiàng)后加上一個 & 號把它恢復(fù)到默認(rèn)值。例如:
??????? :set iskeyword&
禁 止 折 行
Vim 通常會對長行自動換行,以便你可以看見所有的文字。但有時最好還是能讓文字在一?
行中顯示完。這樣,你需要左右移動才能看到一整行。以下命令可以切換換行方式:
??????? :set nowrap
當(dāng)你移到到那些不能顯示的文字上,Vim 會自動向右滾動讓你看到后面的文字,要一次滾?
動十個字符,這樣就行了:
??????? :set sidescroll=10
這個命令不改變文件中的文字,只改變顯示方式。
移 動 命 令 換 行
很多命令只能在一行中移動。你可以通過 'whichwrap' 選項(xiàng)改變它。如下命令把這個選項(xiàng)?
設(shè)為默認(rèn)值:
??????? :set whichwrap=b,s
這樣,當(dāng)光標(biāo)處于行首時用 <BS> 鍵可以回到前一行的結(jié)尾;當(dāng)處于行尾時用 <Space>?
鍵可以移動到下一行的行首。
要允許 <Left> 和 <Right> 鍵也能這樣,可以用這個命令:
??????? set whichwrap=b,s,<,>
這只在普通模式中有效,要在插入模式中也有效,可以:
??????? :set whichwrap=b,s,<,>,[,]
還有一些可以用的標(biāo)志,參見 'whichwrap'。
顯 示 TAB 鍵
文件中有 TAB 鍵的時候,你是看不見的。要把它顯示出來:
??????? :set list
現(xiàn)在 TAB 鍵顯示為 ^I,而 $顯示在每行的結(jié)尾,以便你能找到可能會被你忽略的空白?
字符在哪里。?
??? 這樣做的一個缺點(diǎn)是在有很多 TAB 的時候看起來很丑。如果你使用一個有顏色的?
終端,或者使用 GUI 模式,Vim 可以用高亮顯示空格和TAB。 使用 'listchars' 選項(xiàng):
??????? :set listchars=tab:>-,trail:-
現(xiàn)在,TAB會被顯示成 ">---" 而行尾多余的空白字符顯示成 "-"。看起來好多了,是?
吧?
關(guān) 鍵 字
'iskeyword' 選項(xiàng)指定那些字母可以出現(xiàn)在一個單詞中:
??????? :set iskeyword?
<????????iskeyword=@,48-57,_,192-255
"@" 表示所有字母。"48-57" 表示 ASCII 字符 48-57 ,即數(shù)字 0 到 9。"192-255"?
是可打印的拉丁字符。?
??? 有時你希望橫線也是關(guān)鍵字,以便 "w" 命令會把 "upper-case" 看作是一個單詞。?
你可以這樣做:
??????? :set iskeyword+=-?
??????? :set iskeyword?
????????iskeyword=@,48-57,_,192-255,-
看一下新的值,你會發(fā)現(xiàn) Vim 自動在 "-" 前面加了一個逗號。?
??? 要從中去掉一個字符用 "-="。例如要排除下劃線:
??????? :set iskeyword-=_?
??????? :set iskeyword?
????????iskeyword=@,48-57,192-255,-
這回,逗號自動被刪除了。
顯 示 消 息 的 空 間
當(dāng) Vim 啟動的時候,在屏幕底部有一行被用于顯示消息。當(dāng)消息很長的時候,多余的部分?
會被截斷。這樣你只能看到一部分。或者文字自動滾動,你要按 <Enter> 來繼續(xù)。你可以?
給 'cmdheight' 選項(xiàng)賦一個值,用來設(shè)定顯示消息所用的行數(shù)。例如:
??????? :set cmdheight=3
這樣意味著你用于編輯文字的空間少了,所以這實(shí)際上是一種折衷。
使用語法加亮
黑白的文字讓人厭倦了,增加一些色彩能為你的文件帶來生氣。這不但看起來漂亮,?
還能夠提高你的工作效率。本章介紹如何使用不同顏色顯示不同文本并把它打印出來。
|06.1|? 功能激活?
|06.2|? 顏色顯示不出來或者顯示出錯誤的顏色怎么辦??
|06.3|? 使用不同的顏色?
|06.4|? 是否使用色彩?
|06.5|? 帶顏色打印?
|06.6|? 深入閱讀
???? 下一章:|usr_07.txt|? 編輯多個文件?
???? 前一章:|usr_05.txt|? 選項(xiàng)設(shè)置?
?????? 目錄:|usr_toc.txt|
?
--------------------------------------------------------------------------------
*06.1*? 功能激活
一切從一個簡單的命令開始:
??????? :syntax enable
大多數(shù)情況下,這會讓你的文件帶上顏色。Vim 會自動檢測文件的類型,并調(diào)用合適的?
語法加亮。一下子注釋變成藍(lán)色,關(guān)鍵字變成褐色,而字符串變成紅色了。這使你可以?
很容易瀏覽整個文檔。很快你就會發(fā)現(xiàn),黑白的文本真的會降低你的效率!
如果你希望總能看到語法加亮,把 "syntax enable" 命令加入到 |vimrc| 文件中。
如果你想語法加亮只在支持色彩的終端中生效,你可以在 |vimrc| 文件中這樣寫:
??????? if &t_Co > 1?
????????? syntax enable?
??????? endif
如果你只想在 GUI 版本中有效,可以把 ":syntax enable" 放到你的 |gvimrc| 文件中。
?
--------------------------------------------------------------------------------
*06.2*? 顏色顯示不出來或者顯示出錯誤的顏色怎么辦?
有很多因素會讓你看不到顏色:
- 你的終端不支持彩色。?
??????? 這種情況下,Vim 會用粗體,斜體和下劃線區(qū)分不同文字,但這不好看。你可能?
??????? 會希望找一個支持彩色的終端。對于 Unix,我推薦 XFree86 項(xiàng)目的 xterm:?
??????? |xfree-xterm|。
- 你的終端其實(shí)支持顏色,可是 Vim 不知道?
??????? 確保你的 $TERM 設(shè)置正確。例如,當(dāng)你使用一個支持彩色的 xterm 終端:
??????????????? setenv TERM xterm-color
??????? 或者(基于你用的控制臺終端)
??????????????? TERM=xterm-color; export TREM
??????? 終端名必須與你使用的終端一致。如果這還是不行,參考一下 |xterm-color|,?
??????? 那里介紹了一些使 Vim 顯示彩色的方法(不僅是 xterm )。
- 文件類型無法識別?
??????? Vim 不可能識別所有文件,而且有時很難說一個文件是什么類型的。試一下這個?
??????? 命令:
??????????????? :set filetype?
.?
??????? 如果結(jié)果是 "filetype=",那么問題就是出在文件類型上了。你可以手工指定?
??????? 文件類型:
??????????????? :set filetype=fortran
??????? 要知道那些類型是有效的,查看一下 $VIMRUNTIME/syntax 目錄。對于 GUI 版本,?
??????? 你還可以使用 Syntax 菜單。設(shè)置文件類型也可以通過 |modeline|,這樣,?
??????? 在你每次編輯它的時候都執(zhí)行語法加亮。例如,下面這一行可以用?
??????? 于 Makefile(把它放在接近文首和文末的地方)
??????????????? # vim: syntax=make
??????? 你可能知道怎么檢測自己的文件類型,通常是文件的擴(kuò)展名(就是點(diǎn)后面的?
??????? 內(nèi)容)參見 |new-filetype| 可以知道如何告訴 Vim 如何檢查一種文件類型。
- 你的文件類型沒有語法高亮定義?
??????? 你可以找一個相似的文件類型并人工設(shè)置為那種類型。如果你覺得不好,你可以?
??????? 自己寫一個,參見 |mysyntaxfile|。
或者顏色是錯的:
- 彩色的文字難以辨認(rèn)?
??????? Vim 自動猜測你使用的背景色。如果是黑的(或者其它深色的色彩),它會?
??????? 用淺色作為前景色。如果是白的(或者其它淺色),它會使用深色作為前景?
??????? 色。如果 Vim 猜錯了,文字就很難認(rèn)了。要解決這個問題,設(shè)置一下?
??????? 'background' 選項(xiàng)。對于深色:
??????????????? :set background=dark
??????? 而對于淺色:
??????????????? :set background=light
?????? 這兩個命令必須在 ":syntax enable" 命令前調(diào)用,否則不起作用。如果要在?
?????? 這之后設(shè)置背景,可以再調(diào)用一下 ":syntax reset"。
- 在自下往上滾屏的過程中顏色顯示不對。?
??????? Vim 在分析文本的時候不對整個文件進(jìn)行處理,它只分析你要顯示的部分。這?
??????? 樣能省不少時間,但也會因此帶來錯誤。一個簡單的修正方法是敲 CTRL-L。?
??????? 或者往回滾動一下再回來。要徹底解決這個問題,請參見 |:syn-sync|。有些?
??????? 語法定義文件有辦法自己找到前面的內(nèi)容,這可以參見相應(yīng)的語法定義文件。?
??????? 例如,|tex.vim| 中可以查到 Tex 語法定義。
?
--------------------------------------------------------------------------------
*06.3*? 使用不同顏色?????????????????????????? *:syn-default-override*
如果你不喜歡默認(rèn)的顏色方案,你可以選另一個配色方案。在 GUI 版本中可以使用?
Edit/Color 菜單。你也可以使用這個命令:
??????? :colorscheme evening
"evening" 是配色方案的名稱。還有幾種備選方案可以試一下。在 $VIMRUNTIME/colors?
中可以找到這些方案。
等你確定了一種喜歡配色方案,可以把 ":colorscheme" 命令加到你的 |vimrc| 文件中。
你可以自己編寫配色方案,下方如下法面:
1. 選擇一種接近你的理想的配色方案。把這個文件拷貝到你自己的 Vim 目錄中。在 Unix?
下,可以這樣:
??????? !mkdir ~/.vim/colors?
?????? !cp $VIMRUNTIME/colors/morning.vim ~/.vim/colors/mine.vim
?? 在 Vim 中完成的好處是可以利用 $VIMRUNTIME 變量。
2. 編輯這個配色方案,常用的有下面的這些條目:
??????? term??????????? 黑白終端的屬性?
??????? cterm?????????? 彩色終端的屬性?
??????? ctermfg???????? 彩色終端的前景色?
??????? ctermbg???????? 彩色終端的背景色?
??????? gui???????????? GUI 版本屬性?
??????? guifg?????????? GUI 版本的前景色?
??????? guibg?????????? GUI 版本的背景色
?? 例如,要用綠色顯示注釋:
??????? :highlight Comment ctermfg=green guifg=green
?? 屬性是 "bold"(粗體)和 "underline" (下劃線)可以用于 "cterm" 和 "gui"。?
?? 如果你兩個都想用,可以用"bond,underline"。要獲得詳細(xì)信息, 請參考?
?? |:highlight| 命令。
3. 告訴 Vim 總使用你這個配色方案。把如下語句加入你的 |vimrc| 中:
??????? colorscheme mine
如果你要測試一下常用的配色組合,用如下命令:
??????? :edit $VIMRUNTIME/syntax/colortest.vim?
??????? :source %
這樣你會看到不同的顏色組合。你可以很容易的看到哪一種可讀性好而且漂亮。
?
--------------------------------------------------------------------------------
*06.4*? 是否使用色彩
使用色彩顯示文本會影響效率。如果你覺得顯示得很慢,可以臨時關(guān)掉這個功能:
??????? :syntax clear
當(dāng)你開始編輯另一個文件(或者同一個文件),色彩會重新生效。
??????????????????????????????????????????????????????? *:syn-off*?
如果你要完全關(guān)閉這個功能:
??????? :syntax off
這個命令會停止對所有緩沖的所有語法加亮。
??????????????????????????????????????????????????????? *:syn-manual*?
如果你想只對特定的文件采使用語法加亮,可以使用這個命令:
??????? :syntax manual
這個命令激活語法加亮功能,但不會在你開始編輯一個緩沖時自動生效(譯者注:Vim?
中,每個被打開的文件對應(yīng)一個緩沖,后面的章節(jié)中你會接觸到這方面的內(nèi)容)。要在當(dāng)?
前緩沖中使用加亮,需要設(shè)置'syntax'選項(xiàng):
??????? :set syntax=ON
?
--------------------------------------------------------------------------------
*06.5*? 帶顏色打印?????????????????????????????????????? *syntax-printing*
在 MS-Windows 版本中,你可以用如下命令打印當(dāng)前文件:
??????? :hardcopy
這個命令會啟動一個常見的打印對話框,你可以通過它選擇打印機(jī)并作一些必要的設(shè)置。?
如果你使用的是彩色打印機(jī),那么打印出來的色彩將與你在 Vim 中看到的一樣。但如果?
你使用的是深色的背景,它的顏色會被適當(dāng)調(diào)整,以便在白色地打印紙上看起來比較舒?
服。
下面幾個選項(xiàng)可以改變 Vim 的打印行為:?
??????? 'printdevice'?
??????? 'printheader'?
??????? 'printfont'?
??????? 'printoptions'
要僅打印一定范圍內(nèi)的行,可以用可視模式選擇需要打印的行在執(zhí)行打印命令,例如:
??????? v100j:hardcopy
"v" 啟動可視模式,"100j" 向下選中100行,然后執(zhí)行 ":hardcopy" 打印這些行。當(dāng)?
然,你可以用其它命令選中這100行。
如果你有一臺 PostScript 打印機(jī),上面的方法也適合 Unix 系統(tǒng)。否則,你必須做一些額?
外的處理:你需要先把文件轉(zhuǎn)換成 HTML 類型,然后用 Netscape 之類的瀏覽器打印。
如下命令把當(dāng)前文件轉(zhuǎn)換成 HTML 格式:
??????? :source $VIMRUNTIME/syntax/2html.vim
你發(fā)現(xiàn)它會嘎吱嘎吱執(zhí)行一陣子,(如果文件很大,這可能要花點(diǎn)時間)。之后,?
Vim 會打開一個新的窗口并顯示 HTML 代碼。現(xiàn)在把這個文件存下來(存在哪都不要緊,?
反正最后你要刪掉它的):
??????? :write main.c.html
用你喜歡的瀏覽器打開這個文件,并通過它打印這個文件。如果一切順利,這個輸出應(yīng)?
該與 Vim 中顯示的一樣。要了解更詳細(xì)的信息,請參見 |2html.vim|。處理完后別忘?
了刪掉那個 HTML 文件。
除了打印,你還可以把這個 HTML 文件,放到 WEB 服務(wù)器上,讓其他人可以通過彩色?
文本閱讀。
總結(jié)
- 上一篇: 一个简单的linux线程池
- 下一篇: nginx proxy_pass末尾神奇