vi編輯器學習——簡單編輯操作

文章及圖片原載於 bibodeng think beyond, 歡迎訪問 :)

第二章 簡單編輯操作

本章將會向你介紹使用vi來進行編輯,本章被當做是初級教程。在本章你將會學習怎樣移動光標,還有怎樣做簡單的編輯工作。如果你從來沒有使用過vi編輯器,那麼你應該閱讀整章內容。

後續的章節將會帶領你拓展你的技能,來更加快速更加高效地完成你的編輯工作。其中最大的優點就是對熟手來說,那就是你可以有很多選項可用。(其中對菜鳥來說最大的好處就是vi真的太TMD多命令了。)

你不能單純靠記憶單個vi命令來學習vi編輯器,可以考慮從本章介紹的基本命令開始學起。記住一點,這些命令的使用模式都是一樣的。

當你學習vi的時候,將你能做的工作更多地代理給編輯器來做,然後找到能夠完成該任務的命令。在後面的章節,你將會學習更多高級的特性,但是在你掌握高級技巧之前,先把簡單的掌握好!行嗎?

本章將會覆蓋:

 

vi命令

vi有兩種模式:命令模式和插入模式。當你用vi進入一個文件的時候,你所處的是命令模式,此時編輯器正在等待着你輸入命令。一些命令可以讓你移動到文件的任何位置,可以進行編輯,可以進入編輯模式來添加新文本。也可以使用退出編輯文件回到unix的命令(保存或者丟棄修改都可以)。

你可以假設這兩種不同的模式代表着不同的鍵盤,在插入模式,你的鍵盤的功能就像一個打字機,打出你想要的內容,而在命令模式,每個鍵都是有命令的含義,可以指示編輯器做什麼。

你有許多的方法告訴vi編輯器你想進入插入模式,其中一種最常見的就是按下 i 這個鍵.i不會出現在屏幕上,但是你按下了之後,接下來按下的任何按鍵將會出現在屏幕中,並且會被存儲到內存緩衝區內。光標表示當前的所在位置。當你想退出插入模式的時候,按下ESC鍵,回到命令模式。按下ESC鍵光標會退後一格,所以你將看到光標在你輸入的最後一個字符上面。

例如,假設你新建了一個文件,並且想要輸入"introduction",如果你按下的按鍵順序是這樣的iintroduction,那麼你的屏幕中將會看到這樣的結果:

introduction

當你新建了一個文件,vi處在命令模式下,第一個i是進入到插入模式的命令,而後續的所有按鍵都是要輸入文件的內容,因爲你進入了插入模式,直到你按下ESC鍵離開插入模式。當你輸入錯誤的時候,退格刪除,然後重新輸入。退格的作用要取決於你使用的終端類型,有的是直接刪除你的輸入內容,有的是直接退格而不刪除內容。記住,你不能用backspace鍵來退格到你進入插入模式之前的位置,但是如果你取消了vi的配置,Vim允許你退格到進入插入模式前的位置。

 

vi有一個選項可以設置一個右邊距離,然後一行到達一定長度會自動換行,但是現在,你可以使用ENTER鍵來換到下一行。

有時候你不知道是在插入模式還是在命令模式,當vi的反應不像你所預期的那樣,那麼按下ESC鍵一次或者兩次來檢查你所處的模式。當你聽到beep聲,那麼已經在命令模式下了。

移動光標

你可能只需要一丁點的時間來在插入模式插入新文本,但是將會花多一點時間在修改已有文本上。

在命令模式下,你可以將光標移動到任何你想要的位置,當你開始編輯時,你總是想把光標放到相應的位置,無論你進行的是什麼操作(修改、刪除、還是複製),你都想要儘可能飛快地到達你想要操作的位置。

下面是一些移動光標的命令:

  • 上下左右,一次一個字符距離
  • 字符塊爲單位向前或者向後,例如單詞,句子,或者段落
  • 在文件前移或後移,一次一個屏幕空間
在圖表2-1中,一個下劃線表示光標當前所在的位置,圓圈告訴你各種命令所達到的目標位置。

點擊查看原圖

圖表2-1 簡單移動命令

 

簡單移動

按鍵h,j,k和l,這些剛剛好在你手指下面的按鍵,可以移動光標:

h 左移一格
j 下移一行
k 上移一行
l 右移一格
你可以使用方向鍵(←↓↑→)控制上下左右,還有+和-來上移下移。或者使用ENTER和BACKSPACE鍵,但是它們是有特殊作用的。剛開始,你會覺得它們看起來很笨拙,用字母按鍵來代替鼠標光標移動。但是之後你會發現這將是你最喜歡的vi的特性之一,那是因爲你可以不用離開鍵盤中心就可以隨意移動(省力)。
在你移動光標之前,先按下ESC鍵以確保你在命令模式下,用h,j,k,l按鍵來向前向後移動當前光標所在的位置。當你可以在一個方向上快速飛奔的時候,你將會聽到一個beep聲,因爲你到了文本的邊界,此時光標也不動了。當你在一行的頭部或者尾部的時候,你不能再用h或者l來前後移動到前一行或者下一行,你必須要用j和k按鍵。你不能將光標移到沒有文檔字符的地方,比如有"~"標號的行(表示沒有任何字符),當然也不能移動光標到第一行更頂的位置。

 

帶數字參數的移動

你可以優化移動命令,方法是使用數字。圖表2-2展示了命令4l怎樣移動光標到右邊第四個空格處的,就像你按下了4次的l命令(llll)。

 

點擊查看原圖

多次命令可以讓你有更多的選擇以及效率來發揮你學習到的命令的作用。記住它,當你學到更多命令的時候,你將受益無窮。

行內移動

當你保存了practice文件,vi將會告訴你該文件有多少行。一行未必和屏幕上顯示的行一樣長(通常限制爲80個字符),一行結束是以ENTER鍵換行來結束的。如果你在按下ENTER鍵之前輸入了200個字符的內容,vi將視這200個字符爲一行(雖然可能會被分作很多行來顯示在屏幕上)。也就是說,一行是以行結束標誌來決定其長度的。

我們前面第一章的時候提到過,我們可以設置右邊距離,vi將會自動在距離右邊界一定距離的地方插入一個換行,這個距離(right margin)是可以設置的。選項wrapmargin(簡寫是wm),你可以用下面的命令來設置wrapmargin:

:set wm=10
本命令不會影響你早已經輸入的行,而只會影響你將來要輸入的行。我們將會在第七章選項設置深入討論。
如果你不用vi的自動wrapmargin換行的話,你應該用換行來控制一行文本的長短。

這裏有兩個非常有用的命令,讓你在行內移動遊刃有餘:
0 (零) 移動到所在行的開頭
$ (美刀符號) 移動到所在行的尾部
在下面的例子中,行號是已經顯示出來了(行號顯示可以用vi的number選項來控制,輸入“:set nu”命令就可以了,這個也將在第七章講解)。

點擊查看原圖

 
邏輯行的第3行,即可見行第5行沒有和上面的對齊。如果光標在單純delete的d位置,當你按下$命令的時候,你的光標將會移動到邏輯行尾部,也就是下面的them單詞。如果你按下0命令,那麼你將回到第二行的開頭,也就是字母move的m字母。

字符塊間移動

你可以一整塊一整塊字符地跳躍,單詞,句子,段落等。w命令可以一次前移一個單詞的位置,計數器可以計入標點符號或者不計入,下面的行演示光標是怎樣移動的:
 

點擊查看原圖

你可以一個單詞一個單詞地移動,不計入標點符號和間隔,只需要將命令改爲大寫的W。那麼光標使用W來移動就和上圖的第二行一樣。

點擊查看原圖


要往回整個單詞間隔地移動,那麼就使用b命令,每次後移一個單詞距離。大寫的B命令可以讓你不計標點和間隔地移動一個單詞的間隔。
我們前面提到,移動命令是可以接受數字參數的,所以,無論是w命令還是b命令,都可以讓你的移動間隔加倍。2w讓你向前移動2個單詞,5B讓你後移動5個單詞,且標點符號不計入內(標點符號不計做單詞)。

要移動到一個特定的行,你可以使用G命令,G命令將會移到文件的末尾,1G將移動到文件的第一行,42G將會到達第42行。我們將會在後面一節“G命令”裏面詳細討論。

點擊查看原圖


 
我們將會在第三章討論以句子爲間隔的移動,但現在,用你知道的命令來移動光標,把他們和數字參數結合起來,加倍移動。

 

簡單編輯

