vi常用命令全

本章提供足夠的信息使你用夠使用 Vim 來做基本的編輯。這裏提供的方法不一定是高效

快捷的。但起碼是有效的。花些時間去練習這些命令,這是後面的知識的基礎。

|02.1| 第一次運行 Vim

|02.2| 插入文本

|02.3| 移動光標

|02.4| 刪除字符

|02.5| 撤銷與重做

|02.6| 其它編輯命令

|02.7| 退出

|02.8| 尋求幫助

 

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

*02.1* 第一次運行 Vim

啓動 Vim 的命令如下:

        gvim file.txt

在 UNIX 操作系統中,你可以在任意命令提示符下輸入這個命令。如果你用的是 Microsoft

Windows, 啓動一個 MS-DOS 窗口,再輸入這個命令。

    無論哪一種方式,現在 Vim 開始編輯一個名爲 file.txt 的文件了。由於這是一個新建

文件,你會得到一個空的窗口。屏幕看起來會象下面這樣:

        +---------------------------------------+

        |#                                      |

        |~                                      |

        |~                                      |

        |~                                      |

        |~                                      |

        |"file.txt" [New file]                  |

        +---------------------------------------+

                ('#"是當前光標的位置)

以波紋線(~)開頭的行表示該行在文件中不存在。換句話說,如果 Vim 打開的文件不能充滿

這個顯示的屏幕,它就會顯示以波紋線開頭的行。在屏幕的底部,有一個消息行指示文件

名爲 file.txt 並且說明這是一個新建的文件。這行信息是臨時的,新的信息可以覆蓋它。

VIM 命 令

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

        vim file.txt

則編輯在命令窗口內進行。換句話說,如果你在 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> 鍵退出插入模式而

回到普通模式。現在在你的 Vim 窗口中就有兩行文字了:

        +---------------------------------------+

        |A very intelligent turtle              |

        |Found programming UNIX a hurdle        |

        |~                                      |

        |~                                      |

        |                                       |

        +---------------------------------------+

我 在 什 麼 模 式?

要看到你在什麼模式,輸入如下命令:

        :set showmode

你會發現當你敲入冒號後,Vim 把光標移到窗口的最後一行。那裏是你輸入“冒號命令”

(以冒號開頭的命令)的地方,敲入回車結束這個命令的輸入(所有的冒號命令都用

這種方式結束)。

    現在,如果你輸入 "i" 命令,Vim 會在窗口的底部顯示 --INSERT--(中文模式

顯示的是--插入-- —— 譯者注),這表示你在插入模式。

        +---------------------------------------+

        |A very intelligent turtle              |

        |Found programming UNIX a hurdle        |

        |~                                      |

        |~                                      |

        |-- INSERT --                           |

        +---------------------------------------+

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

解 決 問 題

Vim 新手常常遇到的一個問題是不知道自己在什麼模式下,可能是因爲忘了,也可能

是因爲不小心敲了一個切換模式的命令。無論你在什麼模式,要回到普通模式,只

要敲 <Esc> 就可以了。有時你需要敲兩次,如果 Vim 發出“嘀”一聲,就表示你已經

在普通模式了。

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

*02.3* 移動光標

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

        h       左                                              *hjkl*

        j       下

        k       上

        l       右

這些命令看起來是隨便選的。無論如何,誰聽說過用 l 表示右的?但實際上,作這些選擇

是有理由的:移動光標是最常用的編輯器命令。而這些鍵位是在你本位的右手。也就是說:

這種鍵位的設定使你可以以最快的速度執行移動操作(特別是當你用十指輸入的時候)。

        Note:

        你還可以用方向鍵移動光標,但這樣會減慢你輸入的速度,因爲你必須把你的手從

        字母鍵移動到方向鍵。想象一下,你在一個小時內可要這樣做幾百次,這可要花

        相當多的時間的。

            而且,有一些鍵盤是沒有方向鍵的,或者放在一些很特別的地方。所以,

        知道 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        |

        |~                                      |

        |~                                      |

        |                                       |

        +---------------------------------------+

現在你可以輸入新的字符了,例如,通過輸入:

        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* 撤銷與重做

假設現在你刪得太多了。當然,你可以重新輸入需要的內容。不過,你還有一個更簡單的

選擇。"u" 命令撤銷上一個編輯操作。看看下面這個操作:先用 "dd" 刪除一行,再敲

"u",該行又回來了。

    再給一個例子:把光標移到第一行的 A 上:

        A young intelligent turtle

現在輸入 xxxxxxx 刪除 "A young"。結果如下:

        intelligent turtle

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

        g intelligent turtle

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

        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 的模式,但是你必須

        小心本文中的一些小區別。

重 做

如果你撤銷得太多,你可以輸入CTRL-R(redo)回退前一個命令。換句話說,它撤銷

一個撤銷。要看執行的例子,輸入CTRL-R兩次。字符 A 和它後面的空格就出現了:

        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 命令你可以切換到任何你編輯過的狀態。

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

*02.6* 其它編輯命令

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

添 加

"i" 命令在光標所在字符前面插入字符。一般情況下,這就夠用了,但如果你剛好想在

行尾加東西怎麼辦?要解決這個問題,你需要在文本後插入字符。這通過 "a" (append)

命令實現。

    例如,要把如下行

        and that's not saying much for the turtle.

改爲

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

把光標移到行尾的句號上。然後輸入 "x" 刪除它。現在光標處於一行的尾部了,現在輸入

        a!!!<Esc>

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

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

開 始 一 個 新 行

"o" 命令在光標下方建立一個新的空行,並把 Vim 切換到插入模式。然後你可以在這個

新行內輸入文本了。

    假定你的光標在下面兩行中第一行的某個地方:

        A very intelligent turtle

        Found programming UNIX a hurdle

如果你現在用 "o" 命令並輸入新的文字:

        oThat liked using Vim<Esc>

結果會是:

        A very intelligent turtle

        That liked using Vim

        Found programming UNIX a hurdle

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

指 定 次 數

假定你想向上移動 9 行,你可以輸入 "kkkkkkkkk" 或者你可以輸入"9k"。實際上,

你可以在很多命令前面加一個數字。例如在這章的前面,你通過輸入 "a!!!<Esc>"

增加三個感嘆號。另一個方法是使用命令 "3a!<Esc>"。次數 3 要求把後面的命令

執行三次。同樣的,要刪除三個字符,可以使用 "3x"。次數總是放在要被處理多次

的命令的前面。

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

*02.7* 退出

使用 "ZZ" 命令可以退出。這個命令保存文件並退出。

        Note:

        與其他編輯器不一樣,Vim 不會自動建立一個備份文件。如果你輸入 "ZZ",

        你的修改立即生效並且不能恢復。你可以配置 Vim 讓它產生一個備份文件,

        參見|07.4|。

放 棄 修 改

有時你會做了一系列的修改才突然發現還不如編輯之前。不用擔心,Vim 有“放棄修改

並退出”的命令,那就是:

        :q!

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

這個命令執行的細節是:命令有三部分,包括冒號(:),它使 Vim 進入命令模式,

q 命令,它告訴 Vim 退出,而感嘆號是強制命令修飾符。

    這裏,強制命令修飾符是必要的,它強制性地要求 Vim 放棄修改並退出。如果你只是

輸入":q",Vim 會顯示一個錯誤信息並拒絕退出:

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

通過指定強制執行,你實際上在告訴 Vim:“我知道我所做的看起來很傻,但我長大了,

知道自己在做什麼。”

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

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

*02.8* 尋求幫助

所有你想知道的東西,都可以在 Vim 幫助文件中找到答案,隨便問!

    要獲得一般的幫助用這個命令:

        :help

你還可以用第一個功能鍵 <F1>。如果你的鍵盤上有一個 <Help> 鍵,可能也有效。

    如果你不指定主題,":help" 將命令顯示一個總攬的幫助窗口。Vim 的作者在幫助系

統方面使用了一個很聰明的方案(也許可以說是很懶惰的方案):他們用一個普通的編輯窗

口來顯示幫助。你可以在幫助窗口中使用任何普通的 Vim 命令移動光標。所以,h,j,k

和 l 還是表示左,下,上和右。

    要退出幫助窗口,用退出一個普通窗口的命令:"ZZ"。這隻會退出幫助窗口,而不會

退出 Vim。

當你閱讀幫助的時候,你會發現有一些文字被一對豎線括起來了(例如|help|)。這表示

一個超級鏈接。如果你把光標移到這兩個豎線之間並按 CTRL-](標籤跳轉命令), 幫助

