在 vi 的 comand mode 中控制游標位置的指令,可分為兩種。一種稱為游標移動指令,在之前中已提過【 h 】、【 j 】、【 k 】、【 l 】,【 H 】、【 M 】、【 L 】、【 G 】或 n【 G 】、【 Ctrl-F 】及【 Ctrl-B 】。此外仍有【 Ctrl-U 】及【 Ctrl-D 】,分別是向上和下移若干列﹝標準設定為 12 列,大約半個螢幕﹞。 以上的移動指令都可以跟在一個正整數 n 之後。對【 h 】,【 j 】,【 l 】,及【 Ctrl-F 】,【 Ctrl-B 】而言,都表示下那個移動指令 n 次。對【 M 】 沒有影響。對【 H 】 表示移到此螢幕上的第 n 列,對【 L 】 表示移到此螢幕的倒數第 n 列。對【 Ctrl-U 】及【 Ctrl-D 】分別表示往上或往下卷 n 列,而且 vi 會記住此 n,以後當你按【 Ctrl-U 】及【 Ctrl-D 】時,會向上或向下捲動 n 列。
另一種控制游標位置的指令稱為巡弋指令。在之前介紹了【 w 】、【 b 】、【 e 】、【 0 】、【 $ 】、【 / 】。此時『字』的定義是符合直覺的英文字或數字,以空格,tab,或標點符號相隔者。例如
let us compute sin(2x+1), ok? 連續按【 w 】游標會停在 l、u、c、s、l 、(、2、+、1、)、o 和 ? 等處。另一組指令【 W 】,【 B 】 及【 E 】 的作用與其對應的小寫指令相同,只是『字』的定義變了。 此時任意字串,只要以空格或 tab 相隔的都算是一個字。上例中連續按【 W 】則游標只會停在 l、u、c、s、o 等處。 與【 / 】 對應的是【 ? 】,它朝著游標上方 (與【 / 】 反向尋找字串。但【 / 】 (【 ? 】) 在到達最後一列 ( 第一列 ) 時,都會自動 wrap ﹝到達文章結尾或開頭時,會回到文章另一端的動作﹞。
另外兩族巡弋指令是【 t 】,【 T 】 及【 f 】,【 F 】。若 c 是一字元,則【 fc 】 (following) 將游標移到同列右邊的第一個 c,【 tc 】 (upto) 移到 c 的前一格。【 Fc 】 及【 Tc 】 朝反方向 (左邊) 巡弋。按【 ; 】 表示重複上一個【 f 】、【 t 】、【 F 】、【 T 】 指令。
當游標在一個左括號【 ( 】或一個右括號【 ) 】上,按【 % 】 跳到它所對應的那一半去。按【 ( 】 表示跳到這一句話的第一個字,如果已經在那裡,跳到前一句話的第一個字。按【 ) 】 跳到下一句話的第一個字。所謂一句話即是以英文句點隔開的一個字串。按【 { 】 跳到這一段落的上一列,【 } 】 跳到這一段落的下一列。所謂一段落即是以空列﹝連空格和 tab 都沒有﹞隔開的一個字串。嚴格一點說,【 { 】 跳到上一次您連續按了兩個【 Enter 】的地方,或是整個檔案的最前面。
除了【 / 】,及【 ? 】,巡弋指令前也可先輸入一個正整數 n 。其意義都是執行該指令 n 次。
巡弋指令的長處在於可與刪除指令【 d 】 合用。指令 dd 刪掉一整列。而 dx,其中 x 是一個巡弋指令,則由游標原在地一路刪到 x 所該到的地方。﹝除了【 dw 】 和【 dW 】,它刪到【 w 】 或【 W 】 所該到的前一格,其意義很直覺﹞。
dd 和 dx 前都可添一個正整數 n 。只要 nx 是有意義的。 ndx 和 dnx 的意義是一樣的。剛才被刪掉的東西,就像被 vi 吃了放在一個暫存的地方。可按【 p 】﹝ paste ﹞或【 P 】 使它吐出來。【 P 】 使它吐在游標的左邊或上邊,【 p 】 則是吐到右邊或下邊。 |