vim 命令(全)

本章提供足夠的信息使你用夠使用 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 操作系統中,你可以在任意命令提示符下輸入這個命令。如果你用的是 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 服務器上,讓其他人可以通過彩色 
文本閱讀。

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