Linux循序漸進(24):vi命令(轉)

post0發表於2007-08-09
Linux循序漸進(24):vi命令(轉)[@more@]

在螢幕上移動

Vi提供了三個關於游標在全螢幕上移動並且檔案本身不發生滾動的命令。它們分別是H、M和L命令。

H命令

該命令將游標移至螢幕首行的行首(即左上角),也就是當前螢幕的第一行,而不是整個檔案的第一行。利用此命令可以快速將游標移至螢幕頂部。若在H命令之前加上數字n,則將游標移至第n行的行首。

[例9] 螢幕顯示如下內容:

#include

main ( )

{ int k ;

for ( k=0 ; k<3 ; k++) add( ); }

add( )

{ static int x=0;

x++ ;

printf(“x=%d ”, x);

}

~

~

~

~

~

“ example.c” [ New File]

在命令模式下輸入4H命令後,游標移到以for開頭的這一行的字母f上。

值得一提的是,使用命令dH將會刪除從游標當前所在行至所顯示螢幕首行的全部內容。

M命令

該命令將游標移至螢幕顯示檔案的中間行的行首。即如果當前螢幕已經充滿,則移動到整個螢幕的中間行;如果並未充滿,則移動到文字的那些行的中間行。利用此命令可以快速地將游標從螢幕的任意位置移至螢幕顯示檔案的中間行的行首。例如,在上面螢幕顯示的情況下(不論游標在螢幕的何處),在命令模式下,輸入命令 M之後,游標都將移到add這一行的字母a上。

同樣值得一提的是,使用命令dM將會刪除從游標當前所在行至螢幕顯示檔案的中間行的全部內容。

L命令

當檔案顯示內容超過一屏時,該命令將游標移至螢幕上的最底行的行首;當檔案顯示內容不足一屏時,該命令將游標移至檔案的最後一行的行首。可見,利用此命令可以快速準確地將游標移至螢幕底部或檔案的最後一行。若在L命令之前加上數字n,則將游標移至從螢幕底部算起第n行的行首。例如,在上面螢幕顯示的情況下(不論游標在螢幕的何處),在命令模式下,輸入命令3L之後,游標都將移到x++這一行的字母x上。

同樣值得一提的是,使用命令dL將會刪除從游標當前行至螢幕底行的全部內容。

按字移動游標

首先介紹一下Vi中“字”的概念。在Vi中“字”有兩種含義。一種是廣義的字,它可以是兩個空格之間的任何內容。

[例10] 在檔案example.c 中的第4行:

{int k;

它只有2個字,一個是{int ,另一個是k;

Vi中另一種字是狹義上的字,在此種意義之下,英文單詞、標點符號和非字母字元(如!、@、#、$、%、^、&、*、(、)、-、+、{、}、[、]、~、|、、、/等)均被當成是一個字。因此,上面那一行中就包括{、int、k、;這4個字。

Vi中使用大寫命令一般就是指將字作為廣義來對待,使用小寫命令就是作為狹義對待。

搞清楚Vi中字的含義後,我們就可以介紹按字移動游標的命令了。

Vi 一共提供了三組關於按字移動游標的命令,分別是:

w和W命令

將游標右移至下一個字的字首;

[例11] 螢幕上顯示如下:

printf(“Hello Mr.Huang! ”);

現在使用w命令,把游標移到下一個字(狹義)的字首“(”上:

printf(“Hello Mr.Huang! ”);

下面使用W命令,將把游標移到下一個字(廣義)的字首“M”上:

printf(“Hello Mr.Huang! ”);

e和E命令

如果游標起始位置處於字內(即非字尾處),則該命令將把游標移到本字字尾;如果游標起始位置處於字尾,則該命令將把游標移動到下一個字的字尾。

b和B

如果游標處於所在字內(即非字首),則該命令將把游標移至本字字首;如果游標處於所在字字首,則該命令將把游標移到上一個字的字首。

[例12] 螢幕顯示如下:

printf(“Hello Mr.Huang! ”);

現在使用b命令,由於游標處於該字中間,所以游標移動到本字字首“H”處:

printf(“Hello Mr.Huang! ”);

如果使用B命令,則如下所示:

printf(“Hello Mr.Huang! ”);

按句移動游標

在Vi中,一個句子被定義為是以逗號(,)、句號(.)、問號(?)和感嘆號(!)結尾,且其後面跟著至少兩個以上(含兩個)空格或一個換行符的字元序列。

Vi提供了關於按句移動游標的兩個命令,分別為:

1. ( 命令

將游標移至上一個句子的開頭。

2. ) 命令

該命令將游標移至下一個句子的開頭。

按段移動游標

在Vi中,一個段被定義為是以一個空白行開始和結束的片段。Vi提供了關於按段移動游標的兩個命令,分別為:

1. { 命令

該命令將游標向前移至上一個段的開頭;

2. } 命令

該命令將游標向後移至下一個段的開頭。

螢幕滾動

螢幕命令是以螢幕為單位移動游標的,常用於檔案的滾屏和分頁。需要注意的是,螢幕命令不是游標移動命令,不能作為文字限定符用於刪除命令中。

在命令模式下和文字輸入模式下均可以使用螢幕滾動命令。

 

1. 滾屏命令

關於滾屏命令有兩個:

· < Ctrl+u > 將螢幕向前(檔案頭方向)翻滾半屏;

· < Ctrl+d > 將螢幕向後(檔案尾方向)翻滾半屏。

可以在這兩個命令之前加上一個數字n,則螢幕向前或向後翻滾n行。並且這個值被系統記住,以後再用< Ctrl+u >和< Ctrl+d >命令滾屏時,還滾相應的行數。

2. 分頁命令

關於分頁命令也有兩個:

· < Ctrl+f > 將螢幕向檔案尾方向翻滾一整屏(即一頁);

· < Ctrl+b > 將螢幕向檔案首方向翻滾一整屏(即一頁)。

同樣也可以在這兩個命令之前加上一個數字n,則螢幕向前或向後移動n頁。

3. 狀態命令< Ctrl+G >

命令顯示在vi狀態行上的vi狀態資訊,包括正在編輯的檔名、是否修改過、當前行號、檔案的行數以及游標之前的行佔整個檔案的百分比。

4. 螢幕調零命令

Vi 提供了三個有關螢幕調零的命令。它們的格式分別為:

· [行號] z [行數]

· [行號] z [行數] .

· [行號] z [行數] _

若省略了行號和行數,這三個命令分別為將游標所在的當前行作為螢幕的首行、中間行和最末行重新顯示;若給出行號,那麼該行號所對應的行就作為當前行顯示在螢幕的首行、中間行和最末行;若給出行數,則它規定了在螢幕上顯示的行數。

[例13]

8z16 :將檔案中的第8行作為螢幕顯示的首行,並一共顯示16行。

15z . :將檔案中的第15行作為螢幕顯示的中間行,顯示行數為整屏。

15z 5_ :將檔案中的第15行作為螢幕顯示的最末行,顯示行數為5行。

文字插入操作

在命令模式下使用者輸入的任何字元都被Vi當作命令加以解釋執行,如果使用者要將輸入的字元當作是文字內容時,則首先應將Vi的工作模式從命令模式切換到文字輸入模式。切換的方式是使用下面的命令。

 

插入(Insert)命令

Vi提供了兩個插入命令:i和 I。

 

 

i命令

插入文字從游標所在位置前開始,並且插入過程中可以使用鍵刪除錯誤的輸入。此時Vi處於插入狀態,螢幕最下行顯示“--INSERT--”(插入)字樣。

[例14] 有一正在編輯的檔案,如下所示:

Welcome to vi world!Come on!

~

~

游標位於第一個“!”上,需在其前面插入:

This is an example!

使用i命令,並輸入相應文字後,螢幕顯示如下:

Welcome to vi world This is an example!!Come on!

~

~

由此例可以看到,游標本來是在第一個“!”處,但是由於是從游標所在位置前開始插入,所以這個“!”就被擠到了新插入的文字之後。

I命令

該命令是將游標移到當前行的行首,然後在其前插入文字。

}

第二十九課 vi命令   2000年/7月/10日

 

 

附加(append)命令

Vi提供了兩個附加插入命令:a和A。

a命令

該命令用於在游標當前所在位置之後追加新文字。新輸入的文字放在游標之後,在游標後的原文字將相應地向後移動。游標可在一行的任何位置。

[例15] 以例14原始情況為例,使用a命令,並輸入相應文字,螢幕顯示如下:

Welcome to vi world!This is an example!Come on!

~

~

本例中游標後的文字“Come on!”被新輸入的文字擠到了後面。

A命令

該命令與a命令不同的是,A命令將把游標挪到所在行的行尾,從那裡開始插入新文字。當輸入A命令後,游標自動移到該行的行尾。

a和A命令是把文字插入到行尾的唯一方法。

 

開啟(open)命令

不論是Insert命令也好,還是append命令也好,所插入的內容都是從當前行中的某個位置開始的。若我們希望在某行之前或某行之後插入一些新行,則應使用open命令。

Vi提供了兩個開啟命令:o和O。

o命令

該命令將在游標所在行的下面新開一行,並將游標置於該行的行首,等待輸入文字。要注意,當使用刪除字元時只能刪除從插入模式開始的位置以後的字元,對於以前的字元不起作用。而且還可以在文字輸入方式下輸入一些控制字元,例如,Ctrl+l即是插入分頁符,顯示為^L。

[例16] 以例14的原始情況為例,只是這次要在當前行下面一行輸入文字。使用o命令,並輸入相應文字,螢幕顯示如下:

Welcome to vi world!Come on!

This is an example!

~

~

新輸入的文字出現在原來文字所在行的下一行。

O命令

和o命令相反,O命令是在游標所在行的上面插入一行,並將游標置於該行的行首,等待輸入文字。

[例17] 與例14的原始情況相同,要在當前行的上面一行輸入文字。使用O命令並輸入文字後,螢幕顯示如下:

This is an example!

Welcome to vi world!Come on!

~

~

文字插入到了當前行之上。

11.3.4 文字修改

在命令模式下可以使用Vi提供的各種有關命令對文字進行修改,包括對文字內容的刪除、複製、取代和替換等。

 

 

文字刪除

在編輯文字時,經常需要刪除一些不需要的文字,我們可以用鍵將輸錯或不需要的文字刪除,但此時有一個限制就是當刪到行頭之後,再想刪上面那行的內容是不可能的。

在命令模式下,Vi提供了許多刪除命令。這些命令大多是以d開頭的。常用的有:

1. 刪除單個字元

x: 刪除游標處的字元。若在x之前加上一個數字n,則刪除從游標所在位置開始向右的n個字元。

X:刪除游標前面的那個字元。若在X之前加上一個數字n,則刪除從游標前面那個字元開始向左的n個字元。

顯然這兩個命令是刪除少量字元的快捷方法。

2. 刪除多個字元

dd:刪除游標所在的整行。在dd前可加上一個數字n,表示刪除當前行及其後n-1行的內容。

D或d$:兩命令功能一樣,都是刪除從游標所在處開始到行尾的內容。

d0:刪除從游標前一個字元開始到行首的內容。

dw:刪除一個單詞。若游標處在某個詞的中間,則從游標所在位置開始刪至詞尾。同dd命令一樣,可在dw之前加一個數字n,表示刪除n個指定的單詞。

如果使用者不小心進行了誤刪除操作,也不要緊,Vi提供了恢復誤操作的命令,並且可以將恢復的內容移動,放在文字的任何地方。恢復命令用² np,其中n為暫存器號。這是因為Vi內部有9個用於維護刪除操作的暫存器,分別用數字1,2,¼ ,9表示,它們分別儲存以往用dd命令刪除的內容。這些暫存器組成一個佇列,例如最近一次使用dd命令刪除的內容被放到暫存器1中;當下次再使用dd命令刪除文字內容時,Vi將把暫存器1的內容轉存到暫存器2中,而暫存器1中又將是最近一次dd命令刪除的內容。以此類推,Vi可以儲存有最近九次用dd命令刪除的內容,而前面的用dd命令刪除的內容則被拋棄。

[例18] 假設當前編輯檔案為xu.c

/* this is a example */

#include

void main( )

{

int i , j ;

printf( “ please input a number : / n ” );

scanf ( “ % d ” , &i ) ;

j = i + 100 ;

printf ( “ /n j = % d /n ” , j ) ;

return ;

}

我們對其進行如下操作:

將游標移至檔案第一行,按dd命令,此時檔案第一行的內容被刪除,且被刪除的內容儲存在暫存器1中;

按5j使游標下移至第一個printf語句行;

按dd命令將該行刪除,此時暫存器1中將儲存剛剛被刪除的內容:

printf (“ please input a number : n ” );

而暫存器1原有的內容:

/* this is a example */

則被儲存到暫存器2中;

在最末行模式下,也可以對檔案內容進行刪除,但它只能刪除整行,一次可將某個指定範圍內(起始行號,終止行號)的所有行全部刪除。需要注意的是,用此種方法進行刪除時,Vi並不把所刪內容放入暫存器中,因而當發生誤刪除操作時,不能用² np命令恢復,只能用u命令進行有限的恢復。

最後提一下,如何在文字輸入方式時將所輸入文字刪除。使用者使用組合鍵即可,此時游標將返回插入開始的位置,並且Vi仍處於文字輸入方式。

 

取消上一命令(Undo)

取消上一命令(Undo),也稱復原命令,是非常有用的命令,它可以取消前一次的誤操作或不合適的操作對檔案造成的影響,使之回覆到這種誤操作或不合適操作被執行之前的狀態。

取消上一命令有兩種形式,在命令模式下鍵入字元u和U。它們的功能都是取消剛才輸入的命令,恢復到原來的情況。小寫u和大寫U在具體細節上有所不同,二者的區別在於,大寫U命令的功能是恢復到誤操作命令前的情況,即如果插入命令後使用U命令,就刪除剛剛插入的內容;如果刪除命令後使用U命令,就相當於在游標處又插入剛剛刪除的內容。這裡把所有修改文字的命令都視為插入命令。也就是說,U命令只能取消前一步操作,如果用U命令撤消了前一步操作,當再按U鍵時,並不是撤消再前一步的操作,而是撤消了剛才U命令執行的操作,也就是又恢復到第一次使用U命令之前的狀態,結果是什麼都沒做。而小寫u命令的功能是把當前行恢復成被編輯前的狀態,而不管此行被編輯了多少次。

 

[例19] 原來螢幕顯示內容為:

#include

main ( )

{

}

在命令模式下輸入命令o,插入一新行,輸入需要插入的內容後再按回到命令模式,螢幕顯示內容為:

#include

main ( )

{

printf ( “ How do you do ! ” ) ;

}

若想取消這一插入操作,請按命令U後,螢幕恢復到原來顯示的情況。

注意:對於取消命令仍可以再使用取消命令。這時會產生一種“負負得正”的效果,檔案狀態將恢復到第一次執行取消命令之前的狀態,如同沒做任何操作一般。例如在上例中,再使用一次命令U,螢幕將顯示的內容仍為插入後的內容。

 

重複命令(Redo)

重複命令也是一個非常常用的命令。在文字編輯中經常會碰到需要機械地重複一些操作,這時就需要用到重複命令。它可以讓使用者方便地再執行一次前面剛完成的某個複雜的命令。

重複命令只能在命令模式下工作,在該模式下按“.”鍵既可。執行一個重複命令時,其結果是依賴於游標當前位置的。

[例20] 螢幕顯示內容為:

#include

main ( )

{

}

輸入命令o,並輸入一行內容後,再< Esc >返回到命令模式下,螢幕顯示內容為:

#include

main ( )

{

printf ( “ How do you do ! ” ) ;

}

此時輸入命令“.”,螢幕顯示內容為:

#include

main ( )

{

printf ( “ How do you do ! ” ) ;

printf ( “ How do you do ! ” ) ;

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-938914/,如需轉載,請註明出處,否則將追究法律責任。

相關文章