官术网_书友最值得收藏!

2.4 Linux下的Vi文本編輯器

文本編輯器是所有計算機系統中最常使用的一種工具。用戶在使用計算機的時候,往往需要建立自己的文件,無論是一般的文本文件、數據文件,還是編寫的源程序文件,這些工作都離不開編輯器。

Linux系統提供了一個完整的編輯器家族系列,如Ed、Ex、Vi和Emacs等,按功能可以將其分為兩大類:行編輯器(Ed、Ex)和全屏幕編輯器(Vi、Emacs)。行編輯器每次只能對一行進行操作,使用起來很不方便。而全屏幕編輯器可以對整個屏幕進行編輯,用戶編輯的文件直接顯示在屏幕上,修改的結果可以立即看出來,克服了行編輯的那種不直觀的操作方式,便于用戶學習和使用,具有強大的功能。本節將推薦介紹使用Vi編輯器進行Linux下的編程。

2.4.1 Vi編輯器介紹

Vi是Linux系統的第一個全屏幕交互式編輯程序,從誕生至今該編輯器一直得到廣大用戶的青睞,歷經數十年仍然是人們主要使用的文本編輯工具,足見其生命力之強,而強大的生命力是其強大的功能帶來的。

Vi是“Visual interface”的簡稱,它在Linux上的地位就仿佛Edit程序在DOS上一樣。其可以執行輸出、刪除、查找、替換、塊操作等眾多文本操作,而且用戶可以根據自己的需要對其進行定制,這是其他編輯程序所沒有的。

Vi不是一個排版程序,不像Word或WPS那樣可以對字體、格式、段落等其他屬性進行編排,它只是一個文本編輯程序。

Vi沒有菜單,只有命令,且命令繁多。Vi有三種基本工作模式:命令行模式、文本輸入模式和末行模式。

1.命令行模式

任何時候,不管用戶處于何種模式,只要按一下鍵,即可使Vi進入命令行模式;用戶在shell環境下輸入啟動Vi命令,進入編輯器時,也是處于該模式下。

在該模式下,用戶可以輸入各種合法的Vi命令,用于管理自己的文檔。此時從鍵盤上輸入的任何字符都被當作編輯命令來解釋,若輸入的字符是合法的Vi命令,則Vi在接受用戶命令之后完成相應的動作。但要注意的是,所輸入的命令并不在屏幕上顯示出來。若輸入的字符不是Vi的合法命令,Vi會響鈴提示用戶。

2.文本輸入模式

在命令模式下輸入插入命令i、附加命令a、打開命令o、修改命令c、取代命令r或替換命令s都可以進入文本輸入模式。在該模式下,用戶輸入的任何字符都被Vi當作文件內容保存起來,并將其顯示在屏幕上。在文本輸入過程中,若想回到命令模式下,按鍵即可。

3.末行模式

末行模式也稱ex轉義模式。Vi和Ex編輯器的功能是相同的,兩者主要區別是用戶界面。在Vi中,命令通常是單個鍵,例如i、a、o等;而在Ex中,命令是以按回車鍵結束的正文行。Vi有一個專門的“轉義”命令,可訪問很多面向行的Ex命令。在命令模式下,用戶按“:”鍵即可進入末行模式下,此時Vi會在顯示窗口的最后一行(通常也是屏幕的最后一行)顯示一個“:”作為末行模式的提示符,等待用戶輸入命令。多數文件管理命令都是在此模式下執行的(如把編輯緩沖區的內容寫到文件中等)。末行命令執行完后,Vi自動回到命令模式。若在末行模式下輸入命令過程中改變了主意,可按退格鍵將輸入的命令全部刪除之后,再按一下退格鍵,即可使Vi回到命令模式下。

Vi編輯器的三種工作模式之間的轉換關系如下:

● 如果要從命令模式轉換到編輯模式,可以鍵入命令a或者i;

● 如果需要從文本模式返回,則按Esc鍵即可;

● 在命令模式下輸入“:”即可切換到末行模式,然后輸入命令。

2.4.2 啟動Vi編輯器

使用Vi進行編輯工作的第一步是進入該編輯界面,Linux提供的進入Vi編輯器界面的命令如表2.1所示:

表2.1 進入Vi命令

下面給出使用上述命令的幾個例子:

    //打開test.c文件,進行編輯,該文件本來不存在
    #vi test.c
    //輸入如下幾行
    #include <stdio.h>
    #include <string.h>
    int main()
    {
        printf("this is a test\n");
        return 0;
    }
    //打開上述創建的test.c源文件,并且將光標置于第5行首,也就是printf所在行首
    #vi +5 test.c
    //再次打開上述test.c文件,將光標置于第一個與int匹配的串處,也就是第3行
    #vi +/int test.c
    //同時打開系統中的test.c,job.i文件進行編輯
    #vi test.c job.i

2.4.3 顯示Vi中的行號

