日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

vim 命令(全)

發(fā)布時間:2024/1/17 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 vim 命令(全) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

本章提供足夠的信息使你用夠使用 Vim 來做基本的編輯。這里提供的方法不一定是高效?
快捷的。但起碼是有效的。花些時間去練習這些命令,這是后面的知識的基礎。

|02.1|? 第一次運行 Vim?
|02.2|? 插入文本?
|02.3|? 移動光標?
|02.4|? 刪除字符?
|02.5|? 撤銷與重做?
|02.6|? 其它編輯命令?
|02.7|? 退出?
|02.8|? 尋求幫助

??? 下一章:|usr_03.txt| 移動?
??? 前一章:|usr_01.txt| 關于本手冊?
????? 目錄:|usr_toc.txt|

?

--------------------------------------------------------------------------------

*02.1*? 第一次運行 Vim

啟動 Vim 的命令如下:

??????? gvim file.txt

在 UNIX 操作系統(tǒng)中,你可以在任意命令提示符下輸入這個命令。如果你用的是 Microsoft?
Windows, 啟動一個 MS-DOS 窗口,再輸入這個命令。?
??? 無論哪一種方式,現(xiàn)在 Vim 開始編輯一個名為 file.txt 的文件了。由于這是一個新建?
文件,你會得到一個空的窗口。屏幕看起來會象下面這樣:

??????? +---------------------------------------+?
??????? |#????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |"file.txt" [New file]????????????????? |?
??????? +---------------------------------------+?
??????????????? ('#"是當前光標的位置)

以波紋線(~)開頭的行表示該行在文件中不存在。換句話說,如果 Vim 打開的文件不能充滿?
這個顯示的屏幕,它就會顯示以波紋線開頭的行。在屏幕的底部,有一個消息行指示文件?
名為 file.txt 并且說明這是一個新建的文件。這行信息是臨時的,新的信息可以覆蓋它。


VIM 命 令

gvim 命令建立一個新窗口用于編輯。如果你用的是這個命令:

??????? vim file.txt

則編輯在命令窗口內(nèi)進行。換句話說,如果你在 xterm 中運行,編輯器使用 xterm 窗口。?
如果你用的是 Microsoft Window 的 MS-DOS 窗口,編輯器使用這個 MS-DOS 窗口。兩個?
版本顯示出來的文本看起來是一樣的。但如果你用的是 gvim,就會有其他特性,如菜單條。?
后面會有更多的描述。

?

--------------------------------------------------------------------------------

*02.2*? 插入文本

Vim 是一個多模式的編輯器。就是說,在不同模式下,編輯器的響應是不同的。在普通模式?
下,你敲入的字符只是命令;而在插入模式,你敲入的字符就成為插入的文本了。?
??? 當你剛剛進入 Vim,它處在普通模式。通過敲入"i"命令(i是 Insert 的縮寫)可以啟動?
插入模式,這樣你就可以輸入文字了,這些文字將被插入到文件中。不用擔心輸錯了, 你還?
能夠隨后修正它。要輸入下文的程序員打油詩,你可以這樣敲:

??????? 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)當你敲入冒號后,Vim 把光標移到窗口的最后一行。那里是你輸入“冒號命令”?
(以冒號開頭的命令)的地方,敲入回車結束這個命令的輸入(所有的冒號命令都用?
這種方式結束)。?
??? 現(xiàn)在,如果你輸入 "i" 命令,Vim 會在窗口的底部顯示 --INSERT--(中文模式?
顯示的是--插入-- —— 譯者注),這表示你在插入模式。

??????? +---------------------------------------+?
??????? |A very intelligent turtle????????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |-- INSERT --?????????????????????????? |?
??????? +---------------------------------------+

如果你輸入<Esc>回到普通模式,最后一行又變成空白。


解 決 問 題

Vim 新手常常遇到的一個問題是不知道自己在什么模式下,可能是因為忘了,也可能?
是因為不小心敲了一個切換模式的命令。無論你在什么模式,要回到普通模式,只?
要敲 <Esc> 就可以了。有時你需要敲兩次,如果 Vim 發(fā)出“嘀”一聲,就表示你已經(jīng)?
在普通模式了。

?

--------------------------------------------------------------------------------

*02.3*? 移動光標

回到普通模式后,你可以使用如下命令移動光標:

??????? h?????? 左????????????????????????????????????????????? *hjkl*?
??????? j?????? 下?
??????? k?????? 上?
??????? l?????? 右

這些命令看起來是隨便選的。無論如何,誰聽說過用 l 表示右的?但實際上,作這些選擇?
是有理由的:移動光標是最常用的編輯器命令。而這些鍵位是在你本位的右手。也就是說:?
這種鍵位的設定使你可以以最快的速度執(zhí)行移動操作(特別是當你用十指輸入的時候)。

??????? Note:?
??????? 你還可以用方向鍵移動光標,但這樣會減慢你輸入的速度,因為你必須把你的手從?
??????? 字母鍵移動到方向鍵。想象一下,你在一個小時內(nèi)可要這樣做幾百次,這可要花?
??????? 相當多的時間的。?
??????????? 而且,有一些鍵盤是沒有方向鍵的,或者放在一些很特別的地方。所以,?
??????? 知道 hjkl 的用法在這些情況下就很有幫助了。

記住這些命令的一個方法是:h 在左邊,l 在右邊,j 指著下面。用圖表示如下:

?????????????????????? k?
?????????????????? h???? l?
???????????????????? j

學習這些命令的最好方法是使用它。用 "i" 命令輸入更多的文字。然后用 hjkl 鍵移動?
光標并在某些地方輸入一些單詞。別忘了用 <Esc> 切換回普通模式。|vimtutor|也是一個?
練習的好辦法。

?

--------------------------------------------------------------------------------

*02.4*? 刪除字符

要刪除一個字符,把光標移到它上面然后輸入 "x"。(這是對以前的打字機的一種回歸,?
那時你通過在字符上輸入xxxx刪除它) 例如,把光標移到行首,然后輸入xxxxxxx(七個x)?
可以刪除 "A very"。結果看起來這樣:

??????? +---------------------------------------+?
??????? |intelligent turtle???????????????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+

現(xiàn)在你可以輸入新的字符了,例如,通過輸入:

??????? iA young <Esc>

這個命令啟動一次插入操作(那個"i"),并插入 "A young",然后退出?
插入模式(最后一個<Esc>)。結果是:

??????? +---------------------------------------+?
??????? |A young intelligent turtle???????????? |?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+


刪 除 一 行

要刪除一整行,使用 "dd" 命令,后一行會移上來填掉留下的空行:

??????? +---------------------------------------+?
??????? |Found programming UNIX a hurdle??????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |~????????????????????????????????????? |?
??????? |?????????????????????????????????????? |?
??????? +---------------------------------------+

刪 除 一 個 分 行 符

在 Vim 中你可以把兩行連起來,這意味著兩行間的換行符被刪除了。"J" 命令?
用于完成這個功能。?
??? 以下面兩行為例子:

??????? A young intelligent?
??????? turtle

把光標移到第一行,然后按 "J":

??????? A young intelligent turtle

?

--------------------------------------------------------------------------------

*02.5*? 撤銷與重做

假設現(xiàn)在你刪得太多了。當然,你可以重新輸入需要的內(nèi)容。不過,你還有一個更簡單的?
選擇。"u" 命令撤銷上一個編輯操作。看看下面這個操作:先用 "dd" 刪除一行,再敲?
"u",該行又回來了。?
??? 再給一個例子:把光標移到第一行的 A 上:

??????? A young intelligent turtle

現(xiàn)在輸入 xxxxxxx 刪除 "A young"。結果如下:

??????? intelligent turtle

輸入"u" 撤銷最后一個刪除操作。那個刪除操作刪除字符 g,所以撤銷命令恢復這個字符:

??????? g intelligent turtle

下一個 u 命令恢復倒數(shù)第二個被刪除的字符:

??????? ng intelligent turtle

下一個 u 命令恢復 u,如此類推:

??????? ung intelligent turtle?
??????? oung intelligent turtle?
??????? young intelligent turtle?
??????? young intelligent turtle?
??????? A young intelligent turtle

??????? Note:?
??????? 如果你輸入 "u" 兩次,你的文本恢復原樣,那應該是你的 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" 恢復行?
??????? A very intelligent turtle?
??????????????????????????????? 用 "u" 撤銷 "U"?
??????? A intelligent

"U" 命令本身就是一個改變操作,"u" 命令撤銷該操作,CTRL-R 命令重做該操作。?
有點亂吧, 但不用擔心,用 "u" 和 CTRL-R 命令你可以切換到任何你編輯過的狀態(tài)。

?

--------------------------------------------------------------------------------

*02.6*? 其它編輯命令

Vim 有大量的命令可以修改文本。參見|Q_in|和下文。這里是一些經(jīng)常用到的:

添 加

"i" 命令在光標所在字符前面插入字符。一般情況下,這就夠用了,但如果你剛好想在?
行尾加東西怎么辦?要解決這個問題,你需要在文本后插入字符。這通過 "a" (append)?
命令實現(xiàn)。?
??? 例如,要把如下行

??????? and that's not saying much for the turtle.?
改為?
??????? and that's not saying much for the turtle!!!

把光標移到行尾的句號上。然后輸入 "x" 刪除它。現(xiàn)在光標處于一行的尾部了,現(xiàn)在輸入

??????? a!!!<Esc>

添加三個感嘆號到 turtle 的 "e" 后面:

??????? and that's not saying much for the turtle!!!


開 始 一 個 新 行

"o" 命令在光標下方建立一個新的空行,并把 Vim 切換到插入模式。然后你可以在這個?
新行內(nèi)輸入文本了。?
??? 假定你的光標在下面兩行中第一行的某個地方:

??????? A very intelligent turtle?
??????? Found programming UNIX a hurdle

如果你現(xiàn)在用 "o" 命令并輸入新的文字:


??????? oThat liked using Vim<Esc>

結果會是:

??????? A very intelligent turtle?
??????? That liked using Vim?
??????? Found programming UNIX a hurdle

"O" 命令(大寫)在光標上方打開一個新行。


指 定 次 數(shù)

假定你想向上移動 9 行,你可以輸入 "kkkkkkkkk" 或者你可以輸入"9k"。實際上,?
你可以在很多命令前面加一個數(shù)字。例如在這章的前面,你通過輸入 "a!!!<Esc>"?
增加三個感嘆號。另一個方法是使用命令 "3a!<Esc>"。次數(shù) 3 要求把后面的命令?
執(zhí)行三次。同樣的,要刪除三個字符,可以使用 "3x"。次數(shù)總是放在要被處理多次?
的命令的前面。

?

--------------------------------------------------------------------------------

*02.7*? 退出

使用 "ZZ" 命令可以退出。這個命令保存文件并退出。?
??????? Note:?
??????? 與其他編輯器不一樣,Vim 不會自動建立一個備份文件。如果你輸入 "ZZ",?
??????? 你的修改立即生效并且不能恢復。你可以配置 Vim 讓它產(chǎn)生一個備份文件,?
??????? 參見|07.4|。


放 棄 修 改

有時你會做了一系列的修改才突然發(fā)現(xiàn)還不如編輯之前。不用擔心,Vim 有“放棄修改?
并退出”的命令,那就是:

??????? :q!

別忘了按回車使你的命令生效。

這個命令執(zhí)行的細節(jié)是:命令有三部分,包括冒號(:),它使 Vim 進入命令模式,?
q 命令,它告訴 Vim 退出,而感嘆號是強制命令修飾符。?
??? 這里,強制命令修飾符是必要的,它強制性地要求 Vim 放棄修改并退出。如果你只是?
輸入":q",Vim 會顯示一個錯誤信息并拒絕退出:

??????? E37: No write since last change (use ! to override)

通過指定強制執(zhí)行,你實際上在告訴 Vim:“我知道我所做的看起來很傻,但我長大了,?
知道自己在做什么。”

如果你放棄修改后還想重新編輯,用 ":e!" 命令可以重新裝載原來的文件。

?

--------------------------------------------------------------------------------

*02.8*? 尋求幫助

所有你想知道的東西,都可以在 Vim 幫助文件中找到答案,隨便問!?
??? 要獲得一般的幫助用這個命令:

??????? :help

你還可以用第一個功能鍵 <F1>。如果你的鍵盤上有一個 <Help> 鍵,可能也有效。?
??? 如果你不指定主題,":help" 將命令顯示一個總攬的幫助窗口。Vim 的作者在幫助系?
統(tǒng)方面使用了一個很聰明的方案(也許可以說是很懶惰的方案):他們用一個普通的編輯窗?
口來顯示幫助。你可以在幫助窗口中使用任何普通的 Vim 命令移動光標。所以,h,j,k?
和 l 還是表示左,下,上和右。?
??? 要退出幫助窗口,用退出一個普通窗口的命令:"ZZ"。這只會退出幫助窗口,而不會?
退出 Vim。

當你閱讀幫助的時候,你會發(fā)現(xiàn)有一些文字被一對豎線括起來了(例如|help|)。這表示?
一個超級鏈接。如果你把光標移到這兩個豎線之間并按 CTRL-](標簽跳轉命令), 幫助?
系統(tǒng)會把你引向這個超級鏈接指向的主題。(由于不是本章的重點,這里不詳細討論,?
Vim 對超級鏈接的術語是 "標簽"(tag),所以 CTRL-] 實際是跳轉到光標所在單詞為名?
的標簽所在的位置。)?
??? 跳轉幾次以后,你可能想回到原來的地方。CTRL-T(標簽退棧)把你送回前一個?
跳轉點。CTRL-O (跳轉到前一個位置)也能完成相同的功能。?
??? 在幫助屏幕的頂上,有一個符號: *help.txt*。這個名字被幫助系統(tǒng)用來定義一個標簽?
(也就是超級鏈接的目標)。?
??? 參見|29.1|可以了解更多關于標簽的內(nèi)容。

要獲得特定主題的幫助,使用如下命令:

??????? :help {主題}

例如,要獲得 "x" 命令的幫助,輸入如下命令:

??????? :help x

要知道如何刪除文本,使用如下命令:

??????? :help deleting

要獲得所有命令的幫助索引,使用如下命令:

??????? help index

如果你需要獲得一個包含控制字符的命令的幫助(例如 CTRL-A),你可以在它前面?
加上前綴"CTRL-"。

??????? help CTRL-A

Vim 有很多模式。在默認情況下,幫助系統(tǒng)顯示普通模式的命令。例如,如下命令顯示?
普通模式的 CTRL-H 命令的幫助:

??????? :help CTRL-H

要表示其他模式,可以使用模式前綴。如果你需要插入模式的命令幫助,使用 "i_" 前?
綴。例如對于 CTRL-H,你可以用如下命令:

??????? :help i_CTRL-H

當你啟動 Vim,你可以使用一些命令行參數(shù)。這些參數(shù)以短橫線開頭(-)。例如知道要-t?
這個參數(shù)是干什么用的,可以使用這個命令:

??????? :help -t

Vim 有大量的選項讓你定制這個編輯器。如果你要獲得選項的幫助,你需要把它括在一個?
單引號中。例如,要知道 'number' 這個選項干什么的,使用如下命令:

??????? :help 'number'

如果你看到一個你不能理解的錯誤信息,例如:

??????? E37: No write since last change (use ! to override)

你可以使用使用E開頭的錯誤號找關于它的幫助:

??????? :help E37?
移 動


在你插入或者刪除之前,你需要移動到合適的位置。Vim 有一大堆命令可以移動光標。?
本章向你介紹最重要的那些。你可以在 |Q_lr| 下面找到這些命令的列表。

|03.1|? 詞移動?
|03.2|? 移動到行首或行尾?
|03.3|? 移動到指定的字符?
|03.4|? 括號匹配?
|03.5|? 移動到指定的行?
|03.6|? 確定當前位置?
|03.7|? 滾屏?
|03.8|? 簡單查找?
|03.9|? 簡單的查找模式?
|03.10| 使用標記

??? 下一章:|usr_04.txt|? 做小改動?
??? 前一章:|usr_02.txt|? Vim 初步?
????? 目錄:|usr_toc.txt|

?

--------------------------------------------------------------------------------

*03.1*? 詞移動

要移動光標向前跳一個詞,可以使用 "w" 命令。象大多數(shù) Vim 命令一樣,你可以在命令前?
加數(shù)字前綴表示把這個命令重復多次。例如,"3w" 表示向前移動3個單詞。用圖表示如下:

??????? This is a line with example text?
????????? --->-->->----------------->?
?????????? w? w? w??? 3w

