學習vi和vim編輯器(4):快速移動位置
通常,編輯文本需要做的第一步就是將游標移動到需要編輯的地方,因此編輯文本的速度一定程度上取決於將游標移動到目的地所需要的按鍵數。這一篇文章,主要介紹如何快速移動游標。
根據螢幕來移動:
在一個有幾千行文本的檔案中,如果按照行來移動的話,可能效率非常低。此時可以按照螢幕來移動。可以把檔案看成一個具有文字的長長的捲軸,而螢幕是一個視窗,通常顯示其中的24行文字(我的是顯示26行)。
^F:往前(往文本結尾方向)滾動一整屏;
^B:往後(往文本開頭方向)滾動一整屏;
^D:往前滾動半屏;
^U:往後滾動半屏;
^E:往前滾動一行;
^Y:往後滾動一行;
其中^F代表crtl鍵+f鍵。如果想往前或往下滾動螢幕,但又想讓游標維持在原來的文本行,可以使用z命令:
z+enter:將游標移動到螢幕頂端並滾動螢幕;
z.:將游標移動到螢幕中心並滾動螢幕;
z-:將游標移動到螢幕底端並滾動螢幕;
舉個例子:當前游標在螢幕最底層的一行,現在想讓游標仍然在該行,但讓該行移動到螢幕頂端,就可以直接輸入z,接著輸入enter鍵,如所示:
游標處於螢幕最後一行:
vcbBxLu12tK70NCjujwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20141031/2014103109134346.png" alt="\">
所以你會發現重複相同的z命令並沒有意義,因為第一次執行之後已經達到目的了,再執行相同的命令沒有效果。z命令可以接受數值參數,例如z+enter是將當前行移動到螢幕頂端,但是200z+enter就是將檔案的第兩百行移動到螢幕頂端。
當某些訊息出現在螢幕上而影響工作時,可以通過滾動螢幕來消除這些訊息,也可以直接輸入crtl+L鍵來重畫但不滾動螢幕。:
輸入ctrl+L鍵之後,就可以重畫螢幕,提示訊息消失:
如果需要在保持當前螢幕視圖的情況下,可以通過以下命令在螢幕範圍內移動:
H:移動到螢幕頂端的行;
M:移動到螢幕中央的行;
L:移動到螢幕底端的行;
nH:移動到螢幕頂端往下第n行;
nL:移動到螢幕底端往上第n行;
其效果如所示,起初游標在當前螢幕視圖的第一行:
輸入M鍵之後,游標移動到當前螢幕的中間行,而且螢幕視圖沒有變化:
根據行移動:
之前已經講過了" j "和" k "這兩個以行為單位進行移動的命令,這裡補充幾個命令:
enter:移動到下一行第一個字元;
+:移動到下一行的第一個字元;
-:移動到上一行的第一個字元;
以上三個命令在移動到目的行後,游標會置於該行的第一個非Null 字元。在當前行中移動,可以使用如下命令:
^:移到當前行的第一個非空格處;
n":移動到當前行的第n列;
根據文字區塊來移動:
vi編輯器中可以以文字區塊(單詞,句子,段落或小節)為單位進行移動。之前已經講過了按照單詞來移動(w,W,b,B),接下來再介紹幾個根據文字區塊來移動游標的命令:
e:移動到單詞的結尾;
E:移動到單詞的結尾,算上標點符號;
(:移動到當前句子的開頭;
):移動到下一個句子的開頭;
{:移動到當前段落的開頭;
}:移動到下一段落的結尾;
[[:移動到當前這一節的開頭;
]]:移動到下一節的開頭;
vi會尋找" ? . ! "等標點符號作為句子的結束。當這些標點符號後面有至少兩個空格或作為一行的最後一個非空格字元時,vi將其作為句子的結束。但是我實際操作的時候發現,其實只要這些標點符號後面跟上一個空格,vi就會將其作為句子的結束,不知道是不是書上又講錯了,還是哪裡可以配置?暫時先記下這個問題吧。
段落的定義是指下一個空白行前的文本,或者是出現在段落宏之前的文本。而小節的定義則是下一個節宏之前的文本。可以通過:set命令自訂這些被當成段或節分隔字元的宏。
根據搜尋模式的結果來移動文本:
在大檔案中移動時,最快速的方法之一就是根據搜尋模式的結果來進行移動。搜尋命令是特殊字元" / ",格式為/patten。模式可以是完整的單詞,或者一連串字串,如果在搜尋模式中加入了空格,這個空格也會被成單詞的一部分,當然還可以使用更強大的模式比對文法。vi會從游標當前位置開始搜尋,並且會按照需要自動繞迴文件開頭或檔案底部進行搜尋,如果搜尋到了,游標會定位在該搜尋模式第一次出現的地方,否則在螢幕底端顯示相應的資訊。
/patten:從游標位置開始處往前搜尋;
?patten:從游標位置開始處往回搜尋;
上一次的搜尋模式會留在你的編輯回話中,因此可以重複搜尋,而不需要重新輸入原來的搜尋模式:
n: 往同一個方向上重複搜尋;
N: 往相反方向上重複搜尋;
/enter:往前重複搜尋;
?enter:往後重複搜尋;
因為重複搜尋時,預設是會自動繞迴文件頭或檔案尾的,因此可以通過設定vi編輯器的wrapscan選項來控制搜尋是否要繞回,當輸入了指令:set nowrapscan 時,就可以取消搜尋時繞過檔案頭或檔案尾。這時當我們往前搜尋失敗時,就會顯示如下資訊:
而如果往回搜尋失敗時,也會顯示如所示的相應資訊:
搜尋命令可以與修改文本命令相結合一起使用。也就是說對於(command)(TextObject)的使用形式,搜尋命令可以出現在TextObject中,而command代表的是文本修改命令,如c,d等。例如 d?file就是刪除游標所在位置到往回搜尋第一次出現file的所有字元。
可以用如下命令在當前行中搜尋:
fx:搜尋(同時將游標移動到)本行下一個出現x的地方,x代表任何字元;
Fx:搜尋(同時將游標移動到)本行前一個出現x的地方;
tx:搜尋(同時將游標移動到)本行下一個出現x的地方的前一個字元;
Tx:搜尋(同時將游標移動到)本行前一個出現x的地方的後一個字元;
;:重複上一個搜尋,方向相同;
,:重複上一個搜尋,方向相反;
這些命令加上數值參數,代表搜尋x字元第n次出現的地方。這些命令在刪除或拖曳時很有用,當需要修改的文字區塊有多個標點符號而難以統計單詞數,此時用字元搜尋結合文本修改命令可能非常方便。
根據行號來移動:
行號對程式員非常有用,因為編譯報錯時通常都會告訴我們是哪行報錯,如果能夠直接移動到源檔案中的那行,就可以非常便捷。通過:set nu選項來顯示檔案的行號。
CTRL+G命令會在螢幕底端顯示相應的資訊,包括當前的行號,檔案的總行數,當前位置佔全文的百分比。如所示:
G命令:數值參數加上G命令代表直接移動到相應的指定行。如果沒有指定行號,則G命令直接移動到檔案尾部。
輸入兩個反引號( `` )可以回到原來的位置(上一次使用G命令的位置)。如果你在這中間做了編輯操作,兩個反引號將游標移回到上次編輯的位置。如果使用了搜尋命令,``可以將游標移回到上一次搜尋時的位置。 "'和``作用類似,只不過它將游標移回到上次位置所在行的開頭而不是確實的位置。
依照行號來移動游標是在一個大檔案中快速移動的方法。
本章vi編輯器命令總結:
^F,^B,^D,^U,^E,^Y,z+enter,z.,z-,^L,H,M,L,enter,+,-,^,n|,e,E,(,),{,},[[,]],/pattern,?pattern,n,N,/,?,fx,Fx,tx,Tx,;, , ,G,``,'',^G。