系統會把你引向這個超級鏈接指向的主題。(由於不是本章的重點,這裏不詳細討論,

Vim 對超級鏈接的術語是 "標籤"(tag),所以 CTRL-] 實際是跳轉到光標所在單詞爲名

的標籤所在的位置。)

    跳轉幾次以後,你可能想回到原來的地方。CTRL-T(標籤退棧)把你送回前一個

跳轉點。CTRL-O (跳轉到前一個位置)也能完成相同的功能。

    在幫助屏幕的頂上,有一個符號: *help.txt*。這個名字被幫助系統用來定義一個標籤

(也就是超級鏈接的目標)。

    參見|29.1|可以瞭解更多關於標籤的內容。

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

        :help {主題}

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

        :help x

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

        :help deleting

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

        help index

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

加上前綴"CTRL-"。

        help CTRL-A

Vim 有很多模式。在默認情況下,幫助系統顯示普通模式的命令。例如,如下命令顯示

普通模式的 CTRL-H 命令的幫助:

        :help CTRL-H

要表示其他模式,可以使用模式前綴。如果你需要插入模式的命令幫助,使用 "i_" 前

綴。例如對於 CTRL-H,你可以用如下命令:

        :help i_CTRL-H

當你啓動 Vim,你可以使用一些命令行參數。這些參數以短橫線開頭(-)。例如知道要-t

這個參數是幹什麼用的,可以使用這個命令:

        :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" 命令。象大多數 Vim 命令一樣,你可以在命令前

加數字前綴表示把這個命令重複多次。例如,"3w" 表示向前移動3個單詞。用圖表示如下:

        This is a line with example text

          --->-->->----------------->

           w w w    3w

要注意的是,如果光標已經在一個單詞的詞首,"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                  $

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

    象大多數移動命令一樣,"$" 命令接受個次數前綴。但是 "移動到一行的行尾n次" 沒

有什麼意義,所以它會使光標移動到另一行。例如,"1$" 移動到當前行的行尾,而

"2$" 則移動到下一行的行尾,如此類推。

    "0" 命令不能加個數前綴,因爲 "0" 本身就是個數字。而且,出人意料地是,"^" 命

令也不支持數字前綴。

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

*03.3* 移動到一個指定的字符

單字符查找命令是最有用的移動命令之一。"fx" 命令向前查找本行中的字符 x。提示:

"f" 表示 "Find"。

    例如,假定你在下面例子行的行首,而你想移動到單詞 "human" 的h那裏。只要執行

命令 "fh" 即可:

        To err is human. To really foul up you need a computer.

        ---------->--------------->

            fh           fy

這個例子還演示了用 "fy" 命令移動到 "really" 的詞尾。

    你可以在這個命令前面加數字前綴,所以,你可以用 "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

這四個命令可以通過 ";" 命令重複,"," 命令則用於反向重複。無論用哪個命令,光標

永遠都不會移出當前行,哪怕是這兩行是連續的一個句子。

有時你啓動了一個查找命令後才發現自己執行了一個錯誤的命令。例如,你啓動了一個

"f" 命令後才發現你本來想用的是 "F"。要放棄這個查找,輸入 <Esc>。所以

"f<Esc>" 取消一個向前查找命令而不做任何操作。 Note: <Esc> 可以中止大部分命令,

而不僅僅是查找。

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

*03.4* 括號匹配

當你寫程序的時候,你經常會遇到嵌套的()結構。這時,"%" 是一個非常方便的命令

了:它能匹配一對括號。如果光標在 "(" 上,它移動到對應的 ")" 上,反之,如果它在

")" 上,它移動到 "(" 上。

                            %

                         <----->

                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 行?一個辦法是執行

"9999k" 命令移到文件頭,再執行 "32j" 下移到32行。這不是一個好辦法,但肯定有效。

更好的方法是使用 "G" 命令。加上一個次數前綴,這個命令可以把你送到指定的行。

例如,"33G" 把你送到 33 行。(要用更好的方法在編譯器的錯誤列表中移動,參見

|usr_30.txt| 的 ":make" 命令部分。)

    如果沒有數字前綴,"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

另一個定位行的方法是使用帶數字前綴的 "%" 命令。例如,"50%" 移動到文件的中間,

而 "90%" 移到差不多結尾的位置。

前面的描述假定你想移動到文件中的某一行,而不在乎它是否可見。那麼如何移動到視野

