本帖最後由 IT_man 於 2017-5-6 23:16 編輯 7 u3 C: U/ Q; r- ^
; F8 B1 l0 f4 O- ?- ~6 }
vi指令說明(完整版)1 {7 m7 s+ q% j" x4 `+ v
- vi 的操作模式
& l) ~4 k3 B4 t' |, [
4 \- c9 _- P8 D. [9 B2 `vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。
. N/ W" P i+ V; S2 P, S 如何進入輸入模式
4 `1 i% c' G% \, w( G" q a (append) 由游標之後加入資料。2 o2 T4 ~8 E' a; x% _, a) k
A 由該行之末加入資料。
% @" p' L! u! o A i (insert) 由游標之前加入資料。1 W$ n& e& J6 e9 B6 o$ m0 o( m& S7 P
I 由該行之首加入資料。8 I) [- F b- g0 r
o (open) 新增一行於該行之下供輸入資料之用。
$ {9 Y4 a7 O& U d, o7 | O 新增一行於該行之上供輸入資料之用。
3 J: C1 `# s5 k( @0 |3 w 如何離開輸入模式
/ N% p# e3 Z" f! J, R 《ESC》 結束輸入模式。
: u* m( X# w8 }( m0 L' v% ^' z ; I; v' x0 C! V0 v
1.游標之移動* p+ q# r9 K' X" Y' P
h 向左移一個字元。
$ P# A: B* ?5 ~: {5 B9 h" x+ o j 向上移一個字元。) l% n* z- I- Z
k 向下移一個字元。* v; f9 c4 V/ j9 E% {/ _5 q, @. V8 H8 }
l 向右移一個字元。
5 p! q6 h m6 |& b [' M) H 0 移至該行之首
' Z* _' _; ^* I $ 移至該行之末。; E& O, r9 S- G! N6 [' A, P9 k
^ 移至該行的第一個字元處。
7 L4 N' |8 F, r H 移至視窗的第一列。
4 D% I( k3 }( W$ w0 T3 V M 移至視窗的中間那列。! g6 u; D2 i: [# T
L 移至視窗的最後一列。
' O- w8 w) D( X/ J$ L5 A" P G 移至該檔案的最後一列。
- G& x. Y! Q6 \# i' l0 P + 移至下一列的第一個字元處。. g, M7 Z9 O4 T* ]" ]
- 移至上一列的第一個字元處。: N* k& U# J0 {$ m6 L
( 移至該句之首。 (註一)- D. a5 S, e0 z/ m+ M; T5 C
) 移至該句之末。' ^( n, J8 l, L# N8 f
{ 移至該段落之首。 (註二): A) V3 a7 @: _
} 移至該段落之末。/ w: c9 {6 Y N* r! Z. |
nG 移至該檔案的第 n 列。% l2 o8 U$ o4 Y1 }" U) c
n+ 移至游標所在位置之後的第 n 列。( U }/ r5 z+ I; q
n- 移至游標所在位置之前的第 n 列。
: z! N) a- O* s( c' B0 u+ P1 r <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。. B* l+ u& P* @* L* v2 i
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。 m& k+ M* N5 C8 H
註二:段落(paragraph)在vi中是指以空白行隔開的文字。+ _3 M r( ^+ }6 C5 `2 ?1 U4 K
6 z8 {7 U0 O+ m% T2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。+ @ B5 Y! ^: p$ T7 R$ \) v3 [3 @6 E3 E
<Ctrl><b> 視窗往上捲一頁。* k2 C1 g6 t6 v& }
<Ctrl><d> 視窗往下捲半頁。
8 r+ F2 R* {! b7 g8 G <Ctrl><u> 視窗往上捲半頁。
6 [3 x9 s7 P$ P% ? <Ctrl><e> 視窗往下捲一行。
! b+ M3 J P ]4 Q# ?, u <Ctrl><y> 視窗往上捲一行。0 F& k+ J7 g7 u
) G$ F5 F& E! H! O
3.刪除、複製及修改指令介紹 (此單元較少使用)
9 {' k0 V, P0 B7 y* W+ d d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
* ]- o4 B. Z9 T. Z1 [8 W4 ?* C Operator + Scope = command8 o$ C5 V& g4 B* {% a5 I9 n
(運算子) (範圍)
2 n3 N& d. \+ v. n& X3 k 運算子:
/ v4 V" K e* b; U d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
1 g( A& Q9 m1 e y 將資料(字組、行列、句子或段落)複製到緩衝區。
0 o4 z: A4 w( N) }2 S p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
' l! b1 D( ~+ n, c) e 料放置於游標所在位置之行列下。( `+ E- ]' w5 U6 G6 c
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
7 h( p+ ~' H1 s# p% V8 s. [* a 子等之資料,並插入新鍵資料。
! g3 L7 p) f( o 範圍:2 E. u' L$ d8 P8 _: z+ t
e 由游標所在位置至該字串的最後一個字元。% V$ @5 B8 a, w( l6 ?$ N& |; `
w 由游標所在位置至下一個字串的第一個字元。) V7 X0 `4 y. b/ h7 M5 B
b 由游標所在位置至前一個字串的第一個字元。
8 f3 b: q" b5 V. N0 t) M $ 由游標所在位置至該行的最後一個字元。
) a/ ]1 A% @7 h! Z6 ^+ C- ] { 0 由游標所在位置至該行的第一個字元。
) b* u) K2 g% l ) 由游標所在位置至下一個句子的第一個字元。
! y/ r5 C! R2 N" e ( 由游標所在位置至該句子的第一個字元。
- P8 B' W) J% U% z { 由游標所在位置至該段落的最後一個字元。* H1 X+ L- D9 w( M9 _
} 由游標所在位置至該段落的第一個字元。: c5 `- c+ W* v% a6 l# {; t3 X
整行動作0 |( }. E/ n- J( K
dd 刪除整行。
7 ` i$ z- a7 ~, k D 以行為單位,刪除游標後之所有字元。
% S* e/ k" k6 n cc 修改整行的內容。
0 S& |5 u( e6 o6 C yy yank整行,使游標所在該行複製到記憶體緩衝區。
/ w) o" U3 ]; R# T3 V0 ]: S( X X' I1 ?' d r
4.刪除與修改# B2 r2 K; X8 T4 f: {
x 刪除游標所在該字元。" b \* {; f0 }. J
X 刪除游標所在之前一字元。
0 ?3 _$ g. _ P, B2 n+ K# U dd 刪除游標所在該行。
8 c8 g( z4 C. D r 用接於此指令之後的字元取代(replace)游標所在字元。
& Z* S2 p' v7 T$ C* X 如: ra 將游標所在字元以 a 取代之。
1 J* T% o- ^* O/ f0 G R 進入取代狀態,直到《ESC》為止。
4 | r, {/ j7 s. N" ^ f! G s 刪除游標所在之字元,並進入輸入模式直到《ESC》。4 _% d, x w; f
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
& G9 D0 e, p- O
: ?# J% v! n q6 s8 c f) C1 a9 c* S5.搬移與複製
7 Q; Q' `. Q) G0 H8 B) m$ n7 k) _ 利用delete 及 put 指令可完成資料搬移之目的。
+ N; |7 X& p4 b1 ? 利用yank 及 put 指令可完成資料複製之目的。7 @/ F, P+ ~: R2 r
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令0 S% P. H3 P/ c- N' ^! o
可將緩衝區內的資料複製到螢幕上。
1 Q' U g9 c8 L H: D0 n3 y 例:2 d h! E5 Z$ n0 W
搬移一行 ‧在該行執行 dd. I H- |0 e# q0 c/ X' B( C$ d
‧游標移至目的地9 W) {" `0 P& n) a" f& X; X" K
‧執行 p
+ R$ c4 T; }" h! p6 p2 {" G: H 複製一行 ‧在該行執行 yy9 |, h% t0 g: `6 Z3 o: v
‧游標移至目的地
5 y- _4 ^; f; N3 Y ‧執行 p
8 \/ Z& O6 ~& k7 l9 V3 t
$ E* @" A" z3 S3 C+ d6.指令重複
5 `1 [+ i. L. r, g8 v 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n0 f2 s3 V9 i. B% s/ S
次。
/ b; ^/ q2 a: R& ` S; E: k 例:: y% u/ ]1 J% R% j
刪除10行 ‧10dd
( E8 p8 m0 b" l6 ]6 H, i& N7 C 複製10行 ‧10yy' k0 ?3 o. L4 W% F
‧游標移至目的地- m; Y4 }# H4 c, f% _
‧p
& b- l3 F- O* S2 u 指標往下移10行 ‧10j
( S6 s& q0 Q: ]2 h- I9 r) k `, G9 e$ q
7.取消前一動作(Undo)5 e( W' d2 d% ?4 A0 b0 @2 d
即復原執行上一指令前的內容。3 w) \2 E. p2 f: T E- M
u 恢復最後一個指令之前的結果。7 M" k* h) j2 v4 Q
U 恢復游標該行之所有改變。- z( `$ J, Z, }1 r% W/ h4 ^, G: u
6 e: p9 d* M& C0 |9 W/ J' Q" _
8.搜尋
% }% W8 b9 P8 o% S$ e/ W5 j, ^ 在vi中可搜尋某一字串,使游標移至該處。" m) f2 s( V6 b6 a* c9 G
/字串 往游標之後尋找該字串。9 V2 L& s$ A" ~4 b" g# {
?字串 往游標之前尋找該字串。
# F/ N1 B5 \0 b' w1 ` g) [ n 往下繼續尋找下一個相同的字串。# X" `' |, y& p0 G! z q
N 往上繼續尋找下一個相同的字串。
; R2 p; {% e5 @$ H: C. U; L2 p, g
3 Q$ l+ G. e, r7 n) X, G8 p+ g' B9.資料的連接* b6 n8 v7 x {- m
J 句子的連接。將游標所在之下一行連接至游標該行的後面。7 K! D* Z: x6 o! N1 k7 _) m4 u
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
3 X- M0 P% X: c( V- d, S (可利用a、i等指令)再按《Enter》即可。+ F$ L7 U$ z, Z0 n
) ], W2 L) e& X9 R
10.環境的設定& ~9 S: M& m4 N3 P% f
:setnu 設定資料的行號。9 U% w" [! C0 `( x; @4 m- H
:setnonu 取消行號設定。
! P2 }* `% G* J :setai 自動內縮。1 {! Z$ U# d/ h3 y4 @. n+ d
:setnoai 取消自動內縮。0 |& s. T% h4 U
自動內縮(automatic indentation)
4 W" R* \7 Y6 i' [; d 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
5 @ b8 z6 u: k0 A& Q3 Z" w/ K 動內縮的功能,用下例解釋之:
2 D" Z1 I2 g3 S+ t% ] ‧vi test
# \9 Y( L. n! I5 J ‧(進入編輯視窗後)
" l1 u/ ~1 A8 N" H( \ this is the test for auto indent/ A" S- Q. S# ?# B, H
《Tab》start indent ← :set ai (設自動內縮)! T5 S" J2 I1 _1 C3 b7 f& ^
《Tab》data
+ b8 c. f; d, _ 《Tab》data
?- Z; r4 O n( f 《Tab》data ← :set noai (取消自動內縮) J) P" F8 B* ^9 r! \ n+ b
the end of auto indent." t* P8 T6 }3 c
‧註:<Ctrl><d>可刪除《Tab》字元。' x+ j# Q6 k+ W
& y0 K- I! g: | X
11.ex指令. U, A4 q6 V+ w5 w9 {
讀寫資料
, J* y' m& [, j2 P6 @ K :w 將緩衝區的資料寫入磁碟中。/ y$ Y- l6 K! |" I
:10,20wtest 將第10行至第20行的資料寫入test檔案。* }; _- m( ~: `. P+ \' g* n5 O& c
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。- B8 z( s; V" I+ C; r, V/ y
:rtest 將test檔案的資料讀入編輯緩衝區的最後。
0 w0 h: q3 E& M V0 E& M% w 刪除、複製及搬移
; F) `# l+ P- B/ e :10,20d 刪除第10行至第20行的資料。
$ Q4 W! ~* w% h6 g4 ]3 l4 D :10d 刪除第10行的資料。- L( r0 w5 K1 N# b( a3 z% o
:%d 刪除整個編輯緩衝區。
% ]( m; }- A3 a* k; R :10,20co30 將第10行至第20行的資料複製至第30行之後。
' X/ ?1 q( k' z- Q* M :10,20mo30 將第10行至第20行的資料搬移至第30行之後。
5 [0 i8 ?# @; ~# B0 x; `2 L0 O, O 字串搜尋與取代
: R3 o$ j0 T- e/ I% w s(substitute)指令可搜尋某行列範圍。
) n( T% }$ r% `. e5 Z g(global)指令則可搜尋整個編輯緩衝區的資料。
9 Y4 j& z n2 H& J) k6 Q/ Q0 a s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條" r- M: q& X2 a7 H1 P( W5 _0 P
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
* h1 k* M, {3 S5 V :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
. D) n9 n! T( J8 ]5 K6 s :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
# m# S& M! E$ {8 }4 a, I: Y :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。$ R. E4 Q/ |1 P8 R# E
$ `4 q: a3 b, p
12.恢復編輯時被中斷的檔案+ k+ q8 {& A& L) g. n
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
2 B9 I' e- i2 w, t 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前! u/ { ^3 n$ ? f& l
的檔案內容。7 M3 ^8 c% O4 V! `# n' F
%vi -r filename2 S' [- X4 ]+ Z$ F3 O
* W2 ^5 f$ ?. V6 Q* }& E$ ?13.編輯多個檔案/ K( W. Z8 t* o0 n: Y0 j
vi亦提供同時編輯多個檔案的功能,方法如下:: O6 }' T5 E$ z. \) x
%vi file1 file2 ..
9 |6 b0 D6 X! F! Y3 @ 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
2 `! r9 t0 y6 I# ~ Y7 | 再利用 『:n』載入下一個檔案。
' L3 i; m. S5 y* ] [! V A
& q4 N3 a$ G) e3 q: [; \. ?3 Z參考:
A- A; V1 C- ]8 h
' }$ G0 b0 O' X" L( _( Z: Ihttp://chunchaichang.blogspot.tw/2010/08/vim-s.html
% d# A7 V! f6 {! i3 V+ _1 } |
|