天天看點

Linux常見指令:螢幕文本編輯器Vi

http://www.ccidnet.com/images/tech/linux/zhuanti/mingling/index.htm

 mark先

本章介紹Linux上最常用的文本編輯器Vi。文本編輯器是所有計算機系統中最常使用的一種工具。使用者在使用計算機的時候,往往需要建立自己的檔案,無論是一般的文本檔案、資料檔案,還是編寫的源程式檔案,這些工作都離不開編輯器。

  Linux系統提供了一個完整的編輯器家族系列,如Ed、Ex、Vi和Emacs等,按功能它們可以分為兩大類:行編輯器(Ed、Ex)和全螢幕編輯器(Vi、Emacs)。行編輯器每次隻能對一行進行操作,使用起來很不友善。而全螢幕編輯器可以對整個螢幕進行編輯,使用者編輯的檔案直接顯示在螢幕上,修改的結果可以立即看出來,克服了行編輯的那種不直覺的操作方式,便于使用者學習和使用,具有強大的功能。

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

  本章中,我們将循序漸進地介紹如何使用Vi來建立、編輯、顯示以及處理檔案。(注:文中的大寫字母為[shift]鍵+相應的小寫字母的組合)

   Vi簡介

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

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

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

  指令行模式

  任何時候,不管使用者處于何種模式,隻要按一下鍵,即可使Vi進入指令行模式;我們在shell環境(提示符為$)下輸入啟動Vi指令,進入編輯器時,也是處于該模式下。

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

  文本輸入模式

  在指令模式下輸入插入指令i、附加指令a 、打開指令o、修改指令c、取代指令r或替換指令s都可以進入文本輸入模式。在該模式下,使用者輸入的任何字元都被Vi當做檔案内容儲存起來,并将其顯示在螢幕上。在文本輸入過程中,若想回到指令模式下,按鍵即可。

  末行模式

  末行模式也稱ex轉義模式。

  Vi和Ex編輯器的功能是相同的,二者主要差別是使用者界面。在Vi中,指令通常是單個鍵,例如i、a、o等;而在Ex中,指令是以按Enter鍵結束的正文行。Vi有一個專門的“轉義”指令,可通路很多面向行的Ex指令。在指令模式下,使用者按“:”鍵即可進入末行模式下,此時Vi會在顯示視窗的最後一行(通常也是螢幕的最後一行)顯示一個“:”作為末行模式的提示符,等待使用者輸入指令。多數檔案管理指令都是在此模式下執行的(如把編輯緩沖區的内容寫到檔案中等)。末行指令執行完後,Vi自動回到指令模式。例如:

  :1,$s / A / a / g

  則從檔案第一行至檔案尾将大寫A全部替換成小寫a。

  若在末行模式下輸入指令過程中改變了主意,可按鍵,或用倒退鍵将輸入的指令全部删除之後,再按一下倒退鍵,即可使Vi回到指令模式下。

  Vi編輯器的三種工作模式之間的轉換如圖11-1所示

  如果要從指令模式轉換到編輯模式,可以鍵入指令a或者i;如果需要從文本模式傳回,則按Esc鍵即可。在指令模式下輸入“:”即可切換到末行模式,然後輸入指令。

  第二十五課 Vi的進入與退出      2000年/6月/13日

  Vi 的進入

  使用者登入到系統中之後,系統給出提示符“$”。在提示符後鍵入Vi和想要編輯(或建立)的檔案名,便可進入Vi。 

[例1] 鍵入指令:

  $ vi example.c

  螢幕顯示如下:

  ~

  “ example.c” [New File]

  如果隻鍵入Vi,而不帶檔案名,也可以進入Vi。之後在光标處鍵入檔案内容,退出Vi時,隻需在退出指令後輸入檔案名即可。

  進入Vi之後,首先進入的就是指令模式,也就是說等待指令輸入而不是文本輸入。這時輸入的字母都将作為指令來解釋。光标停在螢幕第一行首位上(用表示),其餘各行行首均有一個“~”符号,表示該行為空行。最後一行也稱狀态行,顯示出目前正在編輯的檔案名以及其狀态。如本例是[New File],表示example.c是一個建立的檔案。如果example.c檔案已在系統中存在,那麼輸入上述指令後,則在螢幕上顯示出該檔案的内容,并且光标停在第一行的首位,在狀态行顯示出該檔案的檔案名、行數和字元數。

  [例2] 鍵入指令:

  然後鍵入:

  #include

  main ( )

  { int k ;

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

  }

  add( )

  { static int x=0;

  x++ ;

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

  “ example.c” [ New File]

  注意,在這裡我們為了節省篇幅起見,螢幕隻顯示15行。事實上,初始的顯示行數與使用者所用終端有關,一般的CRT終端可顯示25行。在視窗系統中,顯示行數與運作Vi的那個視窗有關。然而我們可以對顯示行數進行設定。例如,在能顯示25行的CRT終端上,讓Vi隻顯示15行。設定的方法将在本節後面介紹。

  當用Vi建立一個新檔案時,在進入Vi的指令中也可以不給出檔案名,當編輯完檔案需要儲存資料時,再由使用者指定檔案名。

  進入Vi時,使用者不僅可以指定一個待編輯的檔案名,而且還有許多附加操作。

  如果希望在進入Vi之後,光标處于檔案中特定的某行上,可在Vi後加上任選項+n,其中n為指定的行數。

  [例3] 鍵入指令:

  $ vi +5 example1.c

  後,螢幕顯示如下:

  “ example.c” 12 lines, 125 characters

  光标将位于檔案example1.c中的第5行上。

  如果希望在進入Vi之後光标處于檔案最末行,則隻需把指令中附加項“+”後面的數字n省略掉即可。

  在進入Vi時,除了可以指定一個光标起始行号之外,還可以在指令中指定一個模式串,此時在進入Vi後,光标就處于檔案中第一個與指定模式串相比對的那行上。

  [例4] 鍵入指令:

  $ vi +/int example1.c

  光标将位于檔案example1.c中的第3行上。

  使用Vi可以同時編輯多個檔案,隻要在進入Vi的指令中寫入所要操作的檔案即可,還可以使用通配符。

  [例5] 鍵入指令:

  $ vi *.cat

  就可以編輯所有字尾為cat的檔案了。當然,您還可以使用shell中内置的模式比對來裝載檔案,這樣會更富技巧性。一旦您在指令行中包含了所有的待編輯檔案名,就可以在Vi中友善地移來移去。

退出Vi

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

  在指令模式中,連按兩次大寫字母Z,若目前編輯的檔案曾被修改過,則Vi儲存該檔案後退出,傳回到shell;若目前編輯的檔案沒被修改過,則Vi直接退出, 傳回到shell。

  在末行模式下,輸入指令:w

  Vi儲存目前編輯檔案,但并不退出,而是繼續等待使用者輸入指令。在使用w指令時,可以再給編輯檔案起一個新的檔案名。

  [例6]

  :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指令功能相同。

  Vi中的行号

  Vi中的許多指令都要用到行号及行數等數值。若編輯的檔案較大時,自己去數是非常不友善的。為此Vi提供了給文本加行号的功能。這些行号顯示在螢幕的左邊,而相應行的内容則顯示在行号之後。

  使用的指令為:在末行方式下輸入指令:

  :set number

  需要說明的是,這裡加的行号隻是顯示給使用者看的,它們并不是檔案内容的一部分。

  在一個較大的檔案中,使用者可能需要了解光标目前行是哪一行,在檔案中處于什麼位置,可在指令模式下

繼續閱讀