要注意的是,如果光標已經(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" 則在反方向完成這個功能。

一個詞以非單詞字符結尾,例如 ".","-" 或者 ")"。要改變 Vim 使用的 "分詞符",?
請參見 'iskeyword' 選項。?
??? 還可以以 "空白字符" 分割的 "大單詞" 移動。這不是我們通常意義的 "單詞”。這?
就是為什么稱之為 "大單詞" 的原因。如下圖所示:

?????????????? ge????? b????????? w???????????????????????????? e?
?????????????? <-???? <-???????? --->????????????????????????? --->?
??????? This is-a line, with special/separated/words (and some more).?
?????????? <----- <-----???????? -------------------->???????? ----->?
???????????? gE????? B?????????????????? W?????????????????????? E?
?????????????? ge????? b????????? w???????????????????????????? e

組合運用這些大寫和小寫的命令,你可以很快地在一段中前后移動。

?

--------------------------------------------------------------------------------

*03.2*? 移動到行首或行尾

"$" 命令把光標移動到當前行行尾。如果你的鍵盤上有 <End> 鍵,也可以完成相同的功能。

"^" 命令把光標移動到當前行的第一個非空字符,而 "0" 命令則移到一行的第一個字符,?
<Home> 鍵也可以完成相同的功能。圖示如下:

????????????????? ^?
???????????? <------------?
??????? .....This is a line with example text?
??????? <-----------------?? --------------->?
??????????????? 0????????????????? $

(這里 "....." 表示空白字符)

??? 象大多數(shù)移動命令一樣,"$" 命令接受個次數(shù)前綴。但是 "移動到一行的行尾n次" 沒?
有什么意義,所以它會使光標移動到另一行。例如,"1$" 移動到當前行的行尾,而?
"2$" 則移動到下一行的行尾,如此類推。?
??? "0" 命令不能加個數(shù)前綴,因為 "0" 本身就是個數(shù)字。而且,出人意料地是,"^" 命?
令也不支持數(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" 相似,但它只把光標移動到目標字符的前一個字符上。提示:"t"?
表示 "To"。這個命令的反向版本是 "Tx"。

??????? To err is human.? To really foul up you need a computer.?
?????????????????? <------------? ------------->?
??????????????????????? Th????????????? tn

這四個命令可以通過 ";" 命令重復,"," 命令則用于反向重復。無論用哪個命令,光標?
永遠都不會移出當前行,哪怕是這兩行是連續(xù)的一個句子。

有時你啟動了一個查找命令后才發(fā)現(xiàn)自己執(zhí)行了一個錯誤的命令。例如,你啟動了一個?
"f" 命令后才發(fā)現(xiàn)你本來想用的是 "F"。要放棄這個查找,輸入 <Esc>。所以?
"f<Esc>" 取消一個向前查找命令而不做任何操作。 Note: <Esc> 可以中止大部分命令,?
而不僅僅是查找。

?

--------------------------------------------------------------------------------

*03.4*? 括號匹配

當你寫程序的時候,你經(jīng)常會遇到嵌套的()結構。這時,"%" 是一個非常方便的命令?
了:它能匹配一對括號。如果光標在 "(" 上,它移動到對應的 ")" 上,反之,如果它在?
")" 上,它移動到 "(" 上。

??????????????????????????? %?
???????????????????????? <----->?
??????????????? if (a == (b * c) / d)?
?????????????????? <---------------->?
??????????????????????????? %

這個命令也可適用于 [] 和 {}。(可用'matchpairs'選項定義)

當光標不在一個有用的字符上,"%" 會先向前找到一個。比如當光標停留在上例中的行?
首時,"%" 會向前查找到第一個 "("。然后會移動到它的匹配處。

??????????????? if (a == (b * c) / d)?
??????????????? ---+---------------->?
?????????????????????????? %

?

--------------------------------------------------------------------------------

*03.5*? 移動到指定的行

如果你是一個 C 或者 C++ 程序員,你對下面這樣的錯誤信息應該非常熟悉:

??????? 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" 命令把光標移動到文末。移動到文首的命令是 "gg"。"1G"?
也能完成這個功能,但稍復雜一點。

??????????? |?? 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%" 移到差不多結尾的位置。

前面的描述假定你想移動到文件中的某一行,而不在乎它是否可見。那么如何移動到視野?
之內(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*? 確定當前位置

要確定你在文件中的位置,有三種方法:

1.? 使用 CTRL-G 命令,你會獲得如下消息(假定 'ruler' 選項已經(jīng)被關閉):

??????? "usr_03.txt" line 233 of 650 --35%-- col 45-52

??? 這里顯示了你正在編輯的文件的名稱,你所處的當前行的行號,全文的總行數(shù),光標?
??? 以前的行占全文的百分比,和你所處的列的列號。?
??? 有時你會看到一個分開的兩個列號。例如,"col 2-9"。這表示光標處于第二個字符?
??? 上,但由于使用了制表符,在屏幕上的位置是 9。

2. 設置 'number' 選項。這會在每行的前面加上一個行號:

??????? :set number

??? 要重新關閉這個選項:

??????? :set nonumber

??? 由于'number'是一個布爾類型的選項,在它前面加上 "no" 表示關閉它。布爾選項只會?
??? 有兩個值,on 或者 off。?
????? Vim 有很多選項,除了布爾類型的,還有數(shù)字或者字符串類型的。在用到的時候會給?
??? 處一些例子的。

3.? 設置 'ruler' 選項。這會在 Vim 窗口的右下角顯示當前光標的位置:

??????? :set ruler

使用 'ruler' 的好處是它不占多少地方,從而可以留下更多的地方給你的文本。

?

--------------------------------------------------------------------------------

*03.7*? 滾屏

CTRL-U 命令向下滾動半屏。想象一下通過一個視口看著你的文本,然后把這個視口向上移動?
該視口的一半高度。這樣,窗口移動到當前文字的上面,而文字則移到窗口的下面。不用擔心?
記不住那邊是上。很多人都是這樣。?
??? 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(實際上會留下兩行不滾動)。反向的命令是 CTRL-B。?
幸運地,CTRL-F 是向前 (forward) 滾動,CTRL-B 是向后 (backward) 滾動,這比較好記。

移動中的一個常見問題是,當你用 "j" 向下移動的時候,你的光標會處于屏幕的底部,?
你可能希望,光標所在行處于屏幕的中間。這可以通過 "zz" 命令實現(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" 把光標所在行移動到屏幕的頂部,而 "zb" 則移動到屏幕的底部。Vim 中還有另外?
一些用于滾動的命令,可以參見|Q_sc|。要使光標上下總保留有幾行處于視口中用作上下?
文,可以使用'scrolloff'選項。

?

--------------------------------------------------------------------------------

*03.8*? 簡單查找

查找命令是 "/String"。例如,要查找單詞 "include",使用如下命令:

??????? /include

你會注意到,當你輸入 "/" 的時候,光標移到了 Vim 窗口的最后一行,這與 "冒號命令"?
一樣,在那里你可以輸入要查找的字符串。你可以使用退格鍵 (退格箭頭或<BS>) 進行?
修改,如果需要的時候還可以使用 <Left> 和 <Right> 鍵。?
?? 使用 <Enter> 開始執(zhí)行這個命令。

??????? Note:?
??????? 字符.*[]^%//?~$有特殊含義。如果你要查找它們,需要在前面加上一個 ""。?
??????? 請參見下文。

要查找下一個匹配可以使用 "n" 命令。用下面命令查找光標后的第一個 #include:

??????? /#include

然后輸入 "n" 數(shù)次。你會移動到后面每一個 #include。如果你知道你想要的是第幾個,?
可以在這個命令前面增加次數(shù)前綴。這樣,"3n" 表示移動到第三個匹配點。要注意,?
"/" 不支持次數(shù)前綴。

"?" 命令功能與 "/" 的功能類似,但是是反方向查找:

??????? ?word

"N" 命令在反方向重復前一次查找。因此,在 "/" 命令后執(zhí)行 "N" 命令是向后查找,?
在 "?" 命令后執(zhí)行 "N" 命令是向前查找。


忽 略 大 小 寫

通常,你必須區(qū)分大小寫地輸入你要查找的內(nèi)容。但如果你不在乎大小寫。可以設置?
'ignorecase' 選項:

??????? :set ignorecase

如果你現(xiàn)在要查找 "word",它將匹配 "word" 和 "WORD"。如果想再次區(qū)分大小寫:

??????? :set noignorecase


歷 史 記 錄

假設你執(zhí)行了三個查找命令:

??????? /one?
??????? /two?
??????? /three

現(xiàn)在,讓我們輸入 "/" 啟動一次查找,但先不按下回車鍵。現(xiàn)在按 <Up>(上箭頭),Vim?
把 "/three" 放到你的命令行上。回車就會從當前位置查找 "three"。如果你不回車,?
繼續(xù)按 <Up>,Vim 轉而顯示 "/two",而下一次 <Up> 變成 "/one"。?
??? 你還可以用 <Down> 命令在歷史記錄中反向查找。

如果你知道前面用過的一個模式以什么開頭,而且你想再使用這個模式的話,可以在輸入?
<Up> 前輸入這個開頭。繼續(xù)前面的例子,你可以輸入 "/o<Up>",Vim 就會在命令行上?
顯示 "/one"。

冒號開頭的命令也有歷史記錄。這允許你取回前一個命令并再次執(zhí)行。這兩種歷史記錄?
是相互獨立的。


在 文 本 中 查 找 一 個 單 詞

假設你在文本中看到一個單詞 "TheLongFunctionName" 而你想找到下一個相同的單詞。?
你可以輸入 "/TheLongFunctionName",但這要輸入很多東西。而且如果輸錯了,Vim?
是不可能找到你要找的單詞的。?
??? 有一個簡單的方法:把光標移到那個單詞下面使用 "*" 命令。Vim 會取得光標上?
的單詞并把它作為被查找的字符串。?
??? "#" 命令在反向完成相同的功能。你可以在命令前加一個次數(shù):"3*" 查找光標下?
單詞第三次出現(xiàn)的地方。


查 找 整 個 單 詞

如果你輸入 "/the",你也可能找到 "there"。要找到以 "the" 結尾的單詞,可以用:

??????? /the>

"/>" 是一個特殊的記號,表示只匹配單詞末尾。類似地,"/<" 只匹配單詞的開頭。?
這樣,要匹配一個完整的單詞 "the",只需:

??????? /<the>

這不會匹配 "there" 或者 "soothe"。注意 "*" 和 "#" 命令也使用了 "詞首" 和 "詞尾"?
標記來匹配整個單詞(要部分匹配,使用 "g*" 和 "g#")


高 亮 匹 配

當你編輯一個程序的時候,你看見一個變量叫 "nr"。你想查一下它在哪被用到了。你可以?
把光標移到 "nr" 下用 "*" 命令,然后用 n 命令一個個遍歷。?
??? 這里還有一種辦法。輸入這個命令:

??????? :set hlsearch

現(xiàn)在如果你查找 "nr",Vim會高亮顯示所有匹配的地方。這是一個很好的確定變量在哪被使?
用,而不需要輸入更多的命令的方法。?
??? 要關掉這個功能:

??????? :set nohlsearch

然后你又需要在下一次查找的時候又切換回來。如果你只是想去掉高亮顯示的東西,用如下?
命令:

??????? :nohlsearch

這不會復位 hlsearch 選項。它只是關閉高亮顯示。當你執(zhí)行下一次查找的時候,高亮功能?
會被再次激活。使用 "n" 和 "N" 命令時也一樣。

調(diào) 節(jié) 查 找 方 式

有一些選項能改變查找命令的工作方式。其中有幾個是最基本的:

??????? :set incsearch

這個命令使 Vim 在你輸入字符串的過程中就顯示匹配點。用這個可以檢查正確的地方是否已經(jīng)?
被找到了。然后輸入 <Enter> 跳到那個地方。或者繼續(xù)輸入更多的字符改變要被查找的字符串。

??????? :set nowrapscan

這個選項在找到文件結尾后停止查找。或者當你往回查找的時候遇到文件開頭停止查找。默認?
情況下 'wrapscan' 的狀態(tài)是 "on"。所以在找到文件尾的時候會自動折返。


插 曲

如果你喜歡前面的選項,而且每次用 Vim 都要設置它,那么,你可以把這些命令寫到?
Vim 的啟動文件中。?
??? 編輯 |not-compatible| 中提到的文件,或者用如下命令確定這個文件在什么地方:

??????? :scriptnames

編輯這個文件,例如,象下面這樣:

??????? :edit ~/.vimrc

然后在文中加一行命令來設置這些選項,就好像你在 Vim 中輸入一樣,例如:

??????? Go:set hlsearch<Esc>

"G" 移動到文件的結尾,"o" 開始一個新行,然后你在那里輸入 ":set" 命令。?
最后你用 <Esc> 結束插入模式。然后用如下命令存盤:

??????? ZZ

現(xiàn)在如果你重新啟動 Vim,'hlsearch' 選項就已經(jīng)被設置了。

?

--------------------------------------------------------------------------------

*03.9*? 簡單的查找模式

Vim 用正則表達式來定義要查找的對象。正則表達式是一種非常強大和緊湊的定義查找模式?
的方法。但是非常不幸,這種強大的功能是有代價的,因為使用它需要掌握一些技巧。?
??? 本章我們只介紹一些基本的正則表達式。要了解更多的關于查找模式和命令,請參考?
|usr_27.txt|。你還可以在|pattern|中找到正則表達式的完整描述。

行 首 與 行 尾

^字符匹配行首。在美式英文鍵盤上,它在數(shù)字鍵 6 的上面。模式 "include" 匹配一行中?
任何位置的單詞 include。而模式 "^include" 僅匹配在一行開始的 include。?
??? $字符匹配行尾。所以,"was$" 僅匹配在行尾的單詞 was。

我們在下面的例子中用 "x" 標記出被 "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 " 的行是不會被這個模式匹配的。

匹 配 任 何 單 個 字 符

點 "." 字符匹配任何字符。例如,模式 "c.m" 匹配一個第一個字符是c,第二個字符是?
任意字符,而第三個字符是m的字符串。例如:

??????? We use a computer that became the cummin winter.?
???????????????? xxx???????????? xxx????? xxx


匹 配 特 殊 字 符

如果你確實想匹配一個點字符,你可以在前面加一個反斜杠去消除它的特殊含義。?
??? 如果你用 "ter." 為模式去查找,你會匹配這些地方:

??????? We use a computer that became the cummin winter.?
????????????????????? xxxx????????????????????????? xxxx

但如果你查找 "ter/.",你只會匹配第二個位置。

?

--------------------------------------------------------------------------------

*03.10* 使用標記

當你用 "G" 命令跳到另一個地方,Vim 會記住你從什么地方跳過去的。這個位置成為一個?
標記,要回到原來的地方,使用如下命令:

??????? ``

` 用單引號 ' 也可以。?
?? 如果再次執(zhí)行這個命令你會跳回去原來的地方,這是因為 ` 記住了自己跳轉前的位置。?
通常,每次你執(zhí)行一個會將光標移動到本行之外的命令,這種移動即被稱為一個 "跳轉"。?
這包括查找命令 "/" 和 "n"(無論跳轉到多遠的地方)。但不包括 "fx" 和 "tx" 這些?
行內(nèi)查找命令或者 "w" 和 "e" 等詞移動命令。?
??? 另外 "j" 和 "k" 不會被當做是一次 "跳轉",即使你在前面加上個數(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 你又會到達找到 "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" 命令能輸出一個你可以跳往的位置的列表。最后一個你使用的到的標記會用?
">" 符號標記出來。


有 名 字 的 標 記

Vim 允許你在文本中放置自定義的標記。命令 "ma" 用 a 標記當前的光標位置。你可以在?
文本中使用 26 個標記(a到z)。這些標記是不可見的,只是一個由 Vim 記住的位置。?
??? 要跳到一個你定義的標記,可以使用命令 `{mark},這里 {mark} 是指定義標記?
的那個字母。所以,移到標記a的命令是:

??????? `a

命令 'mark(單引號加上一個標記)會移到標記所在行的行首。這與 `mark 命令是不同的,?
后者是移到標記所在行上被標記的列。

標記在需要處理一個文件的兩個相關地方的時候非常有用。假設你在處理文末的時候需要?
查看文首的一些內(nèi)容,先移動到行首,設置一個標記 s (start):

??????? ms

然后移動到你需要處理的地方,再設置一個標記 e (end):

??????? me

現(xiàn)在你可以隨意移動,當你需要看開頭的地方,可以使用這個命令移到那里:

??????? 's

然后使用 '' 跳回來。或者用 'e 跳到你正在處理的文尾的地方。?
??? 這里使用 s 和 e 作標記名沒有特別的含義,只是為了好記而已。

你可以用如下命令取得所有的標記的列表:

??????? :marks

你會注意到有一些特殊的標記,包括:

??????? '?????? 跳轉前的位置?
??????? "?????? 最后編輯的位置?
??????? [?????? 最后修改的位置的開頭?
??????? ]?????? 最后修改的位置的結尾?
作小改動


本章介紹幾種修正和移動文本的方法,這包括三種修改文本的基本方法:操作符-動作,?
可視模式以及文本對象。

|04.1|? 操作符與動作?
|04.2|? 改變文本?
|04.3|? 重復一個修改?
|04.4|? 可視模式?
|04.5|? 移動文本?
|04.6|? 拷貝文本?
|04.7|? 使用剪貼板?
|04.8|? 文本對象?
|04.9|? 替換模式?
|04.10| 結論

下一章: |usr_05.txt|? 選項設置?
前一章: |usr_03.txt|? 移動?
? 目錄: |usr_toc.txt|

?

--------------------------------------------------------------------------------

*04.1*? 操作符與動作

在第二章你已經(jīng)學過使用 "x" 命令來刪除一個字符以及通過個數(shù)前綴,例如 "4x" 去刪?
除多個字符。?
??? "dw" 命令刪除一個單詞。你可能認出來了,"w" 是詞移動命令。實際上,"d" 命?
令后面可以跟任何 "動作"(motion)命令,它會刪除從當前位置到光標移動到的目標?
位置的的全部內(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 只刪除從當前位置到 "動作" 把光標移動到的位置的前一個位置。這是因為 Vim 認為?
你可能不想刪掉一個單詞的第一個字符。如果你用 "e" 命令作為動作,這時 Vim 認為你?
是想刪掉整個單詞(包括最后一個字符):

??????? To err is human. you need a computer.?
??????????????????????? -------->?
?????????????????????????? d2e

??????? To err is human. a computer.

是否包括光標所在的字符取決與你使用的移動命令。在參考手冊中,當不包括這個字符時,?
稱為 "非包含的" (exclusive),而包括這個字符的時候,稱為 "包含的" (inclusive)。

"$" 命令移動到行尾。所以,"d$" 命令從當前的位置一直刪除到本行行尾。這是一個?
"包含的" 命令,所以,這行的最后一個字符也會被刪除:

??????? 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????? 移動兩個單詞的距離(與操作符合起來,它刪除兩個單詞并進入插入模式)?
??????? be????? 插入 be 這個單詞?
??????? <Esc>?? 切換回普通模式

如果你留意,你會發(fā)現(xiàn)一個奇怪的地方:human 前面的空格沒有被刪除。有一句諺語說道:?
任何問題都有一個簡單,清楚而錯誤的回答。"cw" 命令就屬于這種情況。c 操作符在很?
多地方都和 d 一樣,但有一個例外,"cw"。它實際上象 "ce" 一樣,刪除到單詞尾。這?
樣單詞后面的空格就不包括在內(nèi)了。這要追溯到使用 Vi 的舊日子。由于很多人已經(jīng)習慣?
這種方式了,這個例外就留在 Vim 里了。


更 多 的 修 改 命 令

像 "dd" 可以刪除一行一樣,"cc" 修改一整行。但它會保留這一行的下縮進 (前面的?
空格)。

"d$" 刪除到行尾;"c$" 則修改到行尾。這就象先用 "d$" 刪除一行再用 "a" 啟動?
插入模式并加入新的文字。


快 捷 鍵

有些 "操作符-動作" 命令由于經(jīng)常被使用,所以被設置為單字符命令:

??????? x? 表示? dl? (刪除當前光標下的字符)?
??????? X? 表示? dh? (刪除光標左邊的字符)?
??????? D? 表示? d$? (刪除到行尾)?
??????? C? 表示? c$? (修改到行尾)?
??????? s? 表示? cl? (修改一個字符)?
??????? S? 表示? cc? (修改一整行)


在 什 么 地 方 加 入 個 數(shù) 前 綴

命令 "3dw" 和 "d3w" 都是刪除3個單詞。如果你非要尋根問底,那么:"3dw" 表示?
刪除一個單詞3次,而 "d3w" 表示刪除三個單詞一次。這是一個沒有分別的分別。?
實際上你可以放兩個次數(shù)前綴,例如,"3d2w" 刪除兩個單詞三次,共計六個單詞。


替 換 單 個 字 符

"r" 命令不是操作符。它只是等你輸入一個字符然后用這個字符替換當前光標上的字?
符。你可以用 "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*? 重復一個修改

"." 是 Vim 中一個非常簡單而有用的命令。它重復最后一次的修改操作。例如,假設你在?
編輯一個 HTML 文件,你想刪除所有的 <B> 標記。你把光標移到第一個 "<" 上,然后用?
"df>" 命令刪除 <B>。然后你就可以移到 </B> 的 < 上面用 "." 命令刪除它。"." 命令?
執(zhí)行最后一次的修改命令(在本例中,就是 "df>")。要刪除下一個 <B> 標記,移動到下?
一個 < 的位置,再執(zhí)行 "." 命令即可。

????????????????????????????? To <B>generate</B> a table of <B>contents?
??????? f<?? 找第一個<??????? --->?
??????? df>? 刪除到>???????????? -->?
??????? f<?? 找下一個<???????????? --------->?
??????? .??? 重復df>??????????????????????? --->?
??????? f<?? 找下一個<???????????????????????? ------------->?
??????? .??? 重復df>??????????????????????????????????????? -->

"." 命令重復任何除 "u" (undo),CTRL-R (redo) 和冒號命令外的修改。

再舉一個例子:你想把 "four" 修改成"five"。有好幾個地方都要作這種修改。你可?
以用如下命令快速完成這個操作:

??????? /four<Enter>??? 找到第一個 "four"?
??????? cwfive<Esc>???? 修改成 "five"?
??????? n?????????????? 找下一個 "four"?
??????? .?????????????? 重復修改操作?
??????? n?????????????? 找下一個 "four"?
??????? .?????????????? 重復修改?
??????????????????????? 如此類推......

?

--------------------------------------------------------------------------------

*04.4*? 可視模式

要刪除一些簡單的東西,用 "操作符-動作" 命令可以完成得很好。但很多情況下,并?
不容易確定用什么命令可以移到你想修改的地方。這時候,你就需要可視模式了。

你可以用 "v" 命令啟動可視模式。你可以移動光標到需要的地方。當你這樣做的時候,?
中間的文本會被高亮顯示。最后執(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" 這一欄,把光標移動到 "Q2" 的 "Q" 上面。按 CTRL-V 啟動塊可視模式。?
現(xiàn)在用 "3j" 向下移動三行,然后用 "w" 移到下一個單詞。你可以看到最后一欄的第一?
個字符也被包括進來了。要去掉它,用 "h" 命令即可。現(xiàn)在按 "d",中間一欄就被刪除了。


移 動 到 另 一 端

如果你在可視模式下選中了一些文字,然后你又發(fā)現(xiàn)你需要改變被選擇的文字的另一端,?
用 "o" 命令即可(提示:"o" 表示 other end),光標會移動到被選中文字的另一端,?
現(xiàn)在你可以移動光標去改變選中文字的開始點了。再按 "o" 光標還會回到另一端。

當使用塊可視模式的時候,你會有四個角,"o" 只是把你移到對角上。而用 "O" 則能?
移到同一行的另一個角上。

Note: "o" 和 "O" 在可視模式下與在普通模式下的作用有很大的不同;在普通模式下,?
它們的作用是在光標后或前加入新的一行。

?

--------------------------------------------------------------------------------

*04.5*? 移動文本

當你用 "d","x" 或者其它命令刪除文本的時候,這些文字會被存起來。你可以用 p 命?
令重新粘貼出來(p 在 Vim 中表示 put)。?
??? 看看下面的例子。首先,你會在你要刪除的那一行上輸入 "dd" 刪除一整行,然后?
移動到你要重新插入這行的地方輸入 "p" (put),這樣這一行就會被插入到光標下方。

??????? a line????????? a line??????? a line?
??????? line 2??? dd??? line 3??? p?? line 3?
??????? line 3??????????????????????? line 2

由于你刪除的是一整行,"p" 命令把該行插入到光標下方。如果你刪除的是一行的一部?
分(例如一個單詞),"p" 命令會把它插入到光標的后面。

??????? 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.


關 于 粘 貼 的 更 多 知 識

"P" 命令象 "p" 一樣也是插入字符,但插入點在光標前面。當你用 "dd" 刪除一行,?
"P" 會把它插入到光標所在行的前一行。而當你用 "dw" 刪除一個單詞,"P" 會把它?
插入到光標前面。

你可以執(zhí)行這個命令多次,每次會插入相同的文本。

"p" 和 "P" 命令接受個數(shù)前綴,被插入的文本就會被插入指定的次數(shù)。所以 "dd" 后?
加一個 "3p" 會把刪除行的三個拷貝插入到文本中。


交 換 兩 個 字 符

經(jīng)常發(fā)生這樣的情況,當你輸入字符的時候,你的手指比你的腦子轉得快(或者相反?)。?
這樣的結果是你經(jīng)常把 "the" 敲成 "teh"。Vim 讓你可以很容易得修正這種錯誤。只要把?
光標移到 "teh" 的 "e" 上,然后執(zhí)行 "xp" 即可。這個工作過程是:"x" 刪除一個字符,?
保存到寄存器。"p" 把這個被保存的字符插入到光標的后面,也就是 "h" 的后面了。

??????? teh???? th???? the?
???????? x?????? p

?

--------------------------------------------------------------------------------

*04.6*? 拷貝文本

要把文本從一個地方拷貝到另一個地方,你可以先刪除它,然后用 "u" 命令恢復,再用?
"p" 拷到另一個地方。這里還有一種簡單的辦法:抽出 (yank)。"y" 命令可以把文字拷?
貝到寄存器中。然后用 "p" 命令粘貼到別處。?
??? Yanking 是 Vim 中拷貝命令的名字。由于 "c" 已經(jīng)被用于表示change了,所以拷貝?
(copy)就不能再用 "c" 了。但 "y" 還是可用的。把這個命令稱為 "yanking" 是為了?
更容易記住 "y" 這個鍵。(譯者注:這里只是把原文譯出以作參考,"抽出" 文本畢竟是?
不妥的。后文中將統(tǒng)一使用 "拷貝"。中文可不存在 change 和 copy 的問題。)

由于 "y" 是一個操作符,所以 "yw" 命令就是拷貝一個單詞了。當然了,個數(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" 項。你可以?
先用可視模式選中一些文本,然后使用 Edit/Copy 菜單。現(xiàn)在被選中的文本被拷進了剪貼?
板。你可以把它粘貼到其它程序,或者在 Vim 內(nèi)部使用。

如果你已經(jīng)從其它程序中拷貝了一些文字到剪貼板,你可以在 Vim 中用 Edit/Paste 菜單?
粘貼進來,這在普通模式和插入模式中都是有效的。如果在可視模式,被選中的文字會被?
替換掉。

"Cut" 菜單項會在把文字拷進剪貼板前刪除它。"Copy","Cut" 和 "Paste" 命令在彈出?
菜單中也有(當然了,前提是有彈出式菜單)。如果你的 Vim 有工具條,在工具條上?
也能找到這些命令。

如果你用的不是 GUI,或者你根本不喜歡用菜單,你只能用其它辦法了。你還是可以用普通?
的 "y"(yank)和 "p"(put)命令,但在前面必須加上 "*(一個雙引號加一個星號)。?
例如,要拷貝一行到剪貼板中:

??????? "*yy

要粘貼回來:

??????? "*p

這僅在支持剪貼板的 Vim 版本中才能工作。關于剪貼板的更多內(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)在我們又有了 "操作符-文本對象"。?
??? 這種方法與 "操作符-動作" 很相似,但它不是操作于從當前位置到移動目標間的內(nèi)容,?
而是對光標所在位置的 "文本對象" 進行操作。文本對象是作為一個整體來處理的。現(xià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"(譯者注:實在很難用中文表示這個意思了,各位還是記英文名吧)。還有?
一個文本對象是 "as",區(qū)別是 "as" 包括句子后面的空白字符而 "is" 不包括。如果?
你要刪除一個句子,而且你還想同時刪除句子后面空白字符,就用 "das";如果你想保?
留空白字符而替換一個句子,則使用"cis"。

你還可以在可視模式下使用文本對象。這樣會選中一個文本對象,而且繼續(xù)留可視模式,?
你可以繼續(xù)多次執(zhí)行文本對象命令。例如,先用 "v" 啟動可視模式,再用 "as"?
就可以選中一個句子。現(xiàn)在重復執(zhí)行 "as",就會繼續(xù)選中更多的句子。最后你可以使用?
一個操作符去處理這些被選中的句子。

你可以在這里找到一個詳細的文本對象的列表:|text-objects|。

?

--------------------------------------------------------------------------------

*04.9*? 替換模式

"R" 命令啟動替換模式。在這個模式下,你輸入的每個字符都會覆蓋當前光標上的字符。?
這會一直持續(xù)下去,直到你輸入<Esc>。?
??? 在下面的例子中,你在 "text" 的第一個 "t" 上啟動替換模式:

??????? This is text.?
??????????????? Rinteresting.<Esc>

??????? This is interesting.

你可能會注意到,這是用十二個字符替換一行中的五個字符。如果超出行的范圍,"R" 命?
令自動進行行擴展,而不是替換到下一行。

你可以通過 <Insert> 在插入模式和替換模式間切換。

但當你使用 <BS>(退格鍵)進行修正時,你會發(fā)現(xiàn)原來被替換的字符又回來了。這就好像?
一個 "撤消" 命令一樣。

?

--------------------------------------------------------------------------------

*04.10* 結論

操作符,移動命令和文本對象可以有各種組合。現(xiàn)在你已經(jīng)知道它是怎么工作了,你可以?
用 N 個操作符加上 M 個移動命令,組合出 N*M 個命令!

你可以在這里找到一個操作符的列表:|operator|

還有很多方法可以刪除文本。這是一些經(jīng)常用到的:

x?????? 刪除光標下的字符("dl"的縮寫)?
X?????? 刪除光標前的字符("dh"的縮寫)?
D?????? 從當前位置刪除到行尾("d$"的縮寫)?
dw????? 從當前位置刪除到下一個單詞開頭?
db????? 從當前位置刪除到前一個單詞的開頭?
diw???? 刪除光標上的單詞(不包括空白字符)?
daw???? 刪除光標上的單詞(包括空白字符)?
dG????? 刪除到文末?
dgg???? 刪除到文首

如果你用 "c" 代替 "d",這會變成修改命令;而改用 "y",則變成拷貝命令,等等等等。

還有一些常用的命令,放在哪一章都不合適,列在這里:

??????? ~?????? 修改光標下字符的大小寫,并移動到下一個字符。這不是一個操作符?
??????????????? (除非設置了 'tildeop'),所以你不能連接一個動作命令。這個命?
??????????????? 令在可視模式下也有效,它會改變被選中的所有文本的大小寫。

??????? I?????? 移到當前行的第一個非空字符并啟動插入模式

??????? A?????? 移動到行尾并啟動插入模式

Vim 可以按你的需要進行設置。本章告訴你怎樣使 Vim 用你指定的選項啟動,怎樣增加插件?
以增強 Vim 的功能;以及怎樣進行宏定義。

|05.1|? vimrc 文件?
|05.2|? vimrc 示例解釋?
|05.3|? 簡單鍵盤映射?
|05.4|? 增加插件?
|05.5|? 增加幫助?
|05.6|? 選項窗口?
|05.7|? 常用選項

????? 下一章:|usr_06.txt|? 使用語法加亮?
????? 前一章:|usr_04.txt|? 做小改動?
??????? 目錄:|usr_toc.txt|

?

--------------------------------------------------------------------------------

*05.1*? vimrc 文件

可能你已經(jīng)厭倦了輸入那些經(jīng)常用到的命令了。要讓 Vim 用你習慣的設置啟動,你可以?
把這些設置寫到一個叫 vimrc 的文件中。Vim 會在啟動的時候讀入這個文件。

如果你不知道你的 vimrc 在什么地方,可以使用如下命令:

??????? :scriptnames

命令列出的文件列表開頭的幾個中應該有一個叫 ".vimrc" 或者 "_vimrc" 的文件在你的?
home 目錄中。?
??? 如果你還沒有 vimrc,請參考 |vimrc| 一節(jié)看看你應該在什么地方創(chuàng)建 vimrc 文件。?
另外 ":version" 命令能告訴你 vim 在什么地方找 "用戶的 vimrc 文件"。

對于 Unix 系統(tǒng),肯定是如下文件:

??????? ~/.vimrc

對于 MS-DOS 和 MS-Windows,常常使用下面其中一個文件:

??????? $HOME/_vimrc?
??????? $VIM/_vimrc

vimrc 文件可以包含任何冒號命令。最簡單的是設置選項命令。例如,如果你想 Vim 啟動?
的時候始終開啟 'incsearch' 選項,可以在你的 vimrc 文件中加上:

??????? set incsearch

要使這個命令生效,你需要重啟動 Vim。后面我們還會學到如何不退出 Vim 就能讓它生效。

這一章只解釋最基本的東西。要學習更多關于寫 Vim 腳本的知識,請參見|usr_41.txt|。

?

--------------------------------------------------------------------------------

*05.2*? vimrc 示例解釋

在第一章中,我們曾經(jīng)介紹過怎樣用 vimrc 示例文件(包括在 Vim 發(fā)布中)使 Vim 以非?
vi 兼容模式啟動(參見|not-compatible|)。這個文件可以在這里找到:

??????? $VIMRUNTIME/vimrc_example.vim

我們在這一節(jié)中介紹這個文件中用到的一些命令。這會對你自行參數(shù)設置有一定的幫助。?
但我們不會介紹所有的內(nèi)容。你需要用 ":help" 獲得更多的幫助。


??????? set nocompatible

如第一章所述,這個命令人為地告訴 Vim 工作在 vi 增強模式,因此與 Vi 不完全兼容。?
要關閉 'compatible' 選項設,'nocompatible' 可以用于完成這個功能。


??????? set backspace=indent,eol,start

這指明在插入模式下 <BS> 如何刪除光標前面的字符。逗號分隔的三個值分別指:行首的?
空白字符,分行符和插入模式開始處之前的字符。


??????? set autoindent

這使 Vim 在啟動一個新行的時候使用與前一行一樣的縮進。就是說,新行前面會有同樣?
多的空白字符。啟動新行是指用 <Enter> 換行,在普通模式下執(zhí)行 "o" 命令等情況。


??????? if has("vms")?
????????? set nobackup?
??????? else?
????????? set backup?
??????? endif

這告訴 Vim 當覆蓋一個文件的時候保留一個備份。但 VMS 系統(tǒng)除外,因為 VMS 系統(tǒng)會?
自動產(chǎn)生備份文件。備份文件的名稱是在原來的文件名上加上 "~" 字符。參見 |07.4|


??????? set history=50

這個命令保存 50 個命令和 50 個查找模式的歷史。如果你想 Vim 記住多些或者少些?
命令,可以把這個數(shù)改成其它值。


??????? set ruler

總在 Vim 窗口的右下角顯示當前光標位置。


??????? set showcmd

在 Vim 窗口右下角,標尺的右邊顯示未完成的命令。例如,當你輸入 "2f",Vim 在等?
你輸入要查找的字符并且顯示 "2f"。當你再輸入w,"2fw" 命令被執(zhí)行,"2f" 自動消?
失。

??????? +-------------------------------------------------+?
??????? |text in the Vim window?????????????????????????? |?
??????? |~??????????????????????????????????????????????? |?
??????? |~??????????????????????????????????????????????? |?
??????? |-- VISUAL --?????????????????? 2f???? 43,8?? 17% |?
??????? +-------------------------------------------------+?
???????? ^^^^^^^^^^^????????????????? ^^^^^^^^ ^^^^^^^^^^?
????????? 'showmode'???????????????? 'showcmd'? 'ruler'


??????? set incsearch

在查找模式輸入完前顯示匹配點。


??????? map Q gq

這定義一個鍵映射。下一節(jié)會介紹更多的相關內(nèi)容。這將定義 "Q" 命令用來完成與 "gq"?
操作符相同的功能,這是在 Vim 5.0 版前 "Q" 命令的作用。如果沒有設置這個映射,?
"Q" 會啟動 Ex 模式,這也許不是你想要的情況。


??????? vnoremap p <Esc>:let current_reg = @"<CR>gvs<C-R>=current_reg<CR><Esc>

這是一個復雜映射。這里不介紹它是怎么工作的。它的作用是使 "p" 命令在可視模式下?
用拷貝的字符覆蓋被選中的字符。你可以看到映射可以被用來執(zhí)行相當復雜的操作。但其?
本質(zhì)依然是一個命令序列而已,與你直接輸入沒有什么兩樣。


??????? if &t_Co > 2 || has("gui_running")?
????????? syntax on?
????????? set hlsearch?
??????? endif

這激活語法加亮功能,但僅在顏色功能有效的時候才有效。而 'hlsearch' 選項告訴?
Vim 加亮上次查找模式匹配的地方。"if" 命令在設置選項的時候非常有用,它使設置?
命令在某些條件下才執(zhí)行。更多的內(nèi)容請參見|usr_41.txt|。

??????????????????????????????????????????????????????? *vimrc-filetype*?
??????? filetype plugin indent on

這啟動三個非常靈巧的機制:?
1. 文件類型探測?
??? 當你開始編輯一個文件的時候,Vim 會試圖確定這個文件的類型。當你編輯 "main.c"?
??? 時,Vim 會根據(jù)擴展名 ".c" 認為這是一個 C 源文件。當你編輯一個文件前面是?
??? "#!/bin/sh" 的文件時,Vim 會把它認作 "sh" 文件。文件類型探測用于語法加亮?
??? 和以下另兩項。請參見|filetypes|。

2. 使用文件類型相關的插件?
??? 不同的文件需要不同的選項支持。例如,當你編輯一個 "c" 文件,用 'cindent'?
??? 選項來自動縮進就非常有用。這些文件類型相關的選項在 Vim 中是通過文件類型?
??? 插件來實現(xiàn)的。你也可以加入自己的插件,請參見 |write-filetype-plugin|。

3. 使用縮進文件?
??? 當編輯程序的時候,行縮進通常可以被自動決定。Vim 用不同的策略處理不同的?
??? 文件類型。請參見 |:filetype-indent-on| 和 'indentexpr'。


??????? autocmd FileType text setlocal textwidth=78

這使 Vim 在一行長于 78 個字符的時候自動換行,但僅對純文本文件中有效。這里包括?
兩個部分。其中 "autocmd FileType text" 定義個自動命令,表示當文件類型被設置為?
"text" 的時候,后面的命令自動執(zhí)行。"setlocal textwidth=78" 設置 'textwidth'?
選項為78,但僅對本文件有效。


??????? autocmd BufReadPost *?
???????????? if line("'/"") > 0 && line("'/"") <= line("$") |?
?????????????? exe "normal g`/"" |?
???????????? endif

這是又一個自動命令。這回它設置為在讀入任何文件之后自動執(zhí)行。后面那堆復雜的東?
西檢查 '" 標記是否已被定義,如果是,則跳轉到該標記。行首的反斜杠用于把所有語句?
連接成一行。這可以避免一行寫得太長,請參見 |line-continuation|。這只在 Vim?
腳本文件中有效,在命令行中無效。

?

--------------------------------------------------------------------------------

*05.3*? 簡單鍵盤映射

映射可以使你把一系列 Vim 命令綁定為一個單鍵。假設你要用一個大括號將一個特定的?
單詞括起來。例如,把 "amount" 變成 "{amount}"。用 ":map" 命令,就可以讓 F5 來?
完成這個工作。命令如下:

??????? :map <F5> i{<Esc>ea}<Esc>

??????? Note:?
??????? 在輸入這個命令時,<F5> 要用四個字符表示。相似地,輸入 <Esc> 不是直接按?
??????? <Esc> 鍵,而是輸入五個字符。在讀這份手冊要注意這些區(qū)別!

讓我們來分解一下這個命令:?
??? <F5>??????? F5 功能鍵。這是命令的觸發(fā)器。當這個鍵被按下時,相應的命令即被?
??????????????? 執(zhí)行。

??? i{<Esc>???? 插入 { 字符。<Esc> 鍵用于退出插入模式。

??? e?????????? 移動到詞尾。

??? a}<Esc>???? 插入 } 到單詞尾。

執(zhí)行 ":map" 命令后,要在單詞兩端加上 {},只需要移到單詞上的第一個字符并按 F5。

在這個例子中,觸發(fā)器是一個單鍵;它還可以是任何字符串。但若你使用一個已經(jīng)存在?
的 Vim 命令,該命令將不在有效。所以你最好避免出現(xiàn)這種情況。?
??? 一個可用于映射的鍵是反斜杠。因為你很可能想定義多個映射,那就加上另一個字符。?
你可以映射 "/p" 為在單詞兩端加園括號,而映射 "/c" 為加花括號,例如:

??????? :map /p i(<Esc>ea)<Esc>?
??????? :map /c i{<Esc>ea}<Esc>

你需要在敲入/后,立即敲入p,以便 Vim 知道它們組成一個命令。

":map" 命令(無參數(shù))列出當前已定義的映射,至少會包括普通模式下的那些。更多的內(nèi)?
容參見 |40.1|。

?

--------------------------------------------------------------------------------

*05.4*? 增加插件??????????????????????????????????????? *add-plugin*??? *plugin*

Vim 可以通過插件增強功能。插件其實是一個當 Vim 啟動的時候能被自動執(zhí)行的腳本。?
簡單地把插件放到你 Vim 的 plugin 目錄中就可以使它生效。?
(這個功能在 |+eval| 被編譯進 Vim 中時才有效)

Vim 中有兩種插件:?
?????? 全局插件:用于所有類型的文件?
?? 文件類型插件:僅用于特定類型的文件

我們將先討論全局插件,然后涉及文件類型插件 |add-filetype-plugin|。


全 局 插 件???????????????????????????????????????????? *standard-plugin*

當你啟動 Vim,它會自動加載一些插件。你不需要為此做任何事。這些插件增加一些?
很多人想用的,但由 Vim 腳本實現(xiàn)而非編譯進 Vim 中的功能。你可以在幫助索引中?
找到這些插件:|standard-plugin-list|。還可以參照 |load-plugin|。

??????????????????????????????????????????????????????? *add-global-plugin*?
你可以加入一個全局插件使得某些功能在你每次使用 Vim 時都被開啟。添加一個全局?
插件只要兩步:?
1. 獲得一個插件的拷貝?
2. 把它塞進合適的目錄


獲 得 一 個 全 局 插 件

在什么地方可以找到插件??
- 有一些與 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)為例(假設你還沒有 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ù)此你可以知道這個插件是全局的還是文件類型相關的。在 $VIMRUNTIME/macros?
中的是全局插件;文件類型插件在 $VIMRUNTIME/ftplugin 中。


使 用 文 件 類 型 插 件???????????????????????????????? *ftplugin-name*

你可以通過把插件文件放到合適的目錄中來增加一個插件。目錄的名字與前面提過的全局?
插件的位置一樣,但最后一級目錄是 "ftplugin"。假設你找到一個用于 "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

總的來說,一個文件類型相關的插件的名稱是:

??????? 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> 部分是相應文件類型的名稱。只有對應文件類型的文件才會用這個?
插件內(nèi)的設置。插件的 <name> 部分則不重要,你可以對同一個文件類型使用多個插件。?
Note 插件必須以 ".vim" 結尾。


深入?yún)⒖甲x物:?
|filetype-plugins|????? 文件類型插件的文檔和有關如何避免映射引起的問題。?
|load-plugins|????????? 全局插件的啟動時間?
|ftplugin-overrule|???? 控制全局文件類型插件的選項?
|write-plugin|????????? 如何寫插件?
|plugin-details|??????? 關于如何使用插件的信息或者當你的插件不工作的時候如何?
??????????????????????? 處理。

?

--------------------------------------------------------------------------------

*05.5*? 增加幫助??????????????????????????? *add-local-help*

如果幸運的話,你安裝的插件還會包括幫助文件。我們這里解釋如何安裝這個幫助文件,?
以便你能方便地獲得新插件的幫助。

我們以 "matchit.vim" 插件為例(包括在 Vim 中)。這個插件使 "%" 命令可以在兩個?
對應的 HTML 標記間,Vim 腳本的 if/else/endif 間等匹配點間跳轉。這非常有用,但?
它不向前兼容(這也是為什么默認的情況下它不會被激活)。?
??? 這個插件有一個文檔:"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

再把幫助文件拷貝進去:

??????? :!cp $VIMRUNTIME/macros/matchit.txt ~/.vim/doc

現(xiàn)在開始玩技巧了,怎樣使 Vim 允許你跳轉到新的主題上?用 |:helptags| 命令產(chǎn)生?
一個本地的tags文件即可:

??????? :helptags ~/.vim/doc

現(xiàn)在,你可以用這個命令

??????? :help g%

來獲得 "g%" 的幫助了。在使用如下命令的時候,可以看見一個新的條目:

??????? :help local-additions

本地幫助的標題行被自動的加入到該節(jié)了。在那里你可以看到 Vim 添加了那些本地的?
幫助文件。你還可以從這里跳轉到新的幫助中。

要寫一個本地幫助文件,請參考 |write-local-help|。

?

--------------------------------------------------------------------------------

*05.6*? 選項窗口

如果要找一個選項,你可以查找這個位置的幫助:|options|。另一個方法是用如下命?
令:

??????? :options

這會打開一個新窗口,其中給出一個選項的列表,并對每個選項提供一行解釋。這些選項?
被根據(jù)種類分組。把光標移到一個主題上然后按回車就可以跳轉到那里。再按一下回車或?
者 CTRL-O 就可以跳回來。

你可以通過這個窗口改變一個選項的值。例如,移到 "displaying text" 主題。然后把?
光標下移到這一行:

??????? set wrap??????? nowrap

當你在上面鍵入回車,這行會改變?yōu)?#xff1a;

??????? set nowrap????? wrap

現(xiàn)在,這個選項被關閉了。

這行的上面是對這個選項的簡要描述。將光標向上移動一行,然后按 <Enter>,你可以?
跳轉到 'wrap' 的完整幫助,再用 CTRL-O 可以跳回來。

對于那些值為數(shù)字或者字符串的選項,你可以編輯它的值,然后按 <Enter> 來啟用該?
值。例如,把光標移動到下面這行:

??????? set so=0

用 $ 移到行尾,再用 "r5" 命令修改為五,然后按 <Enter> 使修改生效。現(xiàn)在如果你?
移動一下光標,你會發(fā)現(xiàn)在你的光標移到窗口邊界前,你的文字就開始滾動了。這就是?
選項 'scrolloff' 完成的功能:它指定在距離邊界多遠的地方開始滾動文字。

?

--------------------------------------------------------------------------------

*05.7*? 常用選項

Vim 中有很多選項。大部分你很少用得上。我們在這個介紹一些常用的。別忘了你可以?
通過 ":help" 命令獲得更多的幫助。方法是在選項命令前后加上單引號,例如:

??????? :help 'wrap'

如果你搞亂了一個選項,你可以通過在選項后加上一個 & 號把它恢復到默認值。例如:

??????? :set iskeyword&

禁 止 折 行

Vim 通常會對長行自動換行,以便你可以看見所有的文字。但有時最好還是能讓文字在一?
行中顯示完。這樣,你需要左右移動才能看到一整行。以下命令可以切換換行方式:

??????? :set nowrap

當你移到到那些不能顯示的文字上,Vim 會自動向右滾動讓你看到后面的文字,要一次滾?
動十個字符,這樣就行了:

??????? :set sidescroll=10

這個命令不改變文件中的文字,只改變顯示方式。


移 動 命 令 換 行

很多命令只能在一行中移動。你可以通過 'whichwrap' 選項改變它。如下命令把這個選項?
設為默認值:

??????? :set whichwrap=b,s

這樣,當光標處于行首時用 <BS> 鍵可以回到前一行的結尾;當處于行尾時用 <Space>?
鍵可以移動到下一行的行首。

要允許 <Left> 和 <Right> 鍵也能這樣,可以用這個命令:

??????? set whichwrap=b,s,<,>

這只在普通模式中有效,要在插入模式中也有效,可以:

??????? :set whichwrap=b,s,<,>,[,]

還有一些可以用的標志,參見 'whichwrap'。


顯 示 TAB 鍵

文件中有 TAB 鍵的時候,你是看不見的。要把它顯示出來:

??????? :set list

現(xiàn)在 TAB 鍵顯示為 ^I,而 $顯示在每行的結尾,以便你能找到可能會被你忽略的空白?
字符在哪里。?
??? 這樣做的一個缺點是在有很多 TAB 的時候看起來很丑。如果你使用一個有顏色的?
終端,或者使用 GUI 模式,Vim 可以用高亮顯示空格和TAB。 使用 'listchars' 選項:

??????? :set listchars=tab:>-,trail:-

現(xiàn)在,TAB會被顯示成 ">---" 而行尾多余的空白字符顯示成 "-"。看起來好多了,是?
吧?


關 鍵 字

'iskeyword' 選項指定那些字母可以出現(xiàn)在一個單詞中:

??????? :set iskeyword?
<????????iskeyword=@,48-57,_,192-255

"@" 表示所有字母。"48-57" 表示 ASCII 字符 48-57 ,即數(shù)字 0 到 9。"192-255"?
是可打印的拉丁字符。?
??? 有時你希望橫線也是關鍵字,以便 "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,-

這回,逗號自動被刪除了。


顯 示 消 息 的 空 間

當 Vim 啟動的時候,在屏幕底部有一行被用于顯示消息。當消息很長的時候,多余的部分?
會被截斷。這樣你只能看到一部分。或者文字自動滾動,你要按 <Enter> 來繼續(xù)。你可以?
給 'cmdheight' 選項賦一個值,用來設定顯示消息所用的行數(shù)。例如:

??????? :set cmdheight=3

這樣意味著你用于編輯文字的空間少了,所以這實際上是一種折衷。

使用語法加亮


黑白的文字讓人厭倦了,增加一些色彩能為你的文件帶來生氣。這不但看起來漂亮,?
還能夠提高你的工作效率。本章介紹如何使用不同顏色顯示不同文本并把它打印出來。

|06.1|? 功能激活?
|06.2|? 顏色顯示不出來或者顯示出錯誤的顏色怎么辦??
|06.3|? 使用不同的顏色?
|06.4|? 是否使用色彩?
|06.5|? 帶顏色打印?
|06.6|? 深入閱讀

???? 下一章:|usr_07.txt|? 編輯多個文件?
???? 前一章:|usr_05.txt|? 選項設置?
?????? 目錄:|usr_toc.txt|

?

--------------------------------------------------------------------------------

*06.1*? 功能激活

一切從一個簡單的命令開始:

??????? :syntax enable

大多數(shù)情況下,這會讓你的文件帶上顏色。Vim 會自動檢測文件的類型,并調(diào)用合適的?
語法加亮。一下子注釋變成藍色,關鍵字變成褐色,而字符串變成紅色了。這使你可以?
很容易瀏覽整個文檔。很快你就會發(fā)現(xiàn),黑白的文本真的會降低你的效率!

如果你希望總能看到語法加亮,把 "syntax enable" 命令加入到 |vimrc| 文件中。

如果你想語法加亮只在支持色彩的終端中生效,你可以在 |vimrc| 文件中這樣寫:

??????? if &t_Co > 1?
????????? syntax enable?
??????? endif

如果你只想在 GUI 版本中有效,可以把 ":syntax enable" 放到你的 |gvimrc| 文件中。

?

--------------------------------------------------------------------------------

*06.2*? 顏色顯示不出來或者顯示出錯誤的顏色怎么辦?

有很多因素會讓你看不到顏色:

- 你的終端不支持彩色。?
??????? 這種情況下,Vim 會用粗體,斜體和下劃線區(qū)分不同文字,但這不好看。你可能?
??????? 會希望找一個支持彩色的終端。對于 Unix,我推薦 XFree86 項目的 xterm:?
??????? |xfree-xterm|。

- 你的終端其實支持顏色,可是 Vim 不知道?
??????? 確保你的 $TERM 設置正確。例如,當你使用一個支持彩色的 xterm 終端:

??????????????? setenv TERM xterm-color

??????? 或者(基于你用的控制臺終端)

??????????????? TERM=xterm-color; export TREM

??????? 終端名必須與你使用的終端一致。如果這還是不行,參考一下 |xterm-color|,?
??????? 那里介紹了一些使 Vim 顯示彩色的方法(不僅是 xterm )。

- 文件類型無法識別?
??????? Vim 不可能識別所有文件,而且有時很難說一個文件是什么類型的。試一下這個?
??????? 命令:

??????????????? :set filetype?
.?
??????? 如果結果是 "filetype=",那么問題就是出在文件類型上了。你可以手工指定?
??????? 文件類型:

??????????????? :set filetype=fortran

??????? 要知道那些類型是有效的,查看一下 $VIMRUNTIME/syntax 目錄。對于 GUI 版本,?
??????? 你還可以使用 Syntax 菜單。設置文件類型也可以通過 |modeline|,這樣,?
??????? 在你每次編輯它的時候都執(zhí)行語法加亮。例如,下面這一行可以用?
??????? 于 Makefile(把它放在接近文首和文末的地方)

??????????????? # vim: syntax=make

??????? 你可能知道怎么檢測自己的文件類型,通常是文件的擴展名(就是點后面的?
??????? 內(nèi)容)參見 |new-filetype| 可以知道如何告訴 Vim 如何檢查一種文件類型。

- 你的文件類型沒有語法高亮定義?
??????? 你可以找一個相似的文件類型并人工設置為那種類型。如果你覺得不好,你可以?
??????? 自己寫一個,參見 |mysyntaxfile|。


或者顏色是錯的:

- 彩色的文字難以辨認?
??????? Vim 自動猜測你使用的背景色。如果是黑的(或者其它深色的色彩),它會?
??????? 用淺色作為前景色。如果是白的(或者其它淺色),它會使用深色作為前景?
??????? 色。如果 Vim 猜錯了,文字就很難認了。要解決這個問題,設置一下?
??????? 'background' 選項。對于深色:

??????????????? :set background=dark

??????? 而對于淺色:

??????????????? :set background=light

?????? 這兩個命令必須在 ":syntax enable" 命令前調(diào)用,否則不起作用。如果要在?
?????? 這之后設置背景,可以再調(diào)用一下 ":syntax reset"。

- 在自下往上滾屏的過程中顏色顯示不對。?
??????? Vim 在分析文本的時候不對整個文件進行處理,它只分析你要顯示的部分。這?
??????? 樣能省不少時間,但也會因此帶來錯誤。一個簡單的修正方法是敲 CTRL-L。?
??????? 或者往回滾動一下再回來。要徹底解決這個問題,請參見 |:syn-sync|。有些?
??????? 語法定義文件有辦法自己找到前面的內(nèi)容,這可以參見相應的語法定義文件。?
??????? 例如,|tex.vim| 中可以查到 Tex 語法定義。

?

--------------------------------------------------------------------------------

*06.3*? 使用不同顏色?????????????????????????? *:syn-default-override*

如果你不喜歡默認的顏色方案,你可以選另一個配色方案。在 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"。要獲得詳細信息, 請參考?
?? |:highlight| 命令。

3. 告訴 Vim 總使用你這個配色方案。把如下語句加入你的 |vimrc| 中:

??????? colorscheme mine

如果你要測試一下常用的配色組合,用如下命令:

??????? :edit $VIMRUNTIME/syntax/colortest.vim?
??????? :source %

這樣你會看到不同的顏色組合。你可以很容易的看到哪一種可讀性好而且漂亮。

?

--------------------------------------------------------------------------------

*06.4*? 是否使用色彩

使用色彩顯示文本會影響效率。如果你覺得顯示得很慢,可以臨時關掉這個功能:

??????? :syntax clear

當你開始編輯另一個文件(或者同一個文件),色彩會重新生效。

??????????????????????????????????????????????????????? *:syn-off*?
如果你要完全關閉這個功能:

??????? :syntax off

這個命令會停止對所有緩沖的所有語法加亮。

??????????????????????????????????????????????????????? *:syn-manual*?
如果你想只對特定的文件采使用語法加亮,可以使用這個命令:

??????? :syntax manual

這個命令激活語法加亮功能,但不會在你開始編輯一個緩沖時自動生效(譯者注:Vim?
中,每個被打開的文件對應一個緩沖,后面的章節(jié)中你會接觸到這方面的內(nèi)容)。要在當?
前緩沖中使用加亮,需要設置'syntax'選項:

??????? :set syntax=ON

?

--------------------------------------------------------------------------------

*06.5*? 帶顏色打印?????????????????????????????????????? *syntax-printing*

在 MS-Windows 版本中,你可以用如下命令打印當前文件:

??????? :hardcopy

這個命令會啟動一個常見的打印對話框,你可以通過它選擇打印機并作一些必要的設置。?
如果你使用的是彩色打印機,那么打印出來的色彩將與你在 Vim 中看到的一樣。但如果?
你使用的是深色的背景,它的顏色會被適當調(diào)整,以便在白色地打印紙上看起來比較舒?
服。

下面幾個選項可以改變 Vim 的打印行為:?
??????? 'printdevice'?
??????? 'printheader'?
??????? 'printfont'?
??????? 'printoptions'

要僅打印一定范圍內(nèi)的行,可以用可視模式選擇需要打印的行在執(zhí)行打印命令,例如:

??????? v100j:hardcopy

"v" 啟動可視模式,"100j" 向下選中100行,然后執(zhí)行 ":hardcopy" 打印這些行。當?
然,你可以用其它命令選中這100行。

如果你有一臺 PostScript 打印機,上面的方法也適合 Unix 系統(tǒng)。否則,你必須做一些額?
外的處理:你需要先把文件轉換成 HTML 類型,然后用 Netscape 之類的瀏覽器打印。

如下命令把當前文件轉換成 HTML 格式:

??????? :source $VIMRUNTIME/syntax/2html.vim

你發(fā)現(xiàn)它會嘎吱嘎吱執(zhí)行一陣子,(如果文件很大,這可能要花點時間)。之后,?
Vim 會打開一個新的窗口并顯示 HTML 代碼。現(xiàn)在把這個文件存下來(存在哪都不要緊,?
反正最后你要刪掉它的):

??????? :write main.c.html

用你喜歡的瀏覽器打開這個文件,并通過它打印這個文件。如果一切順利,這個輸出應?
該與 Vim 中顯示的一樣。要了解更詳細的信息,請參見 |2html.vim|。處理完后別忘?
了刪掉那個 HTML 文件。

除了打印,你還可以把這個 HTML 文件,放到 WEB 服務器上,讓其他人可以通過彩色?
文本閱讀。

總結

以上是生活随笔為你收集整理的vim 命令(全)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。