之內的一行呢?下圖演示了三個可以使用的命令:

                        +---------------------------+

                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' 選項已經被關閉):

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

    這裏顯示了你正在編輯的文件的名稱,你所處的當前行的行號,全文的總行數,光標

    以前的行佔全文的百分比,和你所處的列的列號。

    有時你會看到一個分開的兩個列號。例如,"col 2-9"。這表示光標處於第二個字符

    上,但由於使用了製表符,在屏幕上的位置是 9。

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

        :set number

    要重新關閉這個選項:

        :set nonumber

    由於'number'是一個布爾類型的選項,在它前面加上 "no" 表示關閉它。布爾選項只會

    有兩個值,on 或者 off。

      Vim 有很多選項,除了布爾類型的,還有數字或者字符串類型的。在用到的時候會給

    處一些例子的。

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" 命令實現。

        +------------------+             +------------------+

        | 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> 開始執行這個命令。

        Note:

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

        請參見下文。

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

        /#include

然後輸入 "n" 數次。你會移動到後面每一個 #include。如果你知道你想要的是第幾個,

可以在這個命令前面增加次數前綴。這樣,"3n" 表示移動到第三個匹配點。要注意,

"/" 不支持次數前綴。

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

        ?word

"N" 命令在反方向重複前一次查找。因此,在 "/" 命令後執行 "N" 命令是向後查找,

在 "?" 命令後執行 "N" 命令是向前查找。

忽 略 大 小 寫

通常,你必須區分大小寫地輸入你要查找的內容。但如果你不在乎大小寫。可以設置

'ignorecase' 選項:

        :set ignorecase

如果你現在要查找 "word",它將匹配 "word" 和 "WORD"。如果想再次區分大小寫:

        :set noignorecase

歷 史 記 錄

假設你執行了三個查找命令:

        /one

        /two

        /three

現在,讓我們輸入 "/" 啓動一次查找,但先不按下回車鍵。現在按 <Up>(上箭頭),Vim

把 "/three" 放到你的命令行上。回車就會從當前位置查找 "three"。如果你不回車,

繼續按 <Up>,Vim 轉而顯示 "/two",而下一次 <Up> 變成 "/one"。

    你還可以用 <Down> 命令在歷史記錄中反向查找。

如果你知道前面用過的一個模式以什麼開頭,而且你想再使用這個模式的話,可以在輸入

<Up> 前輸入這個開頭。繼續前面的例子,你可以輸入 "/o<Up>",Vim 就會在命令行上

顯示 "/one"。

冒號開頭的命令也有歷史記錄。這允許你取回前一個命令並再次執行。這兩種歷史記錄

是相互獨立的。

在 文 本 中 查 找 一 個 單 詞

假設你在文本中看到一個單詞 "TheLongFunctionName" 而你想找到下一個相同的單詞。

你可以輸入 "/TheLongFunctionName",但這要輸入很多東西。而且如果輸錯了,Vim

是不可能找到你要找的單詞的。

    有一個簡單的方法:把光標移到那個單詞下面使用 "*" 命令。Vim 會取得光標上

的單詞並把它作爲被查找的字符串。

    "#" 命令在反向完成相同的功能。你可以在命令前加一個次數:"3*" 查找光標下

單詞第三次出現的地方。

查 找 整 個 單 詞

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

        /the>

"\>" 是一個特殊的記號,表示只匹配單詞末尾。類似地,"\<" 只匹配單詞的開頭。

這樣,要匹配一個完整的單詞 "the",只需:

        /<the>

這不會匹配 "there" 或者 "soothe"。注意 "*" 和 "#" 命令也使用了 "詞首" 和 "詞尾"

標記來匹配整個單詞(要部分匹配,使用 "g*" 和 "g#")

高 亮 匹 配

當你編輯一個程序的時候,你看見一個變量叫 "nr"。你想查一下它在哪被用到了。你可以

把光標移到 "nr" 下用 "*" 命令,然後用 n 命令一個個遍歷。

    這裏還有一種辦法。輸入這個命令:

        :set hlsearch

現在如果你查找 "nr",Vim會高亮顯示所有匹配的地方。這是一個很好的確定變量在哪被使

用,而不需要輸入更多的命令的方法。

    要關掉這個功能:

        :set nohlsearch

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

命令:

        :nohlsearch

這不會復位 hlsearch 選項。它只是關閉高亮顯示。當你執行下一次查找的時候,高亮功能

會被再次激活。使用 "n" 和 "N" 命令時也一樣。

調 節 查 找 方 式

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

        :set incsearch

這個命令使 Vim 在你輸入字符串的過程中就顯示匹配點。用這個可以檢查正確的地方是否已經

被找到了。然後輸入 <Enter> 跳到那個地方。或者繼續輸入更多的字符改變要被查找的字符串。

        :set nowrapscan

這個選項在找到文件結尾後停止查找。或者當你往回查找的時候遇到文件開頭停止查找。默認

情況下 'wrapscan' 的狀態是 "on"。所以在找到文件尾的時候會自動折返。

插 曲

如果你喜歡前面的選項,而且每次用 Vim 都要設置它,那麼,你可以把這些命令寫到

Vim 的啓動文件中。

    編輯 |not-compatible| 中提到的文件,或者用如下命令確定這個文件在什麼地方:

        :scriptnames

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

        :edit ~/.vimrc

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

        Go:set hlsearch<Esc>

"G" 移動到文件的結尾,"o" 開始一個新行,然後你在那裏輸入 ":set" 命令。

最後你用 <Esc> 結束插入模式。然後用如下命令存盤:

        ZZ

現在如果你重新啓動 Vim,'hlsearch' 選項就已經被設置了。

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

*03.9* 簡單的查找模式

Vim 用正則表達式來定義要查找的對象。正則表達式是一種非常強大和緊湊的定義查找模式

的方法。但是非常不幸,這種強大的功能是有代價的,因爲使用它需要掌握一些技巧。

    本章我們只介紹一些基本的正則表達式。要了解更多的關於查找模式和命令,請參考

|usr_27.txt|。你還可以在|pattern|中找到正則表達式的完整描述。

行 首 與 行 尾

^字符匹配行首。在美式英文鍵盤上,它在數字鍵 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 會記住你從什麼地方跳過去的。這個位置成爲一個

標記,要回到原來的地方,使用如下命令:

        ``

` 用單引號 ' 也可以。

   如果再次執行這個命令你會跳回去原來的地方,這是因爲 ` 記住了自己跳轉前的位置。

