vi命令詳解(轉)

来源:https://www.cnblogs.com/sl0309/archive/2019/01/04/10217823.html
-Advertisement-
Play Games

vi編輯器是所有Unix及Linux系統下標準的編輯器,它的強大不遜色於任何最新的文本編輯器,這裡只是簡單地介紹一下它的用法和一小部分指令。由於對Unix及Linux系統的任何版本,vi編輯器是完全相同的,因此您可以在其他任何介紹vi的地方進一步瞭解它。Vi也是Linux中最基本的文本編輯器,學會它 ...


vi編輯器是所有Unix及Linux系統下標準的編輯器,它的強大不遜色於任何最新的文本編輯器,這裡只是簡單地介紹一下它的用法和一小部分指令。由於對Unix及Linux系統的任何版本,vi編輯器是完全相同的,因此您可以在其他任何介紹vi的地方進一步瞭解它。Vi也是Linux中最基本的文本編輯器,學會它後,您將在Linux的世界里暢行無阻。

1、vi的基本概念

  基本上vi可以分為三種狀態,分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分如下:

    1) 命令行模式command mode)

  控制屏幕游標的移動,字元、字或行的刪除,移動複製某區段及進入Insert mode下,或者到 last line mode。

    2) 插入模式(Insert mode)

  只有在Insert mode下,才可以做文字輸入,按「ESC」鍵可回到命令行模式。

    3) 底行模式(last line mode)

  將文件保存或退出vi,也可以設置編輯環境,如尋找字元串、列出行號……等。

    不過一般我們在使用時把vi簡化成兩個模式,就是將底行模式(last line mode)也算入命令行模式command mode)。

2、vi的基本操作

a) 進入vi

    在系統提示符號輸入vi及文件名稱後,就進入vi全屏幕編輯畫面:

   $ vi myfile

  不過有一點要特別註意,就是您進入vi之後,是處於「命令行模式(command mode)」,您要切換到「插入模式(Insert mode)」才能夠輸入文字。初次使用vi的人都會想先用上下左右鍵移動游標,結果電腦一直嗶嗶叫,把自己氣個半死,所以進入vi後,先不要亂動,轉換到「插入模式(Insert mode)」再說吧!

b) 切換至插入模式(Insert mode)編輯文件

  在「命令行模式(command mode)」下按一下字母「i」就可以進入「插入模式(Insert mode)」,這時候你就可以開始輸入文字了。

c) Insert 的切換

  您目前處於「插入模式(Insert mode)」,您就只能一直輸入文字,如果您發現輸錯了字!想用游標鍵往回移動,將該字刪除,就要先按一下「ESC」鍵轉到「命令行模式(command mode)」再刪除文字。

d) 退出vi及保存文件

  在「命令行模式(command mode)」下,按一下「:」冒號鍵進入「Last line mode」,例如:

: w filename (輸入 「w filename」將文章以指定的文件名filename保存)

: wq (輸入「wq」,存檔並退出vi)

: q! (輸入q!, 不存檔強制退出vi)

3、命令行模式(command mode)功能鍵

1). 插入模式

       按「i」切換進入插入模式「insert mode」,按"i"進入插入模式後是從游標當前位置開始輸入文件;

  按「a」進入插入模式後,是從目前游標所在位置的下一個位置開始輸入文字;

  按「o」進入插入模式後,是插入新的一行,從行首開始輸入文字。

2). 從插入模式切換為命令行模式

      按「ESC」鍵。

3). 移動游標

  vi可以直接用鍵盤上的游標來上下左右移動,但正規的vi是用小寫英文字母「h」、「j」、「k」、「l」,分別控制游標左、下、上、右移一格。

  按「ctrl」+「b」:屏幕往"後"移動一頁。

  按「ctrl」+「f」:屏幕往"前"移動一頁。

  按「ctrl」+「u」:屏幕往"後"移動半頁。

  按「ctrl」+「d」:屏幕往"前"移動半頁。

  按數字「0」:移到文章的開頭。

  按「G」:移動到文章的最後。

  按「$」:移動到游標所在行的"行尾"。

  按「^」:移動到游標所在行的"行首"

  按「w」:游標跳到下個字的開頭

  按「e」:游標跳到下個字的字尾

  按「b」:游標回到上個字的開頭

  按「#l」:游標移到該行的第#個位置,如:5l,56l。