當我們輸入文本到你的文件中,一切都是那麼完美。但是你會發現當你打印錯誤或者想要優化你的短語,或者當你的程序有一個bug的時候。當你輸入字符的時候,你很有可能要修改它們,刪除,或者移動,甚至複製。圖2-3就向你展示了一些對文本的修改。修改是用文本糾錯標記的。

在vi中你可以完成上圖所示的編輯任務,僅僅需要一些簡單的按鍵命令:i 插入,a可以在光標後面追加文本,c 可以更改文本,d刪除。要移動或者拷貝文本,你可能需要一些組合命令,你可以用d 刪除來移除文本,然後用p命令來放到需要的地方(粘貼)。你可以單純地拷貝文本,用y命令(yank),然後用p來(put)。每個編輯都將會在本章進行描述。圖表2-4將會展示完成圖表2-3所示修改的vi命令。

插入文本

你早就在前面看到過插入命令了,用來插入文本到新文件中。你也可以在編輯現存的文本時添加忘掉的字符、單詞、句子時使用插入命令。在practice文件中,假設你有下面的句子:
you can scroll
the page, move the cursor, delete
lines, and insert characters.

點擊查看原圖

由當前光標所示的位置,來編輯句子。輸入下面的命令:

點擊查看原圖

追加文本

a, 你可以在任何地方的後面追加文本,只需要一個簡單的a命令,這個命令的做的工作和i差不多,但是a和i不同的是,它在光標所在的後面插入,而不是在光標所在位置的前面插入。你也許已經發現了當你按下i命令進入插入模式的時候,光標不會移動,直到你輸入文本爲止。當你按下a命令進入插入模式時,光標將會移動到右邊一格。當你輸入文本時,將追加文本到原始光標所在位置的後面。

修改文本

c,你可以通過使用c命令替換任何的文本。要告訴c命令有多少文本要被修改,你需要將c和移動命令w或b結合在一起使用。使用此種方法,移動命令就充當了文本對象。例如,c可以像下面一樣使用,將修改從光標處開始到特定位置:

cw 修改從光標到當前單詞結束位置之間的文本
c2b 修改從光標到後退兩個單詞的位置之間的文本
c$ 修改從光標到行尾之間的文本
c0 修改從光標到行首之間的文本

當組織好一個修改命令後,你可以用任意長度的文本來替代上面所說的文本,沒有字符,一個字符,或者幾百個字符都可以。c 命令,就像 i 和 a 一樣,帶你進入插入模式,按下ESC鍵退出插入模式就好了。

影響只會限制在當前行,vi 將會標記將被修改的尾部,以一個$來標識。所以你可以看到哪部分被修改了。(vim和vi稍微有不同,vim會刪除掉單詞,然後讓你輸入,不會用$標記出修改部分的尾部)

單詞

要修改一個單詞,將c命令(change)和w命令(word)結合使用,你就可以用待會輸入的文本(或長或短)替代一個單詞的長度,cw可以被看作是“刪除指定的單詞,並插入新文本直到按下ESC鍵之前。假設在你的practice文件中有如下的行:

with an editor you can scroll the page.

然後你想要修改“an“爲a,你只需要修改一個單詞:

點擊查看原圖

cw也可以只修改單詞的一部分,例如將spelling修改爲spelled,則可以將光標移動到i處,然後按下cw命令,則可以輸入ed以替換ing,按下ESC鍵退出編輯模式,則完成編輯。

vi命令的一般格式

在剛纔的修改命令中,你可能發現vi命令有如下的模式:
(命令)(文本對象)
命令就是修改命令c,文本對象就是移動命令所描述的從光標到目標位置之間的預期的字符串(如w,$,0)。c命令不是唯一的需要接文本對象的命令,d(刪除)命令以及y(yank 複製)命令也遵循這一的模式。

記住移動命令是可以帶參數的,所以數字可以添加到c,d,y命令中(例如 d2w或2dw都可以刪除連續的兩個單詞),記住了這點,你就會發現其實很多命令都有下面的模式:
(命令)(數字參數)(文本對象)
或者將數字參數提前(等效的):
(數字)(命令)(文本對象)
它們的原理是:數字和命令是可選參數,沒有了它們剩下的就是一個移動命令了,當你加上一個數字參數時,那麼命令就變成了一個加倍移動(表示尾部和首部的$/0除外)。另外一方面,與c,d,y結合,則可以變成一個編輯命令,當你意識到可以有多少種組合的方法時,你就會知道vi有多麼強大的威力了!