通常,每次你執行一個會將光標移動到本行之外的命令,這種移動即被稱爲一個 "跳轉"。

這包括查找命令 "/" 和 "n"(無論跳轉到多遠的地方)。但不包括 "fx" 和 "tx" 這些

行內查找命令或者 "w" 和 "e" 等詞移動命令。

    另外 "j" 和 "k" 不會被當做是一次 "跳轉",即使你在前面加上個數前綴也不例外。

``命令可以在兩個位置上跳來跳去。而 CTRL-O 命令則跳到一個 "較老" 的地方(提示:O

表示older)。CTRL-I 則跳到一個 "較新" 的地方(提示:I在鍵盤上緊靠着O)。考慮一下

如下命令序列:

        33G

        /^The

        CTRL-O

你首先跳到第 33 行,然後查找以 "The" 開頭的一行,然後用 CTRL-O 你會跳回到 33 行。

再執行 CTRL-O 你會跳到最初的地方。現在你使用 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 命令是不同的,

後者是移到標記所在行上被標記的列。

標記在需要處理一個文件的兩個相關地方的時候非常有用。假設你在處理文末的時候需要

查看文首的一些內容,先移動到行首,設置一個標記 s (start):

        ms

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

        me

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

        '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* 操作符與動作

在第二章你已經學過使用 "x" 命令來刪除一個字符以及通過個數前綴,例如 "4x" 去刪

除多個字符。

    "dw" 命令刪除一個單詞。你可能認出來了,"w" 是詞移動命令。實際上,"d" 命

令後面可以跟任何 "動作"(motion)命令,它會刪除從當前位置到光標移動到的目標

位置的的全部內容。

    例如 "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"。這種方法使你

可以在任何你能越過的文本上執行各種操作。

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

*04.2* 修改文本

另一個操作符命令是 "c",表示修改,change。它的作用方式與 "d" 操作符相似,只

是完成後會切換到插入模式。例如,"cw" 修改一個詞,更精確的說,它刪除一個詞,

並切換到插入模式。

        To err is human

           ------->

             c2wbe<Esc>

        To be human

這裏 "c2wbe<Esc>" 包括如下操作:

        c       修改操作符

        2w      移動兩個單詞的距離(與操作符合起來,它刪除兩個單詞並進入插入模式)

        be      插入 be 這個單詞

        <Esc>   切換回普通模式

如果你留意,你會發現一個奇怪的地方:human 前面的空格沒有被刪除。有一句諺語說道:

任何問題都有一個簡單,清楚而錯誤的回答。"cw" 命令就屬於這種情況。c 操作符在很

多地方都和 d 一樣,但有一個例外,"cw"。它實際上象 "ce" 一樣,刪除到單詞尾。這

樣單詞後面的空格就不包括在內了。這要追溯到使用 Vi 的舊日子。由於很多人已經習慣

這種方式了,這個例外就留在 Vim 裏了。

更 多 的 修 改 命 令

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

空格)。

"d$" 刪除到行尾;"c$" 則修改到行尾。這就象先用 "d$" 刪除一行再用 "a" 啓動

插入模式並加入新的文字。

快 捷 鍵

有些 "操作符-動作" 命令由於經常被使用,所以被設置爲單字符命令:

        x 表示 dl (刪除當前光標下的字符)

        X 表示 dh (刪除光標左邊的字符)

        D 表示 d$ (刪除到行尾)

        C 表示 c$ (修改到行尾)

        s 表示 cl (修改一個字符)

        S 表示 cc (修改一整行)

在 什 麼 地 方 加 入 個 數 前綴

命令 "3dw" 和 "d3w" 都是刪除3個單詞。如果你非要尋根問底,那麼:"3dw" 表示

刪除一個單詞3次,而 "d3w" 表示刪除三個單詞一次。這是一個沒有分別的分別。

實際上你可以放兩個次數前綴,例如,"3d2w" 刪除兩個單詞三次,共計六個單詞。

替 換 單 個 字 符

"r" 命令不是操作符。它只是等你輸入一個字符然後用這個字符替換當前光標上的字

符。你可以用 "cl" 命令或者 "s" 命令完成相同的功能,但 "r" 命令不需要使用<Esc>

退出插入狀態:

        there is somerhing grong here

        rT           rt    rw

        There is something wrong here

通過個數前綴,"r" 命令可以使多個字符被同一個字符替換,例如:

        There is something wrong here

                           5rx

        There is something xxxxx here

要用換行符替換一個字符可以用命令 "r<Enter>"。這會刪除一個字符並插入一個換行

符。在這裏使用個數前綴會刪除多個字符但只插入一個換行符:"4r<Enter>" 用一個

換行符替換四個字符。

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

*04.3* 重複一個修改

"." 是 Vim 中一個非常簡單而有用的命令。它重複最後一次的修改操作。例如,假設你在

編輯一個 HTML 文件,你想刪除所有的 <B> 標記。你把光標移到第一個 "<" 上,然後用

"df>" 命令刪除 <B>。然後你就可以移到 </B> 的 < 上面用 "." 命令刪除它。"." 命令

執行最後一次的修改命令(在本例中,就是 "df>")。要刪除下一個 <B> 標記,移動到下

一個 < 的位置,再執行 "." 命令即可。

                              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" 命令啓動可視模式。你可以移動光標到需要的地方。當你這樣做的時候,

中間的文本會被高亮顯示。最後執行一下 "操作符" 命令即可。

    例如,要從一個單詞的一半刪除到下一個單詞的一半:

                This is an examination sample of visual mode

                               ---------->

                                 velllld

                This is an example of visual mode

但你這樣做的時候,你不需要真的算要按l多少次,你可以在按 "d" 前清楚得看到哪些東西

將要被刪除的文本。

如果任何時候你改了注意,只用按一下 <Esc> 就能退出可視模式。

按 行 選 擇

如果你想對行做操作,可以使用 "V" 命令來啓動可視模式。你會發現在你作任何移動之

前,整行都被高亮顯示了。左右移動不會有任何效果。而通過上下移動,你可以一次選擇多行。

    例如,用 "Vjj" 可以選中三行:

                          +------------------------+

                          | text more text         |

                       >> | more text more text    | |

        selected lines >> | text text text         | | Vjj

                       >> | text more              | V

                          | more text more         |

                          +------------------------+

塊 選 擇

如果你要處理一個矩形塊內的文本,可以使用 CTRL-V 啓動可視模式。這在處理表格時

