本章提供足夠的信息使你用夠使用 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 服務器上,讓其他人可以通過彩色
文本閱讀。