cc命令可以替換掉整個當前行,cc修改整個行,後來輸入的文本將會替代該行,直到按下ESC鍵退出插入模式爲止。光標在行內什麼位置不重要,cc都會替換掉整行。像cw這樣的命令和cc命令的工作模式是不一樣的,使用cw時,原先的文本依舊存在,直到你覆蓋了它,然後所有的原先的內容在你按下ESC之後消失,而使用cc命令時,原先的文本將會被擦除,留下一個空行來插入文本。覆蓋方法發生在影響小於一行的修改命令中,而“空行”方法發生在影響整行或更多行的命令中。 C(大寫C)替換從當前光標所在位置到該行行尾的所有字符,它具有和c$一樣的功效。命令cc和C是其他命令的快捷方式,所以它們不遵循一般的vi命令規則,你將會看到類似的其他快捷鍵,這將會在後面的刪除和複製命令中講到。

字符

r另一個替換編輯命令r,r替換掉光標所在位置的單個字符爲你輸入的另一個字符,你無需按下ESC鍵來返回命令模式,這裏有一個拼寫錯誤:

Pith a screen editor you can scroll the page

只有P字符需要修改,你不想用cw命令替換掉整個單詞,因爲你將糾正整個單詞爲”with“。這個時候r命令就很方便了,用來替換掉單個字符:

按下rW 替換當前光標所在字母爲W

 

 

點擊查看原圖

部分文本

s,假設你想修改幾個字符,而不是一個單詞,部分替換命令s,它本身只替換單個字符,然後插入若干個字符(以多個字符替換單個字符),就像修改命令(c)一樣,文本最後一個字符將會用一個$符號來標記(貌似我的機子上的vim沒有這個),然後你就可以清楚地看到你有多少字符被修改。

S(大寫S),讓你修改整行,與命令C相比,C只刪除從光標到行尾的文本,而S命令刪除整行,無需關心光標在行的何處。然後vi將你帶入插入模式,加上數字前綴可以讓你替換多行。s和S命令都會將你帶入插入模式,當你完成了編輯時,按下ESC鍵退出插入模式。(老調重彈了很多次了)

R 命令,就像他的小兄弟r一樣,是用來替換文本的,只不過R簡單地進入疊印(覆蓋)模式,然後一一地修改,而r只修改一個字符。

修改大小寫

修改一個字符的大小寫是一種特別的替換,波浪號 ~ 命令,可以將一個小寫字母改寫成大寫字母,或者將一個大寫字母改寫成小寫字母。將光標移動到你想要修改的字符所在的位置,然後輸入 ~ 命令,字符的大小寫將會改變,光標將會移動到下一個字符。

在早期版本的vi中,你不能使用數字前綴來修飾此命令,但是在現在的vi中,允許使用數字前綴作爲參數,然後可以一次修改若干字符的大小寫。如果你想一次修改若干行的大小寫的話,你必須用unix的tr等命令過濾文本,將會在第七章討論。

刪除文本

d命令,你可以刪除文件中的任何文本,毫無疑問使用刪除命令d就可以了。就像修改命令一樣,刪除命令需要一個文本對象(需要修改的文本的數量或者範圍)。你可以刪除一個單詞,使用的是dw命令,刪除行使用dd(或者D)命令,或者其他種種移動命令。在這些刪除命令中,你需要把光標移動到要做修改的地方,然後用d命令結合文本對象(例如w)來工作。

單詞

dw 假如你有如下的文本:

Screen editors are are very popular,
since they allow you to make
changes as you read through a file.

光標位置爲紅色字體所示,你想要刪除第一行的are

 

點擊查看原圖

dw 刪除一個單詞,且是從光標處到所在單詞的尾部。記住,跟隨單詞的空格也會被刪除。dw也可以完成單詞內的部分刪除,如下面的例子:

since they allowed you to make

你想要刪除掉ed(allowed的末尾)。可以用下面的鍵:

點擊查看原圖

dw會刪除下一個字母之前的空格,但是在本例中我們並不想這麼做,要保留單詞間的空格,則使用de命令,這樣就只刪除到文件的末尾了。使用dE命令可以刪除到單詞的末尾,包括標點符號。