非常有用。

                name            Q1      Q2      Q3

                pierre          123     455     234

                john            0       90      39

                steve           392     63      334

要刪除中間 "Q2" 這一欄,把光標移動到 "Q2" 的 "Q" 上面。按 CTRL-V 啓動塊可視模式。

現在用 "3j" 向下移動三行,然後用 "w" 移到下一個單詞。你可以看到最後一欄的第一

個字符也被包括進來了。要去掉它,用 "h" 命令即可。現在按 "d",中間一欄就被刪除了。

移 動 到 另 一 端

如果你在可視模式下選中了一些文字,然後你又發現你需要改變被選擇的文字的另一端,

用 "o" 命令即可(提示:"o" 表示 other end),光標會移動到被選中文字的另一端,

現在你可以移動光標去改變選中文字的開始點了。再按 "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" 會把它

插入到光標前面。

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

"p" 和 "P" 命令接受個數前綴,被插入的文本就會被插入指定的次數。所以 "dd" 後

加一個 "3p" 會把刪除行的三個拷貝插入到文本中。

交 換 兩 個 字 符

經常發生這樣的情況,當你輸入字符的時候,你的手指比你的腦子轉得快(或者相反?)。

這樣的結果是你經常把 "the" 敲成 "teh"。Vim 讓你可以很容易得修正這種錯誤。只要把

光標移到 "teh" 的 "e" 上,然後執行 "xp" 即可。這個工作過程是:"x" 刪除一個字符,

保存到寄存器。"p" 把這個被保存的字符插入到光標的後面,也就是 "h" 的後面了。

        teh     th     the

         x       p

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

*04.6* 拷貝文本

要把文本從一個地方拷貝到另一個地方,你可以先刪除它,然後用 "u" 命令恢復,再用

"p" 拷到另一個地方。這裏還有一種簡單的辦法:抽出 (yank)。"y" 命令可以把文字拷

貝到寄存器中。然後用 "p" 命令粘貼到別處。

    Yanking 是 Vim 中拷貝命令的名字。由於 "c" 已經被用於表示change了,所以拷貝

(copy)就不能再用 "c" 了。但 "y" 還是可用的。把這個命令稱爲 "yanking" 是爲了

更容易記住 "y" 這個鍵。(譯者注:這裏只是把原文譯出以作參考,"抽出" 文本畢竟是

不妥的。後文中將統一使用 "拷貝"。中文可不存在 change 和 copy 的問題。)

由於 "y" 是一個操作符,所以 "yw" 命令就是拷貝一個單詞了。當然了,個數前綴也是

有效的。要拷貝兩個單詞,就可以用 "y2w"。例如:

        let sqr = LongVariable *

                 -------------->

                       y2w

        let sqr = LongVariable *

                               p

        let sqr = LongVariable * LongVariable

注意:"yw" 命令包括單詞後面的空白字符。如果你不想要這個字符,改用 "ye" 命令。

"yy" 命令拷貝一整行,就像 "dd" 刪除一整行一樣。出乎意料地是,"D" 刪除到行尾而

"Y" 卻是拷貝一整行。要注意這個區別!"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 菜單。現在被選中的文本被拷進了剪貼

板。你可以把它粘貼到其它程序,或者在 Vim 內部使用。

如果你已經從其它程序中拷貝了一些文字到剪貼板,你可以在 Vim 中用 Edit/Paste 菜單

粘貼進來,這在普通模式和插入模式中都是有效的。如果在可視模式,被選中的文字會被

替換掉。

"Cut" 菜單項會在把文字拷進剪貼板前刪除它。"Copy","Cut" 和 "Paste" 命令在彈出

菜單中也有(當然了,前提是有彈出式菜單)。如果你的 Vim 有工具條,在工具條上

也能找到這些命令。

如果你用的不是 GUI,或者你根本不喜歡用菜單,你只能用其它辦法了。你還是可以用普通

的 "y"(yank)和 "p"(put)命令,但在前面必須加上 "*(一個雙引號加一個星號)。

例如,要拷貝一行到剪貼板中:

        "*yy

要粘貼回來:

        "*p

這僅在支持剪貼板的 Vim 版本中才能工作。關於剪貼板的更多內容請參見 |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 中執行修改的第三種方法。我們已經有 "操作符-動作" 和可視模式

兩種方法了。現在我們又有了 "操作符-文本對象"。

    這種方法與 "操作符-動作" 很相似,但它不是操作於從當前位置到移動目標間的內容,

而是對光標所在位置的 "文本對象" 進行操作。文本對象是作爲一個整體來處理的。現在光

標在對象中的位置無關緊要。

用 "cis" 可以改變一個句子。看下面的句子:

        Hello there. This

        is an example. Just

        some text.

移動到第二行的開始處。現在使用 "cis":

        Hello there.    Just

        some text.

現在你輸入新的句子 "Another line.":

        Hello there. Another line. Just

        some text.

"cis" 包括 "c"(change,修改)操作符和 "is" 文本對象。這表示 "Inner

Sentence"(譯者注:實在很難用中文表示這個意思了,各位還是記英文名吧)。還有

一個文本對象是 "as",區別是 "as" 包括句子後面的空白字符而 "is" 不包括。如果

你要刪除一個句子,而且你還想同時刪除句子後面空白字符,就用 "das";如果你想保

留空白字符而替換一個句子,則使用"cis"。

你還可以在可視模式下使用文本對象。這樣會選中一個文本對象,而且繼續留可視模式,

你可以繼續多次執行文本對象命令。例如,先用 "v" 啓動可視模式,再用 "as"

就可以選中一個句子。現在重複執行 "as",就會繼續選中更多的句子。最後你可以使用

一個操作符去處理這些被選中的句子。

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

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

*04.9* 替換模式

"R" 命令啓動替換模式。在這個模式下,你輸入的每個字符都會覆蓋當前光標上的字符。

這會一直持續下去,直到你輸入<Esc>。

    在下面的例子中,你在 "text" 的第一個 "t" 上啓動替換模式:

        This is text.

                Rinteresting.<Esc>

        This is interesting.

你可能會注意到,這是用十二個字符替換一行中的五個字符。如果超出行的範圍,"R" 命

令自動進行行擴展,而不是替換到下一行。

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

但當你使用 <BS>(退格鍵)進行修正時,你會發現原來被替換的字符又回來了。這就好像

一個 "撤消" 命令一樣。

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

*04.10* 結論

操作符,移動命令和文本對象可以有各種組合。現在你已經知道它是怎麼工作了,你可以

