1、vi的基本概念c#
基本上vi能夠分爲三種狀態,分別是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能區分以下:app
1) 命令行模式command mode)編輯器
控制屏幕光標的移動,字符、字或行的刪除,移動複製某區段及進入Insert mode下,或者到 last line mode。post
2) 插入模式(Insert mode)this
只有在Insert mode下,才能夠作文字輸入,按「ESC」鍵可回到命令行模式。命令行
3) 底行模式(last line mode)blog
將文件保存或退出vi,也能夠設置編輯環境,如尋找字符串、列出行號……等。隊列
不過通常咱們在使用時把vi簡化成兩個模式,就是將底行模式(last line mode)也算入命令行模式command mode)。字符串
2、vi的基本操做input
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,有幾點注意要提醒一下:
一、用vi打開文件後,是處於「命令行模式(command mode)」,您要切換到「插入模式(Insert mode)」纔可以輸入文字。切換方法:在「命令行模式(command mode)」下按一下字母「i」就能夠進入「插入模式(Insert mode)」,這時候你就能夠開始輸入文字了。
二、編輯好後,需從插入模式切換爲命令行模式才能對文件進行保存,切換方法:按「ESC」鍵。
三、保存並退出文件:在命令模式下輸入: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行的行首。
若省略行號,則光標移至該文件的最後一行的行首,即不管該文件有多少屏,都跳至最後一行。