你也可以向後刪除(db,聰明的你可以想象一下它的效果)或者刪除到一行的末尾或者開頭(d$ 和 d0).

dd 命令刪除光標所在的整行,dd不會刪除行的一部分,要麼全刪,要麼不動。就和其他完全命令 (如cc)一樣, dd是一個很特殊的命令。用和上個例子完全相同的文本,光標在第一行。

點擊查看原圖

大D命令刪除從當前位置到行末尾的文本,D是 d$的快捷方式。(其實很多方法都是和其他命令如C相似),例如:

你可以刪除刪除從光標起的右邊部分的文本:

點擊查看原圖

 

字符

x命令,有時候你只是想刪除一兩個字符,不想弄得太大動靜,那麼使用r命令來做替換也不太適用,那麼使用x命令,可以刪除一個字符,且只刪除當前光標所在處的一個字符。假如有下面的行:

zYou can move text by deleting text and then

你可以用x命令刪除字母‘z’,另外一個特別的命令X(大寫x),可以刪除光標以前的那個字符。而在命令前假如數字前綴,則等價於運行命令多次,如5x,可以向右刪除5個字符。

你可能會碰到的問題

  • 你刪錯了東西,想要恢復回來
  • 如果你用刪除命令,刪掉了你不想刪的東西,那麼你可以輸入u命令來撤銷你的修改,因爲u命令就是undo,你可以恢復到以前的修改。如果你做的是最後一次修改,想要恢復過來,嘗試一下p命令,因爲你刪除的東西會保存到p所維護的空間,然後按下p就可以將那些誤刪的粘貼回去。vi緩存最近9個刪除的內容,可以用如3p的命令恢復前刪除的三行。

移動文本

在vi中,通過刪除文本然後在別處粘貼來移動文本,每次你刪除了一個文本塊,被刪除的文本將會臨時存儲在一個特別的緩衝區中,然後移動光標到你想要放置文本的地方,然後用p ( put)命令來將文本放置到該處。你可以移動任何一塊文本,儘管移動行比移動單詞要有用的多。

p,p命令將緩存區中的內容粘貼到光標後面區域,如果你刪除了一或多行,p將會把你所刪除的文本粘貼到光標所在行的下一行。假設你有如下的文本:

You can move text by deleting it and then,
like a "cut and paste,"
placing the deleted text elsewhere in the file.
each time you delete a text block.

然後你想把第二行移動到第三行的後面,先使用d命令刪除,然後用p命令放置。如下所示:

點擊查看原圖

一旦你刪除了文本,你需要在下面的修改或者刪除之前保存一下,如果你同時在編輯其他文件,會影響緩衝區的話,你刪除的文本可能會丟失。你可以重複多次p命令,只要你沒有進行進行新的編輯。在第四章,你將會學習怎樣保存一個命名了的緩衝區中被你刪除的文本,所以你可以恢復你的數據。

一個有用的小技巧——轉置文本

你可以使用xp命令(想象一下,刪除一個字符,然後插在下一個字符的後面,不就將相鄰的兩個字符換位了嗎?)來交換兩個字符的位置。例如,在單詞mvoe中,vo兩個單詞位置反了,所以要修改回來,只需要將vo的位置調轉過來即可,所以先x,刪除掉字符‘v’,然後將‘v’放到(p)字符‘o’的後面,這樣就調整了vo的位置爲ov。

拷貝文本

y命令,很多時候你可以使用拷貝命令來節省編輯的時間,使同一段文本在多處重複。使用兩個組合使用的命令:一個y命令,一個p命令就可以實現了。你可以拷貝任意長度的文本,然後放置在其他的任何位置。一個(急抽)拷貝命令可以複製所選的文本到一個特殊的緩衝區中(可以一直保持直到下一個y命令覆蓋),然後就可以講所複製的內容用p命令粘貼了。

就像修改和刪除命令,拷貝命令可以和任何移動命令結合(如yw,y$,4yy)。y命令經常使用在拷貝一行內容的情況,因爲拷貝命令往往要在距離更遠的其他行粘貼文本,而更少修改行內文本。假設practice有下面的文本:

With a screen editor you can
scroll the page.
move the cursor.
delete lines.