Vi中的許多命令都要用到行號及行數等數值。若編輯的文件較大時,自己去數是非常不方便的。為此Vi提供了給文本加行號的功能。這些行號顯示在屏幕的左邊,而相應行的內容則顯示在行號之后。使用的命令為:在末行方式下輸入命令:

    :se nu

在一個較大的文件中,用戶可能需要了解光標當前行是哪一行,在文件中處于什么位置,可在命令模式下用組合鍵,此時Vi會在顯示窗口的最后一行顯示出相應信息。該命令可以在任何時候使用。

下面給出使用該命令的例子:

    //使用Vi命令打開文件test.c
    #vi test.c
    //在末行方式下輸入命令:set number,結果如下
    1 #include <stdio.h>
    2 #include <string.h>
    3 int main()
    4 {
    5        printf("this is a test\n");
    6        return 0;
    7 }

在末行方式下,我們可以輸入命令se nu(set number的縮寫)來獲得光標當前行的行號與該行內容。

2.4.4 光標移動操作

全屏幕文本編輯器中,光標的移動操作無疑是最經常使用的操作了。用戶只有熟練地使用移動光標的這些命令,才能迅速準確地到達所期望的位置處進行編輯。

Vi中的光標移動既可以在命令模式下,也可以在文本輸入模式下,但操作的方法不盡相同。

在文本輸入模式下,可直接使用鍵盤上的四個方向鍵移動光標。

在命令模式下,有很多移動光標的方法。不但可以使用四個方向鍵來移動光標,還可以用h、j、k、l這四個鍵代替四個方向鍵來移動光標,這樣可以避免由于不同機器上的不同鍵盤定義所帶來的矛盾,而且使用熟練后可以手不離開字母鍵盤位置就能完成所有操作,從而提高工作效率。另外還可以用h、j、k和l四個鍵或組合鍵移動光標。且以上這三種鍵在實現功能上是等價的。命令前面加上數字n,則表示光標下移n行。

Vi除了可以用向下鍵將光標下移外,還可以用鍵和“+”鍵將光標下移一行或n行(不包括本行在內),但此時光標下移之后將位于該行的第一個字符處。例如:

3j:光標下移3行,且光標所在列的位置不變;

3+或3:光標下移3行,且光標位于該行的行首;

執行一次向上鍵光標向上移動一個位置(即一行),但光標所在的列不變。同樣在這些命令前面加上數字n,則光標上移n行;

若希望光標上移之后,光標位于該行的行首,則可以使用命令“-”。

另外,還有如下的光標操作命令:

● L(移至行首):L命令是將光標移到當前行的開頭,即將光標移至當前行的第一個非空白處(非制表符或非空格符);

● $(移至行尾):該命令將光標移到當前行的行尾,停在最后一個字符上。若在$命令之前加上一個數字n,則光標下移n-1行并到達行尾;

● [行號]G(移至指定行):該命令將光標移至指定行號所指定的行的行首。這種移動稱為絕對定位移動。

2.4.5 屏幕命令

屏幕命令是以屏幕為單位移動光標的,常用于文件的滾屏和分頁。需要注意的是,屏幕命令不是光標移動命令,不能作為文本限定符用于刪除命令中。在命令模式下和文本輸入模式下均可以使用屏幕滾動命令。

1.滾屏命令

關于滾屏命令有兩個:

● [Ctrl+U]組合鍵:將屏幕向前(文件頭方向)翻滾半屏;

● [Ctrl+D]組合鍵:將屏幕向后(文件尾方向)翻滾半屏。

可以在這兩個命令之前加上一個數字n,則屏幕向前或向后翻滾n行。并且這個值被系統記住,以后再用[Ctrl+U]組合鍵和[Ctrl+D]組合鍵滾屏時,將仍然翻滾相應的行數。

2.分頁命令

關于分頁命令也有兩個:

● [Ctrl+F]組合鍵:將屏幕向文件尾方向翻滾一整屏(即一頁);

● [Ctrl+B]組合鍵:將屏幕向文件首方向翻滾一整屏(即一頁)。

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

3.狀態命令

命令顯示在Vi狀態行上的Vi狀態信息,包括正在編輯的文件名、是否修改過、當前行號、文件的行數以及光標之前的行占整個文件的百分比。使用[Ctrl+G]組合鍵。

4.屏幕調零命令

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

● [行號] z [行數] <回車>

● [行號] z [行數] .

● [行號] z [行數] _

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

下面是一些使用屏幕調零的例子:

8z16<回車>:將文件中的第8行作為屏幕顯示的首行,并一共顯示16行。

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

15z 5_:將文件中的第15行作為屏幕顯示的最末行,顯示行數為5行。

2.4.6 文本插入命令

在命令模式下用戶輸入的任何字符都被Vi當作命令加以解釋執行,如果用戶要將輸入的字符當作是文本內容時,則首先應將Vi的工作模式從命令模式切換到文本輸入模式。Vi提供了兩個插入命令:i和I。

1.i命令

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