用 N 個操作符加上 M 個移動命令,組合出 N*M 個命令!

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

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

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 文件

可能你已經厭倦了輸入那些經常用到的命令了。要讓 Vim 用你習慣的設置啓動,你可以

把這些設置寫到一個叫 vimrc 的文件中。Vim 會在啓動的時候讀入這個文件。

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

        :scriptnames

命令列出的文件列表開頭的幾個中應該有一個叫 ".vimrc" 或者 "_vimrc" 的文件在你的

home 目錄中。

    如果你還沒有 vimrc,請參考 |vimrc| 一節看看你應該在什麼地方創建 vimrc 文件。

另外 ":version" 命令能告訴你 vim 在什麼地方找 "用戶的 vimrc 文件"。

對於 Unix 系統,肯定是如下文件:

        ~/.vimrc

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

        $HOME/_vimrc

        $VIM/_vimrc

vimrc 文件可以包含任何冒號命令。最簡單的是設置選項命令。例如,如果你想 Vim 啓動

的時候始終開啓 'incsearch' 選項,可以在你的 vimrc 文件中加上:

        set incsearch

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

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

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

*05.2* vimrc 示例解釋

在第一章中,我們曾經介紹過怎樣用 vimrc 示例文件(包括在 Vim 發佈中)使 Vim 以非

vi 兼容模式啓動(參見|not-compatible|)。這個文件可以在這裏找到:

        $VIMRUNTIME/vimrc_example.vim

我們在這一節中介紹這個文件中用到的一些命令。這會對你自行參數設置有一定的幫助。

但我們不會介紹所有的內容。你需要用 ":help" 獲得更多的幫助。

        set nocompatible

如第一章所述,這個命令人爲地告訴 Vim 工作在 vi 增強模式,因此與 Vi 不完全兼容。

要關閉 'compatible' 選項設,'nocompatible' 可以用於完成這個功能。

        set backspace=indent,eol,start

這指明在插入模式下 <BS> 如何刪除光標前面的字符。逗號分隔的三個值分別指:行首的

空白字符,分行符和插入模式開始處之前的字符。

        set autoindent

這使 Vim 在啓動一個新行的時候使用與前一行一樣的縮進。就是說,新行前面會有同樣

多的空白字符。啓動新行是指用 <Enter> 換行,在普通模式下執行 "o" 命令等情況。

        if has("vms")

          set nobackup

        else

          set backup

        endif

這告訴 Vim 當覆蓋一個文件的時候保留一個備份。但 VMS 系統除外,因爲 VMS 系統會

自動產生備份文件。備份文件的名稱是在原來的文件名上加上 "~" 字符。參見 |07.4|

        set history=50

這個命令保存 50 個命令和 50 個查找模式的歷史。如果你想 Vim 記住多些或者少些

命令,可以把這個數改成其它值。

        set ruler

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

        set showcmd

在 Vim 窗口右下角,標尺的右邊顯示未完成的命令。例如,當你輸入 "2f",Vim 在等

你輸入要查找的字符並且顯示 "2f"。當你再輸入w,"2fw" 命令被執行,"2f" 自動消

失。

        +-------------------------------------------------+

        |text in the Vim window                           |

        |~                                                |

        |~                                                |

        |-- VISUAL --                   2f     43,8   17% |

        +-------------------------------------------------+

         ^^^^^^^^^^^                  ^^^^^^^^ ^^^^^^^^^^

          'showmode'                 'showcmd' 'ruler'

        set incsearch

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

        map Q gq

這定義一個鍵映射。下一節會介紹更多的相關內容。這將定義 "Q" 命令用來完成與 "gq"

操作符相同的功能,這是在 Vim 5.0 版前 "Q" 命令的作用。如果沒有設置這個映射,

"Q" 會啓動 Ex 模式,這也許不是你想要的情況。

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

這是一個複雜映射。這裏不介紹它是怎麼工作的。它的作用是使 "p" 命令在可視模式下

用拷貝的字符覆蓋被選中的字符。你可以看到映射可以被用來執行相當複雜的操作。但其

本質依然是一個命令序列而已,與你直接輸入沒有什麼兩樣。

        if &t_Co > 2 || has("gui_running")

          syntax on

          set hlsearch

        endif

這激活語法加亮功能,但僅在顏色功能有效的時候纔有效。而 'hlsearch' 選項告訴

Vim 加亮上次查找模式匹配的地方。"if" 命令在設置選項的時候非常有用,它使設置

命令在某些條件下才執行。更多的內容請參見|usr_41.txt|。

                                                        *vimrc-filetype*

        filetype plugin indent on

這啓動三個非常靈巧的機制:

1. 文件類型探測

    當你開始編輯一個文件的時候,Vim 會試圖確定這個文件的類型。當你編輯 "main.c"

    時,Vim 會根據擴展名 ".c" 認爲這是一個 C 源文件。當你編輯一個文件前面是

    "#!/bin/sh" 的文件時,Vim 會把它認作 "sh" 文件。文件類型探測用於語法加亮

    和以下另兩項。請參見|filetypes|。

2. 使用文件類型相關的插件

    不同的文件需要不同的選項支持。例如,當你編輯一個 "c" 文件,用 'cindent'

    選項來自動縮進就非常有用。這些文件類型相關的選項在 Vim 中是通過文件類型

    插件來實現的。你也可以加入自己的插件,請參見 |write-filetype-plugin|。

3. 使用縮進文件

    當編輯程序的時候,行縮進通常可以被自動決定。Vim 用不同的策略處理不同的

    文件類型。請參見 |:filetype-indent-on| 和 'indentexpr'。

        autocmd FileType text setlocal textwidth=78

這使 Vim 在一行長於 78 個字符的時候自動換行,但僅對純文本文件中有效。這裏包括

兩個部分。其中 "autocmd FileType text" 定義個自動命令,表示當文件類型被設置爲

"text" 的時候,後面的命令自動執行。"setlocal textwidth=78" 設置 'textwidth'

選項爲78,但僅對本文件有效。

        autocmd BufReadPost *

             if line("'\"") > 0 && line("'\"") <= line("$") |

               exe "normal g`\"" |

             endif

這是又一個自動命令。這回它設置爲在讀入任何文件之後自動執行。後面那堆複雜的東

西檢查 '" 標記是否已被定義,如果是,則跳轉到該標記。行首的反斜槓用於把所有語句

連接成一行。這可以避免一行寫得太長,請參見 |line-continuation|。這隻在 Vim