你想要造出三個完整的句子,每句都用“With a screen editor you can”開頭,你可以使用拷貝命令y,來完成這項簡單的工作。

點擊查看原圖

點擊查看原圖

y命令和刪除命令使用的是同一個緩衝區,每次最近的刪除或者拷貝都會取代之前的緩衝內容,我們將會在第四章看到,大概有9個拷貝或者刪除內容塊被放在buffer裏面,他們都可以用p命令來粘貼。你也可以將它們刪除或者粘貼到26個不同的緩衝區中(複製粘貼緩衝區),這允許你像玩雜耍一樣擺弄文本塊。

重複或者撤銷你的最後一條命令

每個編輯命令都緩存在一個臨時緩衝區裏面,直到你的下一個命令輸入時才消失。例如你在一個單詞後插入了一個"the",插入文本的命令以及你做的操作,都被保存起來了以用於撤銷。

重複命令

.命令,每次你想重複上次使用過的命令,你可以重複多次該命令,點符號(.)可以讓你重複命令。看下面的例子:

With a screen editor you can
scroll the page.
With a screen editor you can
move the cursor.

你可以刪除一個行,然後刪除另外一行,只需要輸入一個點命令即可。

點擊查看原圖

老版本的vi在重複命令的時候有問題,例如,在插入一個很長的文本時,如果設置了wrapmargin(換行對齊),則會有困難。如果你有這樣的老版本,這個bug將遲早會折騰到你。你能做的不多,只是提前警告一下。(現代版本的vi不見得有這樣的問題)你有兩種方法來解決這樣的問題,當重複多次長文本插入時,你可以在重複下一次命令之前保存一次文檔( : w),也可以講wrapmargin設置爲0.即如下所示:

: set wm=0

在後面的章節“更多映射鍵的例子” 中,我將會向你展示一種使用wrapmargin的簡單解決方案。在一些vi版本中,命令 CTRL+@ 可以重複最近的插入操作(我在vim上試了一下,聽到的卻是嘟嘟聲,原來是沒有進入到插入模式)。進入插入模式,可以執行CTRL+@命令來重複插入,插入後將帶你回到命令模式。

回退-撤銷

u命令,早之前已經提到過了undo命令,在你操作錯誤的時候可以撤銷你的命令。只需簡單地按下u鍵。這時候光標在哪都無所謂。繼續之前的例子,下圖展示了刪除後的practice文件:

點擊查看原圖

U,大寫u,可以撤銷在一個行的所有修改。只要光標保持在該行,當你從該行移走後,你就不能繼續使用U命令了。注意你不能撤銷你最近做的撤銷(撤銷動作),在兩個文本修改版本之間切換。(設想一下,如果可以撤銷你的撤銷動作,那麼撤銷一個編輯,然後撤銷你的撤銷,就是恢復,所以是在裏兩個版本里切換,這做沒有多大意義)但是u命令可以撤銷U命令,而U命令將會撤銷所有在本行的修改,包括哪些u所做的修改。(恢復到該行做任何修改之前的狀態——創建狀態)

小技巧:u命令可以撤銷它本身的操作將會導致一個很調皮的循環。如果你只是想要撤銷你最後的編輯修改,那麼簡單地撤銷它,你將會被彈回原來的行。當你撤銷你的撤銷操作時,你仍呆在本行。

vim 可以讓你使用 CTRL+R鍵來重做一個未完成的命令,和無限重做結合在一起,你可以向前或者向後你的編輯歷史,可以查看稍後章節“撤銷撤銷操作”。

更多插入的方法

你可以在光標前插入一段話,按下如此的鍵隊列:
itext to be inserted ESC鍵
然後你就向裏插入了“text to be inserted”,並且回到了命令行模式。這裏還有其他的一些插入命令,在光標前後不同位置進行插入:

A 向行尾追加文本
I 向行首作插入操作
o (小寫o),向下創建一個新行,然後插入文本
O (大寫O), 向上創建一個新行,然後插入
s 刪除光標所在的或者替換文本
S 刪除本行或替換本行
R 用新值覆蓋原有文本,會一直向右邊移動,且可以添加新文本。

所有的這些命令可以讓你進入到插入模式,完成插入後,記得按下ESC鍵退回到命令模式。