4). 刪除文字

  「x」:每按一次,刪除游標所在位置的"後面"一個字元。

  「#x」:例如,「6x」表示刪除游標所在位置的"後面"6個字元。

  「X」:大寫的X,每按一次,刪除游標所在位置的"前面"一個字元。

  「#X」:例如,「20X」表示刪除游標所在位置的"前面"20個字元。

  「dd」:刪除游標所在行。

  「#dd」:從游標所在行開始刪除#行

5). 複製

  「yw」:將游標所在之處到字尾的字元複製到緩衝區中。

  「#yw」:複製#個字到緩衝區

  「yy」:複製游標所在行到緩衝區。

  「#yy」:例如,「6yy」表示拷貝從游標所在的該行"往下數"6行文字。

  「p」:將緩衝區內的字元貼到游標所在位置。註意:所有與"y"有關的複製命令都必須與"p"配合才能完成複製與粘貼功能。

6). 替換

  「r」:替換游標所在處的字元。

  「R」:替換游標所到之處的字元,直到按下「ESC」鍵為止。

7). 回覆上一次操作

  「u」:如果您誤執行一個命令,可以馬上按下「u」,回到上一個操作。按多次"u"可以執行多次回覆。

8). 更改

  「cw」:更改游標所在處的字到字尾處

  「c#w」:例如,「c3w」表示更改3個字

9). 跳至指定的行

  「ctrl」+「g」列出游標所在行的行號。

  「#G」:例如,「15G」,表示移動游標至文章的第15行行首。

4、Last line mode下命令簡介

  在使用「last line mode」之前,請記住先按「ESC」鍵確定您已經處於「command mode」下後,再按「:」冒號即可進入「last line mode」。

A) 列出行號

 「set nu」:輸入「set nu」後,會在文件中的每一行前面列出行號。

B) 跳到文件中的某一行

 「#」:「#」號表示一個數字,在冒號後輸入一個數字,再按回車鍵就會跳到該行了,如輸入數字15,再回車,就會跳到文章的第15行。

C) 查找字元

 「/關鍵字」:先按「/」鍵,再輸入您想尋找的字元,如果第一次找的關鍵字不是您想要的,可以一直按「n」會往後尋找到您要的關鍵字為止。

 「?關鍵字」:先按「?」鍵,再輸入您想尋找的字元,如果第一次找的關鍵字不是您想要的,可以一直按「n」會往前尋找到您要的關鍵字為止。

D) 保存文件

 「w」:在冒號輸入字母「w」就可以將文件保存起來。

E) 離開vi

 「q」:按「q」就是退出,如果無法離開vi,可以在「q」後跟一個「!」強制離開vi。

 「qw」:一般建議離開時,搭配「w」一起使用,這樣在退出的時候還可以保存文件。

5、vi命令列表

1、下表列出命令模式下的一些鍵的功能:

h

左移游標一個字元

l

右移游標一個字元

k

游標上移一行

j

游標下移一行

^

游標移動至行首

0

數字"0",游標移至文章的開頭

G

游標移至文章的最後

$

游標移動至行尾

Ctrl+f

向前翻屏

Ctrl+b

向後翻屏

Ctrl+d

向前翻半屏

Ctrl+u

向後翻半屏

i

在游標位置前插入字元

a

在游標所在位置的後一個字元開始增加

o

插入新的一行,從行首開始輸入

ESC

從輸入狀態退至命令狀態

x

刪除游標後面的字元

#x

刪除游標後的#個字元

X

(大寫X),刪除游標前面的字元

#X

刪除游標前面的#個字元

dd

刪除游標所在的行

#dd

刪除從游標所在行數的#行

yw

複製游標所在位置的一個字

#yw

複製游標所在位置的#個字

yy

複製游標所在位置的一行

#yy

複製從游標所在行數的#行

p

粘貼

u

取消操作

cw

更改游標所在位置的一個字

#cw

更改游標所在位置的#個字

2、下表列出行命令模式下的一些指令

w filename

儲存正在編輯的文件為filename

wq filename

儲存正在編輯的文件為filename,並退出vi

q!

放棄所有修改,退出vi

set nu

顯示行號

/或?

查找,在/後輸入要查找的內容

n

與/或?一起使用,如果查找的內容不是想要找的關鍵字,按n或向後(與/聯用)或向前(與?聯用)繼續查找,直到找到為止。

對於第一次用vi,有幾點註意要提醒一下:

1、用vi打開文件後,是處於「命令行模式(command mode)」,您要切換到「插入模式(Insert mode)」才能夠輸入文字。切換方法:在「命令行模式(command mode)」下按一下字母「i」就可以進入「插入模式(Insert mode)」,這時候你就可以開始輸入文字了。

2、編輯好後,需從插入模式切換為命令行模式才能對文件進行保存,切換方法:按「ESC」鍵。

3、保存並退出文件:在命令模式下輸入:wq即可!(別忘了wq前面的:)

在屏幕上移動

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"n”, 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!"n”);

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

printf(“Hello Mr.Huang!"n”);

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

printf(“Hello Mr.Huang!"n”);

e和E命令

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

b和B

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

[例12] 屏幕顯示如下:

printf(“Hello Mr.Huang!"n”);

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

printf(“Hello Mr.Huang!"n”);

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

printf(“Hello Mr.Huang!"n”);

按句移動游標

在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命令

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

附加(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 ! ” ) ;

文本內容的修改

文本內容的修改是指在編輯過程中,可以對文本中的某些字元,某些行進行修改,即用新輸入的文本代替需要修改的老文本,它等於先用刪除命令刪除需要修改的內容,然後再利用插入命令插入新的內容。所以在使用修改命令後,vi進入到文本輸入模式下,當輸入完新的內容後,一定要再按回到命令模式,否則Vi會一直認為是在文本輸入模式下,此時輸入的任何內容都被認為是修改的新內容。

Vi提供了三種修改命令,分別是c、C和cc。它們修改文本的範圍是由游標位置和游標移動命令二者限定的。下麵分別介紹這三種修改命令。

c命令

c後緊跟游標移動命令,限定修改內容的範圍是從游標當前位置開始到指定的位置為止。

[例21] 原來屏幕顯示內容為文件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 ;

}

輸入命令c7G時,屏幕顯示為:

/* this is a example */

#include

void main( )

{

int i , j ;

j = i + 100 ;

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

return ;

}

即把游標所在行至第7行(共2行)的內容刪除,併進入文本輸入模式,接著輸入:

int k ;

i = sqr ( k ) ;

最後按< Esc >鍵,結束修改,屏幕顯示為:

/* this is a example */

#include

void main( )

{

int i , j ;

int k ;

i = sqr ( k ) ;

j = i + 100 ;

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

return ;

}

由此可見,命令c中修改文本的範圍是由游標位置和游標移動命令二者限定的。

C、c$命令

C 、c$命令可以修改從游標當前位置開始到該行末尾或從游標當前位置開始到某行末尾範圍內的內容。

[例22] 屏幕顯示如下內容:

#include

輸入命令C後,屏幕顯示為:

#include <

接著輸入: math.h >,然後按< Esc > ,此時屏幕顯示內容為:

#include < math.h >

表示原文中的“stdio.h >”被修改為“math.h >”。

當在命令C之前加上數字n時,表示可以修改指定行數的內容。例如,3C命令就表示把游標所在位置的字元之後(註意不是整行)直到下麵兩個整行的內容刪除,由隨後輸入的內容代替。

cc命令

cc命令的功能和C相同,只是修改的範圍和C不同,它是修改從游標所在行的起始位(不管游標處於該行的何列)到該行末尾或指定某行末尾範圍內的內容。

[例23] 屏幕顯示如下內容:

#include

輸入命令cc後,屏幕顯示為:

接著輸入:#include < math.h >,然後按 ,此時屏幕顯示內容為:

#include < math.h >

可見,游標所在行的全部內容都由新輸入的內容所代替。

同命令C一樣,也可以在cc之前加上數字n,表示要從游標當前行算起一共修改n行的內容。例如,5cc表示先刪除游標所在行及其下麵的4行,然後輸入要修改的內容。

文本的替換

文本的替換即是用新輸入的文本代替原已有的文本。它同文本修改一樣,也是先執行刪除操作,再執行插入操作。

Vi提供的替換的命令有取代命令、替換命令和字替換命令。

1. 取代命令 :r和R

r:用隨後輸入的一個字元代替當前游標處的那個字元。

[例24] 屏幕上顯示為:

/* this as a program */

在命令模式下輸入命令ri,則結果顯示為:

/* this is a program */

此時當前游標處的字元被取代成“i”。

若在命令r之前加上一個數字,表示將要從當前游標處開始的指定數目的字元用在r後所輸入的字元替換。

[例25] 屏幕上顯示為:

/* this is a program */

在命令模式下輸入命令4rA,則結果顯示為:

/* this is a AAAAram */

此時把當前游標處的字元及其後的三個字元都取代為“A”。

R:用隨後輸入的文本取代從當前游標處及其後面的若幹字元,每輸入一個字元就取代原有的一個字元,直到按< Esc >鍵結束這次取代。若新輸入的字元數超過原有對應字元數,則多出部分就附加在後面。

[例26] 屏幕上顯示為:

/* this is a program */

main ()

輸入R,接著輸入:is a good example program * /,最後按鍵,屏幕顯示為:

/* this is a good example program * /

若在命令R之前加上一個數字,例如5R,則表示新輸入的文本重覆出現5次,但只取代一個被輸入文本所覆蓋的字元序列,當前行中未被覆蓋的內容仍保留下來,只是位置相應右移。

[例27] 屏幕上顯示為:

/* this is a program */

輸入4RAA,屏幕顯示為:

/* this is a AAAAAAAA/

值得一提的是,利用R取代文本內容時,新輸入的文本可以占多行,取代時也只有游標所在行的對應字元被覆蓋。

[例28] 屏幕顯示為:

/* this is a program */

輸入R,隨後輸入AA

B

C C < Esc >

屏幕顯示為:

/* this is a AA

B

C Cm */

可見新輸入的6個字元(包括空格,但不包括< Esc >)取代原行中的6個字元。

2. 替換命令:s和S

s(小寫):該命令表示用隨後輸入的文本替換當前游標所在的字元。

[例29] 屏幕上顯示為:

/* this is a program */

輸入s命令,游標所在的“a”消失,隨後輸入:

A good example<Esc>,顯示為:

/*this is A good example program */

如果只用一個新字元替換游標所在字元,則s命令與r命令功能類似,如sh與rh的作用都是將游標所在字元變為h。但二者也有區別,r命令僅完成置換,而s命令在完成置換同時,工作模式從命令方式轉為文本輸入方式。因此,s命令的一般使用方式是:s隨後是要替換的正文,最後一定是, 結束文本輸入模式,返回到命令模式。

可以在s前面加一個數字n,則表示用s後輸入的文本替換從游標所在字元開始及其後的n-1個字元(共n個字元)。

[例30]屏幕顯示為:

/* this is good program */

輸入4s命令後,屏幕顯示為:

/* this is program */

接著輸入a 隨後按<Esc>鍵,屏幕顯示為:

/* this is a program */

S(大寫):該命令表示用新打入的正文替換游標當前行(整行)(不管游標位於何列)。

[例31] 屏幕顯示為:

/* this is a program */

main ()

輸入S後,游標所在行成為空行,游標停在行的開頭。隨後輸入:

#include < stdio.h >

#include < math.h >

接著按< Esc >鍵,屏幕顯示為:

#include < stdio.h >

#include < math.h >

main ()

如果在S之前給出一個數字n,例如3,則表示有3行(包括游標當前行及其下麵2行)要被S命令之後輸入的正文所替換。

3. 字替換 cw

如果我們只希望將某個字的內容用其他文本串替換,則可用cw命令。cw所替換的是一個狹義的字。輸入這個命令後,Vi將把游標處的那個字刪除,然後用戶可輸入任何文本內容。輸入完成之後按鍵,Vi即用所輸入的內容替換原游標位置至相應字結尾的所有內容。

[例32] 屏幕顯示為:

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

在命令模式下輸入cw,接著輸入data後按鍵,屏幕顯示:

printf( “ please input a data :" n ” ) ;

即用“data”取代了“number”。

文本行的合併

Vi提供了將文本中的某些行進行合併的命令。該命令用J(大寫字母)表示,其功能是把游標所在行與下麵一行合併為一行。

[例33] 屏幕顯示為:

#include < stdio.h > /*this is a program */ main() 輸入命令J後,顯示為:

# includs < stdio.h > /*this is a program */

main()

如果在J命令之前給出一個數字n,例如3,則表示把游標當前行及其後面的2行(共3行)合併為一行。

[例34] 在原來屏幕顯示情況下,輸入3J命令,屏幕顯示為:

# include < stdio.h > /*this is a program */ main ( )

文本行的移動

在Vi中我們可以方便地將某個範圍內的文本行左右移動或從一個地方移至另外一個地方。

文本行的左右移動。

文本行左右移動的命令有 >、<、>> 和 <<四個。

(1)> 命令將限定正文行(屏幕的首行)向右移動,通常是8個空格,使用格式為:>游標移動命令。移動正文行的範圍由游標所在行和隨後打入的游標移動命令所限定。

[例35] 屏幕顯示為:

/* this is a example */

#include

void main( )

{

int i , j ;

int k ;

i = sqr ( k ) ;

j = i + 100 ;

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

return ;

}

輸入>4G後,屏幕顯示為:

/* this is a example */

#include

void main( )

{

int i , j ;

int k ;

i = sqr ( k ) ;

j = i + 100 ;

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

return ;

}

(2)< 命令將限定正文行向左移動。其使用方式與>命令相同,只是移動方向相反。例如,<6M,將游標當前行和屏幕顯示中間行之間的各行都左移8個空格。

(3)>> 命令將游標所在行右移8個空格。如果在>>命令之前給出一個數字n,例如4,則表示游標當前行及其下麵的3行(共4行)都右移8個空格。

[例36] 屏幕原顯示為:

/* this is a example */

#include

void main( )

{

int i , j ;

int k ;

i = sqr ( k ) ;

j = i + 100 ;

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

return ;

}

輸入4>>後,屏幕顯示為:

/* this is a example */

#include

void main( )

{

int i , j ;

int k ;

j = i + 100 ;

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

i = sqr ( k ) ;

return ;

}

(4)<< 命令將游標所在行左移8個空格。其使用與>>命令相同,只是移動方向相反。

文本行的異行移動

我們可以利用下麵的步驟完成文本行從一個地方移至另外一個地方。

將游標移至待移動文本的首行;

按ndd命令。其中n為待移動的行數。此時Vi將把待移動的文本行從文件中刪除,並將其放入到1號刪除寄存器中;

將游標移動到目的行處;

按² 1p將待移動的文本行從刪除寄存器中取出。

此時待移動的文本行就出現在目的位置處了。

上述方法雖然可以實現文本行的異行移動,但顯然太煩瑣。Vi還提供了另一種快捷的方法,就是在末行模式下使用命令m(Move命令)。使用方法為n m k,表示把第n行移至第k行的下方。

[例37] 屏幕顯示內容為:

/* this is a example */

#include

void main( )

{

int i , j ;

int k ;

i = sqr ( k ) ;

j = i + 100 ;

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

return ;

}

現在想使第5行移至第4行位置處,可在末行模式下輸入:

:5 m 3

然後按< Enter >,屏幕顯示為:

/* this is a example */

#include

void main( )

int i , j ;

{

int k;

i = sqr ( k ) ;

j = i + 100 ;

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

return ;

}

在命令m之前,還可以指定一個行號範圍(起始行號與終止行號),表示要把指定範圍內的文本行移到指定位置。例如:

:2,5 m 0

表示把文件中的第二行至第五行的內容移至文件頭(第零行之下,這個零行使一個虛行)。

Vi中的行號

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

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

:set number

需要說明的是,這裡加的行號只是顯示給用戶看的,它們並不是文件內容的一部分。

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

[例7]

#include

main ( )

{ int k ;

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

}

add( )

{ static int x=0;

x++ ;

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

}

~

~

~

~

~

“ example.c” [Modified] lines 4 of 10 --40%-- col 11

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

游標移動操作

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

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

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

在命令模式下,有很多移動游標的方法。不但可以使用四個方向鍵來移動游標,還可以用h、j、k、l這四個鍵代替四個方向鍵來移動游標,這樣可以避免由於不同機器上的不同鍵盤定義所帶來的矛盾,而且使用熟練後可以手不離開字母鍵盤位置就能完成所有操作,從而提高工作效率。另外還可以用、、和四個鍵或組合鍵移動游標。且以上這三種鍵在實現功能上是等價的。除此之外,還有一些移動游標的命令。下麵對它們的工作方式介紹如下:

、® (均稱為右向鍵)

右向鍵的作用是將游標向右移動一個位置。若在向右鍵前先輸入一個數字n,那麼游標就向右移動n個位置。例如5l表示游標向右移動5個位置。需要註意的是,游標移動不能超過當前行的末尾。若給定的n超過游標當前位置至行尾的字元個數,如果用右向鍵,游標只能移到行尾;如果用,游標移到下麵一行或幾行的適當位置。

h、、¬ (向左鍵)

執行一次向左鍵,游標向左移動一個位置。同向右鍵一樣,也可以在向左鍵的前面輸入一個數字n,那麼游標就向左移動n個位置。需要註意的是,如果用左向鍵,游標左移不能超出該行的開頭;如果用,游標移到上面一行或幾行的適當位置。

j、、¯ (向下鍵)

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

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

3j 游標下移3行,且游標所在列的位置不變。

3+或3 游標下移3行,且游標位於該行的行首。

k、、­ (向上鍵)

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

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

L (移至行首)

L 命令是將游標移到當前行的開頭,即將游標移至當前行的第一個非空白處(非製表符或非空格符)。

$(移至行尾)

該命令將游標移到當前行的行尾,停在最後一個字元上。若在$命令之前加上一個數字n,則游標下移n-1行併到達行尾。

[行號] G(移至指定行)

該命令將游標移至指定行號所指定的行的行首。這種移動稱為絕對定位移動。

[例8]

#include

main ( )

{ int k ;

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

}

add( )

{ static int x=0;

x++ ;

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

}

~

~

~

~

~

“ example.c” 12 lines, 125 characters

鍵入命令:6G後,屏幕顯示如下:

#include

main ( )

{ int k ;

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

}

add( )

{ static int x=0;

x++ ;

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

}

~

~

~

~

~

“ example.c” 12 lines, 125 characters

游標移到了第6行的行首。

若省略行號,則游標移至該文件的最後一行的行首,即無論該文件有多少屏,都跳至最後一行。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文主要從8個章節詳解vue技術揭秘,小編覺得挺有用的,分享給大家。 為了把 Vue.js 的源碼講明白,課程設計成由淺入深,分為核心、編譯、擴展、生態四個方面去講,並拆成了八個章節,如下: ...
  • 你們有沒有遇到過這樣的情況,ES6看過了,Promise的文字概念都懂,但是我要怎麼在項目中去寫一個Promise呢? 那天我就是帶著這樣的疑問去網上搜了下。最後成功地在項目中應用了Promise,只有實際成功使用一次,才能明白它的前因後果,明白它的用途。 1.這是一個vue的電商項目-商品詳情頁 ...
  • 這個案例網上是沒有的,屬於無忌獨創,當時在幫孩子輔導作業,小學科學,裡面有一點內容是關於人的牙齒,說牙齒分為:門齒、犬齒、臼齒,問閨女,為什麼這麼分呢?閨女說牙齒雖然都是用來咬食物,但是食物種類很多,咬碎需要的工具也不一樣,門齒用來切割食物,如:蘋果、梨;犬齒用來撕碎食物,如肉類;臼齒用來磨碎食物,... ...
  • 公眾號:SAP Technical 本文作者:matinal 原文出處:http://www.cnblogs.com/SAPmatinal/ 原文鏈接:【MM系列】SAP MM 非限制/可用庫存 前言部分 今天簡單討論一下MM的非限制使用庫存和可用庫存,如果文章有不正確的地方,請及時留言指出,我會第 ...
  • 今天我們來談談 Dubbo XML 配置相關內容。關於這部分內容我打算分為以下幾個部分進行介紹: Dubbo XML Spring 自定義 XML 標簽解析 Dubbo 自定義 XML 標簽解析 DubboBeanDefinitionParser.parse() End Dubbo XML 在本小節 ...
  • 這篇翻譯的不好 如果你看API文檔中的數組篇,你會發現類型一般寫成List.的寫法表示通用類型的數組(未明確指定數組中的數據類型)。通常情況泛型類型用E,T,S,K,V表示。 Why use generics? 為什麼用泛型 泛型是類型安全的(意思是你必須指定數據的類型),但是它的寫法比硬編碼指定類 ...
  • 開場白說點東西: { 抓住客戶的痛點、癢點、爽點,提出我們產品的核心價值。 產品定位 技術架構 以微服務為核心的前後端分離,業務積木裝配式技術架構。感測器採集,物聯網+互聯網轉換,大數據分散式、存儲、計算、可視化加持。消息引擎、搜索引擎、工作流引擎全方位技術支持。 研發模式 Scrum敏捷研發,讓每 ...
  • 本文代碼基於 python3.6 和 pygame1.9.4。 俄羅斯方塊是兒時最經典的游戲之一,剛開始接觸 pygame 的時候就想寫一個俄羅斯方塊。但是想到旋轉,停靠,消除等操作,感覺好像很難啊,等真正寫完了發現,一共也就 300 行代碼,並沒有什麼難的。 先來看一個游戲截圖,有點醜,好吧,我沒 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...