腳本文件中有效,在命令行中無效。

*05.3* 簡單鍵盤映射

映射可以使你把一系列 Vim 命令綁定爲一個單鍵。假設你要用一個大括號將一個特定的

單詞括起來。例如,把 "amount" 變成 "{amount}"。用 ":map" 命令,就可以讓 F5 來

完成這個工作。命令如下:

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

        Note:

        在輸入這個命令時,<F5> 要用四個字符表示。相似地,輸入 <Esc> 不是直接按

        <Esc> 鍵,而是輸入五個字符。在讀這份手冊要注意這些區別!

讓我們來分解一下這個命令:

    <F5>        F5 功能鍵。這是命令的觸發器。當這個鍵被按下時,相應的命令即被

                執行。

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

    e           移動到詞尾。

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

執行 ":map" 命令後,要在單詞兩端加上 {},只需要移到單詞上的第一個字符並按 F5。

在這個例子中,觸發器是一個單鍵;它還可以是任何字符串。但若你使用一個已經存在

的 Vim 命令,該命令將不在有效。所以你最好避免出現這種情況。

    一個可用於映射的鍵是反斜槓。因爲你很可能想定義多個映射,那就加上另一個字符。

你可以映射 "\p" 爲在單詞兩端加園括號,而映射 "\c" 爲加花括號,例如:

        :map \p i(<Esc>ea)<Esc>

        :map \c i{<Esc>ea}<Esc>

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

":map" 命令(無參數)列出當前已定義的映射,至少會包括普通模式下的那些。更多的內

容參見 |40.1|。

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

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

Vim 可以通過插件增強功能。插件其實是一個當 Vim 啓動的時候能被自動執行的腳本。

簡單地把插件放到你 Vim 的 plugin 目錄中就可以使它生效。

(這個功能在 |+eval| 被編譯進 Vim 中時纔有效)

Vim 中有兩種插件:

       全局插件:用於所有類型的文件

   文件類型插件:僅用於特定類型的文件

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

全 局 插 件                                             *standard-plugin*

當你啓動 Vim,它會自動加載一些插件。你不需要爲此做任何事。這些插件增加一些

很多人想用的,但由 Vim 腳本實現而非編譯進 Vim 中的功能。你可以在幫助索引中

找到這些插件:|standard-plugin-list|。還可以參照 |load-plugin|。

                                                        *add-global-plugin*

你可以加入一個全局插件使得某些功能在你每次使用 Vim 時都被開啓。添加一個全局

插件只要兩步:

1. 獲得一個插件的拷貝

2. 把它塞進合適的目錄

獲 得 一 個 全 局 插 件

在什麼地方可以找到插件?

- 有一些與 Vim 一起發佈,你可以在 $VIMRUNTIME/macros 目錄或其子目錄中找到。

- 從網上下載,查一下這個地方:[url]http://vim.sf.net。[/url]

- 在 Vim 的郵件列表中找:|maillist|。

- 自己寫一個,參見|write-plugin|。

使 用 一 個 全 局 插 件

首先閱讀插件包括的說明文字,看看有沒有什麼特殊的限制。然後拷貝到你的插件

目錄:

        系統            插件目錄

        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 系統爲例(假設你還沒有 plugin 目錄):

        mkdir ~/.vim

        mkdir ~/.vim/plugin

        cp /usr/local/share/vim/vim60/macros/justify.vim ~/.vim/plugin

就是這樣了!現在你可以用這個插件定義的命令調整文字了。

文件類型插件                     *add-filetype-plugin* *ftplugins*

Vim 的發佈中包括一套針對不同文件類型的插件。你可以用如下命令啓用它們:

        :filetype plugin on

這樣就行了! 參閱 |vimrc-filetype|。

如果你缺少某種文件類型的插件,或者你找到一個更好的,你可以自行添加一個。這也

只需兩步:

1. 獲取一個插件的拷貝

2. 塞到合適的目錄。

取 得 文 件 類 型 插 件

你可以在找全局插件的相同地方找到文件類型插件。注意一下插件有沒有註明文件

類型,據此你可以知道這個插件是全局的還是文件類型相關的。在 $VIMRUNTIME/macros

中的是全局插件;文件類型插件在 $VIMRUNTIME/ftplugin 中。

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

你可以通過把插件文件放到合適的目錄中來增加一個插件。目錄的名字與前面提過的全局

插件的位置一樣,但最後一級目錄是 "ftplugin"。假設你找到一個用於 "stuff" 文

件類型的插件,而且你的系統是Unix。那麼,你可以把這個文件用如下命令移入ftplugin

目錄:

        mv thefile ~/.vim/ftplugin/stuff.vim

如果這個文件已經存在,你可以檢查一下兩個插件有沒有衝突。如果沒有,你可以用另

一個名字:

        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> 部分是相應文件類型的名稱。只有對應文件類型的文件纔會用這個

插件內的設置。插件的 <name> 部分則不重要,你可以對同一個文件類型使用多個插件。

Note 插件必須以 ".vim" 結尾。

深入參考讀物:

|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 內完成這個工作,以便利用$VIMRUNTIME。(如果某些目錄已經存在

你可以省略一些 "mkdir" 命令)

        :!mkdir ~/.vim

        :!mkdir ~/.vim/plugin

        :!cp $VIMRUNTIME/macros/matchit.vim ~/.vim/plugin

現在在某個 'runtimepath' 目錄中建立一個 doc 目錄。

        :!mkdir ~/.vim/doc

再把幫助文件拷貝進去:

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

現在開始玩技巧了,怎樣使 Vim 允許你跳轉到新的主題上?用 |:helptags| 命令產生

一個本地的tags文件即可:

        :helptags ~/.vim/doc

現在,你可以用這個命令

        :help g%

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

        :help local-additions

本地幫助的標題行被自動的加入到該節了。在那裏你可以看到 Vim 添加了那些本地的

幫助文件。你還可以從這裏跳轉到新的幫助中。

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

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

*05.6* 選項窗口

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

令:

        :options

這會打開一個新窗口,其中給出一個選項的列表,並對每個選項提供一行解釋。這些選項

被根據種類分組。把光標移到一個主題上然後按回車就可以跳轉到那裏。再按一下回車或

者 CTRL-O 就可以跳回來。

你可以通過這個窗口改變一個選項的值。例如,移到 "displaying text" 主題。然後把

光標下移到這一行:

        set wrap        nowrap

當你在上面鍵入回車,這行會改變爲:

        set nowrap      wrap

