- LAMP網站開發黃金組合Linux+Apache+MySQL+PHP
- 楊明華等編著
- 6366字
- 2018-12-29 19:23:34
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命令功能相同。
- Getting Started with Clickteam Fusion
- 樂高機器人EV3設計指南:創造者的搭建邏輯
- 網頁編程技術
- TIBCO Spotfire:A Comprehensive Primer(Second Edition)
- 群體智能與數據挖掘
- 數據庫原理與應用技術
- 人工智能與人工生命
- Windows 7寶典
- Arduino &樂高創意機器人制作教程
- ESP8266 Home Automation Projects
- Mastering ServiceNow Scripting
- 手機游戲程序開發
- INSTANT Munin Plugin Starter
- 從零開始學SQL Server
- 數據要素:全球經濟社會發展的新動力