本帖最後由 IT_man 於 2017-5-6 23:16 編輯 " k/ w) e- }4 K/ K! G
( @9 J2 z; B: y! ~! zvi指令說明(完整版)
7 u3 e6 }) v# ~- vi 的操作模式( Y/ d4 h* r; s/ J/ W7 B
' B* r& R( _0 {' E8 E# E9 I
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式. c% I B, [. Q. f) t% |) p0 F$ V
+ E& K8 p) i4 R4 R. }5 W
如何進入輸入模式9 y# V& I7 I, n$ B' D
a (append) 由游標之後加入資料。/ |9 L0 E: C; ~
A 由該行之末加入資料。
2 u9 H- [! e0 g- i i (insert) 由游標之前加入資料。: I; _/ N% |* G5 |; N. W
I 由該行之首加入資料。, |) q* t" ?% C- [" A. Z! O E
o (open) 新增一行於該行之下供輸入資料之用。! L V0 C/ a# g4 r+ B6 ~% f
O 新增一行於該行之上供輸入資料之用。; t0 {9 M. r1 G# k" v0 J9 t5 W1 ?+ p
如何離開輸入模式
" G( N y/ f f5 b1 O, h 《ESC》 結束輸入模式。
4 k" T; Y+ [/ {" @+ w- 指令模式
1 D9 F: z5 R: i0 ]9 V- f
- I4 {3 M4 N) a& i5 o/ T0 s( o, N
1.游標之移動+ ^, @+ m3 k; f
h 向左移一個字元。5 \' u, ]9 p! f: j0 D( `7 _. q, |4 U
j 向上移一個字元。
4 R, P9 y; {% _9 x& e" W9 s k 向下移一個字元。
; X. v$ E4 C8 i) ~+ v l 向右移一個字元。
) z7 O7 {' j2 `( Z; {6 q 0 移至該行之首
" [6 {3 Y0 U1 j0 N, l; s7 ^9 B# ? $ 移至該行之末。
7 t" o( q' D3 L% [* q ^ 移至該行的第一個字元處。
# S, T" E& l u# g* Q H 移至視窗的第一列。
6 T) I& ^, ]- Y7 f! P E M 移至視窗的中間那列。
]! p8 I' w: }2 m. l" F L 移至視窗的最後一列。# F9 q! Y# `9 ]4 u1 K A
G 移至該檔案的最後一列。1 k7 s" v' ^7 ^4 o0 o3 d. v; x
+ 移至下一列的第一個字元處。3 ]7 {( Z4 k# `2 _5 A3 n, c
- 移至上一列的第一個字元處。; u4 x5 q. L, B% z; _! Y, `# k
( 移至該句之首。 (註一)
$ C# O$ U4 N" y, K7 q ) 移至該句之末。
# T2 T4 Q+ [ _% a1 F { 移至該段落之首。 (註二)- S* P! [* W- |
} 移至該段落之末。/ ?# y; v9 x: u/ C
nG 移至該檔案的第 n 列。
5 c8 _, ?1 ~2 k- c8 y$ j n+ 移至游標所在位置之後的第 n 列。
' W0 Y. X! R+ m: v$ V$ L. @ n- 移至游標所在位置之前的第 n 列。 r3 ?/ C* o- z
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。! ]- Z' a3 b( v" B
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。) ~7 K/ x# |- Y
註二:段落(paragraph)在vi中是指以空白行隔開的文字。" @# M2 o$ u9 S
I9 ~; y6 \5 k# A1 D- l5 Z1 D: s5 M2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
$ f* D4 N: ]: {/ h <Ctrl><b> 視窗往上捲一頁。2 ]4 N; M9 b" U8 u N3 @# e8 F! e
<Ctrl><d> 視窗往下捲半頁。& x7 q R0 Y: T7 [/ ^
<Ctrl><u> 視窗往上捲半頁。
% Q9 f }1 `) p; V7 F4 s. ? <Ctrl><e> 視窗往下捲一行。/ E) x% h. `. X: X
<Ctrl><y> 視窗往上捲一行。3 A5 u. {" c; l Z: L
$ h$ [. ?0 C: @$ Q/ K& f$ X3.刪除、複製及修改指令介紹 (此單元較少使用)$ c$ ^1 p# y! k: t! [& _* A% |
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
/ Q: z: @/ Z m9 i0 ?/ N Operator + Scope = command
- {6 u' t9 \) i9 O) f Y9 {: Q (運算子) (範圍)
0 a) h+ n! \1 A0 s( @ 運算子:/ T1 Q1 s' C4 c/ w2 u
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。! h- F6 G8 o# \$ _" j( k
y 將資料(字組、行列、句子或段落)複製到緩衝區。) ^: d; F W. A( y7 `3 E
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資0 @8 E/ Q4 F ~; @, D- c2 l5 ?& d
料放置於游標所在位置之行列下。
. b5 `6 {6 b) W c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句& G% z I, L0 B# l. [( J
子等之資料,並插入新鍵資料。
9 ?7 A x# F; |: [' g. k3 S 範圍:& x9 w$ D/ _1 \. b; K& ?
e 由游標所在位置至該字串的最後一個字元。7 g- h0 v! H. D% N6 v5 T7 G) L8 y
w 由游標所在位置至下一個字串的第一個字元。9 u& E! g9 _0 p' b% f! {- K* C
b 由游標所在位置至前一個字串的第一個字元。, C7 K! q+ J7 `; x
$ 由游標所在位置至該行的最後一個字元。% ^! g' i8 {: Y
0 由游標所在位置至該行的第一個字元。8 X$ C; z% c3 I4 w+ x( K: N6 ]1 W! C
) 由游標所在位置至下一個句子的第一個字元。. o5 {7 g, C+ \- e2 q# L. F
( 由游標所在位置至該句子的第一個字元。' y" h# \! T$ ^+ B1 B6 R% ]
{ 由游標所在位置至該段落的最後一個字元。
5 _+ V/ Q5 e: }. J7 a } 由游標所在位置至該段落的第一個字元。! ]9 |' q+ [ ?) c: J+ |+ @5 m" A
整行動作) n ^$ h2 o, i8 Q4 ]1 T
dd 刪除整行。
: A2 d: R* r4 n+ A1 \" r/ n. r D 以行為單位,刪除游標後之所有字元。
]' s3 g9 [; Q1 ` cc 修改整行的內容。5 }% N/ M- a! X* X S2 K1 t
yy yank整行,使游標所在該行複製到記憶體緩衝區。% B/ p4 v1 ^" r0 ?6 v* ?2 x
/ O1 U- | P0 U" _4.刪除與修改
; O! c; A8 a: J: g x 刪除游標所在該字元。
0 j( o. U7 U9 } X 刪除游標所在之前一字元。
# V( a9 s3 G9 ~, F* r8 Q dd 刪除游標所在該行。
R# w3 f1 I$ A# K* i; y8 h, E; c r 用接於此指令之後的字元取代(replace)游標所在字元。1 ?) c0 C. \' u; i7 ]
如: ra 將游標所在字元以 a 取代之。0 Z9 W- w* K4 X) o1 h0 K4 Y% ]3 h
R 進入取代狀態,直到《ESC》為止。+ b/ k& D# q7 d9 h
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
0 `% }! J7 c7 _3 {, Z S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。/ y, B1 d! ^3 n% j% ?+ f5 N
) R9 y( f0 \/ o9 n4 {, K
5.搬移與複製
8 |/ L4 J9 L4 F8 @ 利用delete 及 put 指令可完成資料搬移之目的。1 d1 r, ]8 W- Q" f7 Y7 S: r k* X
利用yank 及 put 指令可完成資料複製之目的。' f4 O* ~+ n v4 w
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
' t" `6 U8 t+ v) }+ x. b 可將緩衝區內的資料複製到螢幕上。
2 r. P+ }" m2 A) O" S* U. R6 o: V 例:; f, X7 A3 t# u5 g. A# r7 g& _( I
搬移一行 ‧在該行執行 dd0 E7 Y5 @. o8 I. n, C
‧游標移至目的地# C& w5 A9 t9 V5 J' y* u" y5 v/ Z2 ]* G
‧執行 p% L& a7 d5 R* H3 V; e$ d
複製一行 ‧在該行執行 yy
6 K% z1 a \( q6 C& U ‧游標移至目的地
* V& j H& V' ^ ‧執行 p; o: ]( Q; n9 c& P( n. `
, |# H+ z8 c$ D, y6.指令重複
. t) G! B0 B( V, V8 q! |6 c* h 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n1 b8 P0 }% h! u. T/ T9 y
次。
! S+ P, i- m$ I1 a, O 例:' f v: q3 ^2 G: d( W. ~' u1 b
刪除10行 ‧10dd/ r/ S, T: Y+ \) }
複製10行 ‧10yy
2 H1 U3 Y, [; O8 b8 h# K ‧游標移至目的地
. w) t0 @+ y* f. Y6 Q! Y ‧p
4 u- j5 ?0 |4 `& p0 A, \* ` 指標往下移10行 ‧10j
, R u ]# k* d) v @8 z+ X& t* [2 J) R+ c8 h' ~3 q
7.取消前一動作(Undo)9 f! H& y) ^ H/ ^7 l' ]* s8 [! f
即復原執行上一指令前的內容。
z5 M P& j# g, ^ Q3 F u 恢復最後一個指令之前的結果。9 i0 P3 K, q* [- y
U 恢復游標該行之所有改變。
/ \8 v5 W D! d: |$ Q
8 F* x/ z7 o5 a% b& s- }, J5 k8.搜尋' n" g8 K0 J8 T1 n6 g
在vi中可搜尋某一字串,使游標移至該處。
) R. o9 y, K4 ?3 E6 `" ]% O; g /字串 往游標之後尋找該字串。
3 C& \+ [( c+ P5 q, e ?字串 往游標之前尋找該字串。
, s3 ]( ^! c* ^1 j* C K) C n 往下繼續尋找下一個相同的字串。
( v U7 n. J& r! \ N 往上繼續尋找下一個相同的字串。7 E/ F) i ]3 }( A" W
/ t' W2 r4 w, Q4 B$ Z) S6 u1 Y9 m# v9.資料的連接
% s& j% c4 I$ D, q/ j+ w J 句子的連接。將游標所在之下一行連接至游標該行的後面。8 y5 B( [5 V* K* m
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
}% p. c. Q! {( Y* S (可利用a、i等指令)再按《Enter》即可。. s4 G5 s7 ^$ y, b/ a1 A
; U$ }7 t( |( L& u9 y
10.環境的設定! u+ H1 v5 A0 o8 p. i6 r6 t E
:setnu 設定資料的行號。$ w" |* d% }, ]) s* x: N! m
:setnonu 取消行號設定。
2 q6 w1 p8 I' g5 q4 }: N :setai 自動內縮。
P; Z" Y+ ^/ B# E v! G0 i :setnoai 取消自動內縮。: ?$ F) p6 Y2 A+ `$ F* r2 O
自動內縮(automatic indentation)
5 O+ G/ X' Y% R 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
- M' c# E( r0 V( D 動內縮的功能,用下例解釋之:4 H/ [! p3 a+ T) x5 Z" G0 ]8 s
‧vi test. c6 W0 M1 K! J
‧(進入編輯視窗後)
% C+ @. n; j. g( E this is the test for auto indent
! B+ _9 C3 s5 G 《Tab》start indent ← :set ai (設自動內縮)
G1 v, m1 i; }& `" k8 D( B 《Tab》data
& l2 j' w; _' ~; }6 ? 《Tab》data, a" [- a8 Q2 b- V8 p
《Tab》data ← :set noai (取消自動內縮)3 Z$ ~8 h) C8 V* i
the end of auto indent.1 ]3 L7 s% E$ m6 s$ _
‧註:<Ctrl><d>可刪除《Tab》字元。! M: z2 Z( ]4 L- Z
& L# ?8 |5 `7 I2 C4 C, r8 c5 ]11.ex指令 b, C5 `9 ]. \7 g
讀寫資料
9 j8 G( m- F+ Q7 `& Y$ |" [ :w 將緩衝區的資料寫入磁碟中。' R/ [, C+ S* y2 `; o# X
:10,20wtest 將第10行至第20行的資料寫入test檔案。
- Z6 F/ i, _8 F5 P) {& |0 c :10,20w>>test 將第10行至第20行的資料加在test檔案之後。
# ?" w j- e' v9 G: G) R/ j :rtest 將test檔案的資料讀入編輯緩衝區的最後。8 h1 P( K+ x; \6 R# M
刪除、複製及搬移
1 E$ r, h- L2 I :10,20d 刪除第10行至第20行的資料。
1 u" x/ b0 d- T3 G :10d 刪除第10行的資料。
' d7 ^* n0 L5 ~ i :%d 刪除整個編輯緩衝區。
% F. B7 c' H+ F; ?! Z# K8 V :10,20co30 將第10行至第20行的資料複製至第30行之後。
* @9 P$ ~7 Y& u$ I s! A; E* @ :10,20mo30 將第10行至第20行的資料搬移至第30行之後。: L1 ^" ~; w% [% e
字串搜尋與取代) @4 R, ^# H" B9 w" V& u
s(substitute)指令可搜尋某行列範圍。
, \/ {% X! }1 X g(global)指令則可搜尋整個編輯緩衝區的資料。
o4 D+ T/ I$ b7 t$ B3 ? s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
2 g2 C1 K. y1 t8 ~; \ 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。: @- M3 m2 B1 C6 ]$ j3 ]
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
* l- B7 W% w& Q) T :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
. v$ Z8 k9 y! ?: n7 k9 @: ~$ A( e :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
2 h! Y' p2 p4 o9 U7 b; C7 H$ t% Y5 ]
12.恢復編輯時被中斷的檔案) O( p& y- O1 u* O; m: r8 r
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
# \& r* M% v- n. d 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前. l0 E+ j( }& x: z2 C
的檔案內容。* a7 d# k9 T0 K" O% b
%vi -r filename- o. s8 C" Y7 ]* V3 w% N' h
E8 z( g2 o- O$ _3 R9 e% @8 q) N13.編輯多個檔案# L6 x9 a& |8 B8 Z
vi亦提供同時編輯多個檔案的功能,方法如下:
9 y z$ J5 T1 v8 o* X/ u %vi file1 file2 ..- z0 @3 Y9 T! n; q0 n' T* b
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
# i1 r8 @: e/ m 再利用 『:n』載入下一個檔案。2 {* H; e" o. v. S! \
6 l% J5 S# a% R3 U2 v n$ H
參考:1 j9 v, u& B& c' R
( A5 S! ~ w5 F9 ~6 u4 @8 I1 S# n
http://chunchaichang.blogspot.tw/2010/08/vim-s.html
& e# V# u% q+ M( j/ A# b- B |
|