現在,這個選項被關閉了。

這行的上面是對這個選項的簡要描述。將光標向上移動一行,然後按 <Enter>,你可以

跳轉到 'wrap' 的完整幫助,再用 CTRL-O 可以跳回來。

對於那些值爲數字或者字符串的選項,你可以編輯它的值,然後按 <Enter> 來啓用該

值。例如,把光標移動到下面這行:

        set so=0

用 $ 移到行尾,再用 "r5" 命令修改爲五,然後按 <Enter> 使修改生效。現在如果你

移動一下光標,你會發現在你的光標移到窗口邊界前,你的文字就開始滾動了。這就是

選項 '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

現在 TAB 鍵顯示爲 ^I,而 $顯示在每行的結尾,以便你能找到可能會被你忽略的空白

字符在哪裏。

    這樣做的一個缺點是在有很多 TAB 的時候看起來很醜。如果你使用一個有顏色的

終端,或者使用 GUI 模式,Vim 可以用高亮顯示空格和TAB。 使用 'listchars' 選項:

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

現在,TAB會被顯示成 ">---" 而行尾多餘的空白字符顯示成 "-"。看起來好多了,是

吧?

關 鍵 字

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

        :set iskeyword

<        iskeyword=@,48-57,_,192-255

"@" 表示所有字母。"48-57" 表示 ASCII 字符 48-57 ,即數字 0 到 9。"192-255"

是可打印的拉丁字符。

    有時你希望橫線也是關鍵字,以便 "w" 命令會把 "upper-case" 看作是一個單詞。

你可以這樣做:

        :set iskeyword+=-

        :set iskeyword

        iskeyword=@,48-57,_,192-255,-

看一下新的值,你會發現 Vim 自動在 "-" 前面加了一個逗號。

    要從中去掉一個字符用 "-="。例如要排除下劃線:

        :set iskeyword-=_

        :set iskeyword

        iskeyword=@,48-57,192-255,-

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

顯 示 消 息 的 空 間

當 Vim 啓動的時候,在屏幕底部有一行被用於顯示消息。當消息很長的時候,多餘的部分

會被截斷。這樣你只能看到一部分。或者文字自動滾動,你要按 <Enter> 來繼續。你可以

給 'cmdheight' 選項賦一個值,用來設定顯示消息所用的行數。例如:

        :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

大多數情況下,這會讓你的文件帶上顏色。Vim 會自動檢測文件的類型,並調用合適的

語法加亮。一下子註釋變成藍色,關鍵字變成褐色,而字符串變成紅色了。這使你可以

很容易瀏覽整個文檔。很快你就會發現,黑白的文本真的會降低你的效率!

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

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

        if &t_Co > 1

          syntax enable

        endif

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

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

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

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

- 你的終端不支持彩色。

        這種情況下,Vim 會用粗體,斜體和下劃線區分不同文字,但這不好看。你可能

        會希望找一個支持彩色的終端。對於 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|,這樣,

        在你每次編輯它的時候都執行語法加亮。例如,下面這一行可以用

        於 Makefile(把它放在接近文首和文末的地方)

                # vim: syntax=make

        你可能知道怎麼檢測自己的文件類型,通常是文件的擴展名(就是點後面的

        內容)參見 |new-filetype| 可以知道如何告訴 Vim 如何檢查一種文件類型。

- 你的文件類型沒有語法高亮定義

        你可以找一個相似的文件類型並人工設置爲那種類型。如果你覺得不好,你可以

        自己寫一個,參見 |mysyntaxfile|。

或者顏色是錯的:

- 彩色的文字難以辨認

        Vim 自動猜測你使用的背景色。如果是黑的(或者其它深色的色彩),它會

        用淺色作爲前景色。如果是白的(或者其它淺色),它會使用深色作爲前景

        色。如果 Vim 猜錯了,文字就很難認了。要解決這個問題,設置一下

        'background' 選項。對於深色:

                :set background=dark

        而對於淺色:

                :set background=light

       這兩個命令必須在 ":syntax enable" 命令前調用,否則不起作用。如果要在

       這之後設置背景,可以再調用一下 ":syntax reset"。

- 在自下往上滾屏的過程中顏色顯示不對。

        Vim 在分析文本的時候不對整個文件進行處理,它只分析你要顯示的部分。這

        樣能省不少時間,但也會因此帶來錯誤。一個簡單的修正方法是敲 CTRL-L。

        或者往回滾動一下再回來。要徹底解決這個問題,請參見 |:syn-sync|。有些

        語法定義文件有辦法自己找到前面的內容,這可以參見相應的語法定義文件。

        例如,|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

中,每個被打開的文件對應一個緩衝,後面的章節中你會接觸到這方面的內容)。要在當

前緩衝中使用加亮,需要設置'syntax'選項:

        :set syntax=ON

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

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

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

        :hardcopy

這個命令會啓動一個常見的打印對話框,你可以通過它選擇打印機並作一些必要的設置。

如果你使用的是彩色打印機,那麼打印出來的色彩將與你在 Vim 中看到的一樣。但如果

你使用的是深色的背景,它的顏色會被適當調整,以便在白色地打印紙上看起來比較舒

服。

下面幾個選項可以改變 Vim 的打印行爲:

        'printdevice'

        'printheader'

        'printfont'

        'printoptions'

要僅打印一定範圍內的行,可以用可視模式選擇需要打印的行在執行打印命令,例如:

        v100j:hardcopy

"v" 啓動可視模式,"100j" 向下選中100行,然後執行 ":hardcopy" 打印這些行。當

然,你可以用其它命令選中這100行。

如果你有一臺 PostScript 打印機,上面的方法也適合 Unix 系統。否則,你必須做一些額

外的處理:你需要先把文件轉換成 HTML 類型,然後用 Netscape 之類的瀏覽器打印。

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

        :source $VIMRUNTIME/syntax/2html.vim

你發現它會嘎吱嘎吱執行一陣子,(如果文件很大,這可能要花點時間)。之後,

Vim 會打開一個新的窗口並顯示 HTML 代碼。現在把這個文件存下來(存在哪都不要緊,

反正最後你要刪掉它的):

        :write main.c.html

用你喜歡的瀏覽器打開這個文件,並通過它打印這個文件。如果一切順利,這個輸出應

該與 Vim 中顯示的一樣。要了解更詳細的信息,請參見 |2html.vim|。處理完後別忘

了刪掉那個 HTML 文件。

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

文本閱讀。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章