本帖最後由 IT_man 於 2017-5-6 23:16 編輯
- S' X0 t$ D5 D1 M6 q4 N4 T; @
0 _1 W( B q' h4 gvi指令說明(完整版). A O }# I( W. J9 c4 f) | V, ~5 f
- vi 的操作模式* e6 Z/ e R( {- J, L
% x, f# H6 c; L4 ~# z6 Tvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 % S w6 g. j0 {* A- p3 e5 T; Z
如何進入輸入模式
2 p& ^( e" ^: C& [& w a (append) 由游標之後加入資料。
7 V& E* W0 |2 u A 由該行之末加入資料。
0 D) O8 Z4 ^+ W2 N+ J: s i (insert) 由游標之前加入資料。( Z) p9 e; g' q& A" x
I 由該行之首加入資料。
+ c) a- P; R3 c8 Z: Z0 D( h" ~* l o (open) 新增一行於該行之下供輸入資料之用。0 \8 Y3 O; R" ^* R! u- U
O 新增一行於該行之上供輸入資料之用。
2 J0 t8 K9 n. D( `9 j5 g. l, ` 如何離開輸入模式( e$ V8 ~9 q! v1 x
《ESC》 結束輸入模式。
2 L3 N- x G/ Z- w, h & p3 v+ q$ k6 G( M* F$ Q
1.游標之移動
! E X& j C F$ } h 向左移一個字元。
& w2 {$ t; B( j+ q( V+ G j 向上移一個字元。1 G" {5 U/ u1 H! ?
k 向下移一個字元。
! ?& O7 l0 o3 h7 D l 向右移一個字元。/ r, z3 z& g: Y6 Q; w
0 移至該行之首- Y4 _$ }8 Y' N+ e
$ 移至該行之末。
: L9 p& [2 G+ L ^ 移至該行的第一個字元處。9 Z2 ]0 C7 Y/ {1 W% i' u9 l
H 移至視窗的第一列。
I; J3 H7 Z% |% r6 d4 R9 r M 移至視窗的中間那列。# t9 r) ?# Q# w. ~/ S% N/ Y% c
L 移至視窗的最後一列。
# Q ?8 S/ e) ^& H2 L- m G 移至該檔案的最後一列。
+ m% R V; D2 V, d2 M; c) N; m + 移至下一列的第一個字元處。1 m# c5 u! U- v T$ V& U
- 移至上一列的第一個字元處。6 b7 f3 p8 s' t, b' S2 r
( 移至該句之首。 (註一)( R' q9 ^6 V4 I8 P. v
) 移至該句之末。
L8 s! t: a1 Y2 C7 D7 C8 z { 移至該段落之首。 (註二)
% V% D j( ?1 R& g4 Q } 移至該段落之末。5 u3 a& O2 D$ Q: q$ K8 T! C
nG 移至該檔案的第 n 列。
+ @0 _+ i4 P" |- c: G n+ 移至游標所在位置之後的第 n 列。* J7 I8 i/ q1 x& e- t0 q
n- 移至游標所在位置之前的第 n 列。
3 a/ l4 @' @) ~6 l; ]# ~% i <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
) I6 M; D+ x( v: ` 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。 H$ e! K5 j( O" E8 T, H7 n' T) U
註二:段落(paragraph)在vi中是指以空白行隔開的文字。7 }2 w3 E! D! E5 Y5 D& V
: D: J2 G/ W$ Q/ M
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。" _( r! a" z |0 s P: s2 N0 _
<Ctrl><b> 視窗往上捲一頁。$ l" P1 A [4 m8 k/ f& U- u2 q
<Ctrl><d> 視窗往下捲半頁。
" E4 U) n. Q( `" ~: |( E <Ctrl><u> 視窗往上捲半頁。
3 E( U9 q' |9 V+ X6 g <Ctrl><e> 視窗往下捲一行。
( [# M5 f3 K/ y1 _* h v: \ <Ctrl><y> 視窗往上捲一行。% E( Q" s9 h: b( \
9 \9 w- C1 I) p0 ?+ b! J& E. A3.刪除、複製及修改指令介紹 (此單元較少使用)) U5 z* ~) h9 ?# z' Q& {6 z p
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:+ z1 g7 V) L) U" n8 ~$ d2 P: a+ b
Operator + Scope = command `1 T. @' {2 i- \& y) C, B' o
(運算子) (範圍)
2 Z/ M4 y! q& k* r p8 G5 K. }7 W7 e 運算子:
6 u: H6 |7 j X' j/ W* G3 j; Y d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。5 ?8 i9 b" r0 V+ |% J
y 將資料(字組、行列、句子或段落)複製到緩衝區。
# N3 ?$ n& M, e2 W5 W l p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資9 N, m: S- r. J: e3 I) ^
料放置於游標所在位置之行列下。/ o: a' v; I3 Z) V, V/ W! @) ?& L
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
% n5 c' X3 f5 C( \ 子等之資料,並插入新鍵資料。3 J8 G% |, W- r
範圍:
$ G! `* D6 F! i9 O' b) C e 由游標所在位置至該字串的最後一個字元。8 k- z* K& T* N/ V0 F$ M! h0 T
w 由游標所在位置至下一個字串的第一個字元。% ?9 g4 |: o, t$ w3 f U
b 由游標所在位置至前一個字串的第一個字元。' q2 D1 v6 z1 @; B
$ 由游標所在位置至該行的最後一個字元。' s+ i9 A3 ?' {1 t* F% C
0 由游標所在位置至該行的第一個字元。
+ `. E2 m) p0 w! T ) 由游標所在位置至下一個句子的第一個字元。* \. d1 h. n' P1 O+ x# u- `
( 由游標所在位置至該句子的第一個字元。
, R% h. w( Y8 @6 r6 Q. D( z$ ~, B' b { 由游標所在位置至該段落的最後一個字元。3 K1 b3 S, k, P0 H+ z- I
} 由游標所在位置至該段落的第一個字元。7 L0 q9 M3 k8 j: [& `
整行動作 J# a; C# d0 V' K& t5 U3 D- }
dd 刪除整行。
+ ]1 ~& S* u) c D 以行為單位,刪除游標後之所有字元。
$ e6 o, e7 ?7 g5 w cc 修改整行的內容。
$ i1 Q8 v. P m8 i6 N yy yank整行,使游標所在該行複製到記憶體緩衝區。: `& N9 k7 a7 {: U" W! U
1 R* F9 w c5 n& s4 \' h5 S
4.刪除與修改
+ w6 x8 A4 M. i0 E2 P( Y1 e/ d; H- L x 刪除游標所在該字元。- ~2 w/ z6 s$ B' l+ F
X 刪除游標所在之前一字元。2 v2 H9 i7 Y0 f6 }3 P1 d0 N
dd 刪除游標所在該行。
" [+ I# \6 S6 T6 I! ]4 e r 用接於此指令之後的字元取代(replace)游標所在字元。
7 A; ]/ E( Y* p- ?9 e0 Q8 u* D% K 如: ra 將游標所在字元以 a 取代之。( r7 U9 i; h/ Q9 V' `( J5 [
R 進入取代狀態,直到《ESC》為止。
0 P+ r6 p1 w, o- r$ R s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
$ ?4 U' i) F) |7 m0 E1 K9 K S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。' x3 X9 z' }) G
' U1 \7 W; c( r v+ V
5.搬移與複製
; ]2 g, ~2 S) i8 r 利用delete 及 put 指令可完成資料搬移之目的。
# u* H) P! `1 {$ d 利用yank 及 put 指令可完成資料複製之目的。5 Y6 _% e9 z5 U! I3 c9 Y
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
4 b8 |+ }9 X# _3 J' i" J1 e 可將緩衝區內的資料複製到螢幕上。) i# J( Z l0 E7 X) U' [; o& |' p
例:! A, @7 r% l; y
搬移一行 ‧在該行執行 dd2 M% s% l y2 q |
‧游標移至目的地
/ D+ W( L8 r/ d$ ~, A9 X; k, F ‧執行 p
. Z2 A4 o3 S* Z0 M+ ], x0 b! D 複製一行 ‧在該行執行 yy
( \1 O) L! v" `8 k$ @ ‧游標移至目的地6 }. C' g$ b1 r. I# Q
‧執行 p% E& m5 c+ q! e# t; t `
: P, y- }" ^/ T p& U: R* Y1 ?: U
6.指令重複6 y+ P0 E( I/ @# u/ O2 g
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
' O7 Y# ?% C }" @ 次。3 X. r7 r' D! R# N! F
例:
4 M% t0 k' T5 B4 p2 Q4 a/ D: P 刪除10行 ‧10dd" _ j: I B' c+ O
複製10行 ‧10yy! g4 i8 P$ F/ |1 d
‧游標移至目的地
) H3 J; x, _( G& O5 |% S* _ ‧p
6 P' c: g; P: S' p& |- ] 指標往下移10行 ‧10j# ]; i" G! S# |8 D7 w
1 z4 m+ k; t" ^; D; L# g& B7 P& S7.取消前一動作(Undo)$ a: X/ D5 L4 G, Y) U- ?
即復原執行上一指令前的內容。
- q% }) ]. e+ [ u 恢復最後一個指令之前的結果。
$ j) w6 B7 ^) u- U8 Z) o; c, Z U 恢復游標該行之所有改變。3 o+ c1 \9 }/ v, B# B
. a* A5 y9 E6 r8 X: F* p" _! e8.搜尋* ^5 T2 _7 `) g
在vi中可搜尋某一字串,使游標移至該處。) @/ Z& n9 C, ?8 V, l
/字串 往游標之後尋找該字串。- H2 d9 B8 F. S ]% O6 T
?字串 往游標之前尋找該字串。0 O D$ A; u) @
n 往下繼續尋找下一個相同的字串。
# R3 L+ R2 j4 N& B, X N 往上繼續尋找下一個相同的字串。9 {# }" H( t) D" Q$ X; \4 t
' q0 ^8 q5 F0 \* Z% e/ E9.資料的連接2 S0 ~) [" C" W" V
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
" |/ u$ {6 J- y2 k6 n0 F+ m 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式' @/ q0 T4 K- g) l, r
(可利用a、i等指令)再按《Enter》即可。: i' v9 ~9 }- g/ C& k& N
; j* B: i4 c$ U0 i10.環境的設定' J) d, |* U0 J7 l/ U0 P
:setnu 設定資料的行號。
- w, Q D+ S+ G, K2 f% G2 k: y. L :setnonu 取消行號設定。
3 I( n& m: s7 i( v4 A4 c! A :setai 自動內縮。
# b+ J6 A C% a( y :setnoai 取消自動內縮。0 I9 o) p/ j8 s7 [; I
自動內縮(automatic indentation)
- h8 @1 \" d" d9 V6 Z4 n! R8 D 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自+ G: x: q# @2 r2 {/ |
動內縮的功能,用下例解釋之:" \1 i5 R; \5 Y2 A% L
‧vi test5 u7 E3 Y7 m) F1 l: `
‧(進入編輯視窗後)' M, D X( V$ v3 T1 W: R& e7 I
this is the test for auto indent
; h# j! z; Z e. M 《Tab》start indent ← :set ai (設自動內縮)
1 v8 B& ^1 H: V( d" o k* P 《Tab》data) t; |" |, |- h
《Tab》data
8 [* r1 U5 Q+ y4 a/ y9 R, ?0 c0 Q: h 《Tab》data ← :set noai (取消自動內縮)) j8 S/ O: K! C; `) m
the end of auto indent.; j3 a; m1 T( h- h8 ]- F' V0 `
‧註:<Ctrl><d>可刪除《Tab》字元。0 R$ R) P; C D9 G
+ n) `* X5 }/ d( @" a0 X( i
11.ex指令+ `, [1 A) w9 C/ i% B
讀寫資料
& J8 z2 S" k$ r* E6 s. V) ^ :w 將緩衝區的資料寫入磁碟中。
8 U' B& m/ r) L4 m# [ :10,20wtest 將第10行至第20行的資料寫入test檔案。
0 q Q/ w! R( B, Z6 p6 \: x7 `( f :10,20w>>test 將第10行至第20行的資料加在test檔案之後。
/ i( X( I% N9 @ :rtest 將test檔案的資料讀入編輯緩衝區的最後。
. r" l9 W! O/ S& Q1 Y, A 刪除、複製及搬移/ z$ \0 p& x$ ^3 J2 t! A' B0 k. e3 ~
:10,20d 刪除第10行至第20行的資料。4 t% ?2 C# L' q% r- L
:10d 刪除第10行的資料。6 |0 n; j( B2 t: M, h2 X
:%d 刪除整個編輯緩衝區。
- ~3 D) _) {. ~* o$ A :10,20co30 將第10行至第20行的資料複製至第30行之後。1 [7 D& R& ^8 S% g& ?$ m* S
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
o; n( J# }; A' { j) f 字串搜尋與取代7 `8 n' e0 H% v- H1 U
s(substitute)指令可搜尋某行列範圍。2 m8 {( P. U, C8 ?: {
g(global)指令則可搜尋整個編輯緩衝區的資料。
$ ^( ~0 ]/ ?& E s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
4 v- h$ u0 W. g; {" D) Q 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。. i' [" z5 @& i# G" e$ ?( E
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
9 O( Y l: c! E; T8 F6 C5 K5 e9 L :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
1 m- b. ^, ]& u/ O, s% V2 x :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。+ I4 A) |; y: N$ H8 ?, ^
. z$ H( k" ?0 C* T8 w; z( G12.恢復編輯時被中斷的檔案" ?: Z/ _8 x- w% U" Q" ]" K
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未: c+ [7 W, Y# n5 L5 s; n
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
) z) M& [) n5 B: C 的檔案內容。; ^. u8 B) B6 C& D0 U9 R, [, A' |
%vi -r filename
8 ?- r1 N& O0 E( [ o
; c1 J9 ^0 W; {3 R! p13.編輯多個檔案
: \0 }5 i# r2 f' V vi亦提供同時編輯多個檔案的功能,方法如下:, h- h9 Y/ Z& |7 a
%vi file1 file2 ..
1 R* F5 x$ ?1 K: ?" w 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
7 J5 U4 n2 P) `2 l. b3 R" g 再利用 『:n』載入下一個檔案。
3 _3 Z& z/ |# @% r1 Y6 p7 v- ~+ L8 ^9 ]0 c6 w) v
參考:9 R5 F7 [6 C# G# E& }
& }- R$ b) i2 c, Xhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html5 t8 y( J ?1 b5 |3 g( \
|
|