A (append) 和 I(insert) 可以讓你避免在編輯前移到行尾或者行首。(A命令比$a好,因爲少按一次鍵,儘管算起來還是一樣多的鍵,但是更快了不是嗎?只有你越懶,那麼你可能學會更多命令讓計算機來幫你做哪些無聊的重複工作。)

o和O命令,在下一行或者上一行新開一行,也不用再換行然後光標退回了。你可以在當前行任意位置敲入。

s和S命令(substitute)允許你刪除一個字符或者一整行,然後接入你要輸入的任意長度文本。s等價於 c + 空格符,表示用空格符來代替一個字符。S命令呢,和cc命令是一樣的功效的。s的最佳用處是修改一個單詞爲若干個單詞。

R命令(replace)是很有用的,當你想修改文本,但是不知道要修改多少個字符的時候,例如,你不知道要修改幾個單詞(估計用3cw或者4cw),但是這些都沒有R那麼好,因爲R是改到哪就是哪逐個替換的。改完了,退出插入模式就行了。

插入命令的數字參數

除了o和O命令之外,以上列出的插入命令(加上i和a),可以使用數字前綴做參數。有了數字前綴,你可能會用i,I或a命令來插入一行下劃線或者交替的符號,例如,你可以輸入50i* ESC鍵 來輸出一行“**********************************”,而用25a*- ESC鍵來輸出這樣一行“*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-”(貌似是程序員編程時候的裝飾性分隔線,有這個東西爽爆了),這比重複地輸入一個字符或者幾個字符要有意思的多(很諷刺的是,我使用的不是vi編輯器,結果我輸入上面的符號的時候就是用手工重複的方法,實在是沒有vi那麼高效啊!)

有了數字前綴,r命令可以一次替換一片的字符(例如輸入個5r,再輸個a,你會發現五個字符被替換爲a了,你將看到“aaaaa”整整齊齊地站在你的屏幕上。),在C或者C++中,要將|| 換成 &&,只需輸入一個2r&即可,無比省事。(越來越崇拜開發vi的神人了,感覺vi就是爲程序員打造的,程序員又懶又聰明,纔會讓計算機來提高我們工作的效率)

你可以在大S命令前加上數字參數,這樣你就可以一下替換掉好幾行了,這相當地迅速且很靈活,和用c 命令和移動命令結合起來用一樣爽。

一個很好的例子是,用s命令前面加數字參數可以一次替換掉好幾個字符,這些字符往往在單詞的中間,輸入r不好,輸入cw會改掉太多,那就用s命令吧,它的效果和R差不多,但其實還是有所不同的。

還有其他的完美結合可以讓你的編輯變得自然,例如ea命令(其實和A命令一樣)也是一個很有用的組合,可以在本行末尾添加文本。你將會被這些聰明的命令所導引,向着一個自動化的美好的世界而去。

將兩行連在一起

J 命令,有時候你要將一些看起來很醜的短行連接在一起,只需要將光標移到第一行,然後用J命令就可以將兩行合併了。假設你有如下的practice文件:

With a
screen editor
you can
scroll the page, move the cursor

點擊查看原圖

在J之前加上數字參數會讓你驚喜地發現,一下子可以將好幾個行合併。但是合併後你會發現每行之間會留下痕跡——一個空格。(感覺這個功能也是爲程序員造的,合併幾條語句在一行裏面。)

問題清單

  • 當你輸入命令時,文本在你的屏幕上跳來跳去四處遊走,而且不知道它在幹嘛
  • 當你想按j的時候,不要 錯誤滴按下J命令,你可能無意中按下了大寫轉換鍵 Caps Lock,vi是大小寫敏感的,這個不用囉嗦了。當發現caps lock 燈亮的時候,再按一次回到原來的狀態。記住按下ESC命令,回到命令模式。無需多言!

回顧學過的命令

下面的圖表,展示了c,d,y命令的一些結合移動命令的使用,都是一些基礎命令,本章介紹的命令就這些,記住一定要勤加練習才能熟能生巧。掌握這些命令,你已經入門了,但是要真正體會到vi的強大,你還得看下面的高級章節。

 

點擊查看原圖

點擊查看原圖

translated by bibodeng  如有錯誤,歡迎斧正  2012-09-22      謝絕轉載

 今後將不再翻譯了,而是以筆記的形式記錄一些,因爲已經有一本還不錯的中譯本《學習vi和vim編輯器》  不重複發明輪子。

 

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