舉個例子來進行說明。

    //有一正在編輯的文件,如下所示
    This is a test!Go on!
    //光標位于第一個"!"上,需在其前面插入:This is added by me!
    //使用i命令,并輸入相應文本后,屏幕顯示如下:
    This is a test This is added by me!!Go on!

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

2.I命令

該命令是將光標移到當前行的行首,然后在其前插入文本。

2.4.7 附加(append)命令

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

1.a命令

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

下面給出一個使用該命令的例子:

    //使用a命令,并輸入相應文本,屏幕顯示如下(原始文本內容為:This is a test!)
    This is a test!Go on!Come on!

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

2.A命令

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

2.4.8 打開(open)命令

不論是Insert命令,還是append命令,所插入的內容都是從當前行中的某個位置開始的。若我們希望在某行之前或某行之后插入一些新行,則應使用open命令。Vi提供了兩個打開命令:o和O。

1.o命令

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

2.O命令

和o命令相反,O命令是在光標所在行的上面插入一行,并將光標置于該行的行首,等待輸入文本。

2.4.9 文本修改命令

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

1.文本刪除

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

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

● 刪除單個字符

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

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

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

● 刪除多個字符

? 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可以保存有最近9次用dd命令刪除的內容,而前面的用dd命令刪除的內容則被拋棄。

下面給出一個使用上述命令的例子:

    //假設當前編輯文件為xu.c
    /* this is a example */
    #include
    int main( )
    {
    int i,j ;
    printf( " please input a number : / n " );
    scanf ( " % d " ,&i );
    j = i + 100 ;
    printf ( " /n j = % d /n " ,j );
    return 0;
    }

對其進行如下操作:

首先,將光標移至文件第一行,按dd命令,此時文件第一行的內容被刪除,且被刪除的內容保存在寄存器1中;

然后,按5j使光標下移至第一個printf語句行;

最后,按dd命令將該行刪除,此時寄存器1中將保存剛剛被刪除的內容:

    printf (" please input a number :\ n " );

而寄存器1原有的內容:

    /* this is a example */

則被保存到寄存器2中;

在最末行模式下,也可以對文件內容進行刪除,但其只能刪除整行,一次可將某個指定范圍內(起始行號,終止行號)的所有行全部刪除。

2.取消上一命令(Undo)

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

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

下面給出一個例子:

原來屏幕顯示內容為:

    #include
    void main ()
    {
    }

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

    #include
    void main ()
    {
    printf ("this is a test\n");
    }

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

3.重復命令(Redo)

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

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

下面是一個實際的例子:

屏幕顯示內容為:

    #include
    main ( )
    {
    }

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

    #include
    main ( )
    {
    printf ("this is a test\n");
    }

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

    #include
    main ( )
    {
    printf ("this is a test\n");
    printf ("this is a test\n");

2.4.10 退出Vi

當編輯完文件,準備退出Vi返回到shell時,可以使用以下幾種方法之一。

● 在命令模式中,連按兩次大寫字母Z,若當前編輯的文件曾被修改過,則Vi保存該文件后退出,返回到shell;若當前編輯的文件沒被修改過,則Vi直接退出,返回到shell。

● 在末行模式下,輸入命令:w。Vi保存當前編輯文件,但并不退出,而是繼續等待用戶輸入命令。在使用w命令時,可以再給編輯文件起一個新的文件名。如下所示:

    :w newfile。

此時Vi將把當前文件的內容保存到指定的newfile中,而原有文件保持不變。若newfile是一個已存在的文件,則Vi在顯示窗口的狀態行給出提示信息:

    File exists(use ! to override)

此時,若用戶真的希望用文件的當前內容替換newfile中原有內容,可使用命令:w! newfile,否則可選擇另外的文件名來保存當前文件。

● 在末行模式下,輸入命令:q,系統退出Vi返回到shell。若在用此命令退出Vi時,編輯文件沒有被保存,則Vi在顯示窗口的最末行顯示如下信息:No write since last change (use ! to overrides),提示用戶該文件被修改后沒有保存,然后Vi并不退出,繼續等待用戶命令。若用戶就是不想保存被修改后的文件而要強行退出Vi時,可使用命令:q!,Vi放棄所作修改而直接退到shell下。

● 在末行模式下,輸入命令:wq。Vi將先保存文件,然后退出Vi返回到shell。

● 在末行模式下,輸入命令:x。該命令的功能同命令模式下的ZZ命令功能相同。

主站蜘蛛池模板: 连南| 垦利县| 若尔盖县| 武汉市| 比如县| 潜江市| 南宫市| 南昌县| 贞丰县| 探索| 永和县| 米易县| 陇西县| 白水县| 嘉义县| 南投县| 启东市| 林口县| 固阳县| 花莲市| 南昌市| 邹平县| 泗阳县| 西乌| 剑河县| 淅川县| 七台河市| 宣化县| 青神县| 无锡市| 海口市| 穆棱市| 棋牌| 正宁县| 胶州市| 三台县| 鹰潭市| 双柏县| 福建省| 张家川| 二连浩特市|