本帖最後由 IT_man 於 2017-5-6 23:16 編輯
) I" C2 X2 r7 u0 [" d. A$ G( `+ r# R1 H: ^: j
vi指令說明(完整版)
P; C7 }: P( y5 F' ]; N- vi 的操作模式+ c/ e- v3 ^3 N& Z
3 [ ^3 H% \; f mvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式3 e2 c& N2 W( G4 U- g
2 j1 t; a% C4 r7 a
如何進入輸入模式' z5 R8 h/ K6 l# R$ G+ y) i, J. Q
a (append) 由游標之後加入資料。7 G: w. e- a: g; S+ ?0 I3 Y
A 由該行之末加入資料。
" `/ o5 t( V. _6 T( m& L O% Y i (insert) 由游標之前加入資料。
; P6 O& R' U3 \2 H' ` I 由該行之首加入資料。
6 L; S" m( F& q, y o (open) 新增一行於該行之下供輸入資料之用。' m* J* I2 r( I4 N5 Y7 k5 D
O 新增一行於該行之上供輸入資料之用。( |- G) `' T" [( O& w
如何離開輸入模式
2 n9 E1 z( j3 N5 m! C% Q) ] 《ESC》 結束輸入模式。
) W" r) W, o+ U& z2 z , T5 |, A6 T1 O
1.游標之移動
, h6 {5 U0 n R3 @& m8 M& @( O, G h 向左移一個字元。
6 Y5 e) }! G2 a2 [ j 向上移一個字元。, B( m2 }, k4 w3 e! E7 Z
k 向下移一個字元。
" c1 q: P1 P; O* v l 向右移一個字元。
; r2 Z% N8 X9 w% M E1 i1 a. Z* | 0 移至該行之首. G, k& \/ o* |
$ 移至該行之末。
3 P5 @# l. \ @( d0 m( ~7 ]' K+ F ^ 移至該行的第一個字元處。' n5 s& O/ M' t; Z O+ ~& E
H 移至視窗的第一列。
2 I% d* Q$ J/ `: `7 A/ R M 移至視窗的中間那列。: d$ Y3 e! G1 U
L 移至視窗的最後一列。
2 d2 Y. |4 {6 S! b4 h" ?! i& [ G 移至該檔案的最後一列。# T. r# f* E0 O3 D
+ 移至下一列的第一個字元處。
5 y; K H: o+ a' ^ - 移至上一列的第一個字元處。
7 M" E, M/ l' `& D8 T1 c ( 移至該句之首。 (註一)# z8 r& a2 r% J: w- R
) 移至該句之末。9 C+ u4 l# c; E
{ 移至該段落之首。 (註二) O9 U+ B4 G8 W) F, N- G
} 移至該段落之末。
, }% Q, w: ~8 A9 d* d- ? nG 移至該檔案的第 n 列。8 J* K- x# W' T; N! q% N
n+ 移至游標所在位置之後的第 n 列。
, @/ |- _6 [3 n0 Z$ f8 H n- 移至游標所在位置之前的第 n 列。2 E& m9 M E% K/ J+ R/ h5 {
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。) b& v, H" M! m7 ^4 ?# T6 A/ V1 N( ^
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
' y" e: y. Y+ j4 c& l1 z 註二:段落(paragraph)在vi中是指以空白行隔開的文字。) H: A7 F `3 i9 g2 E
5 x6 y s) O& k+ V& r4 M% @# E2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
9 P+ n T* p- t8 R# z. R% Z <Ctrl><b> 視窗往上捲一頁。
]* z2 P' N5 G. \1 V6 w/ I* E; Z; W <Ctrl><d> 視窗往下捲半頁。% v5 Y- u3 G1 e$ }
<Ctrl><u> 視窗往上捲半頁。
2 h, u& j5 U) m9 _5 `. k8 F8 `* C" W <Ctrl><e> 視窗往下捲一行。
8 \2 Q4 b; j5 w3 _; X+ _ <Ctrl><y> 視窗往上捲一行。" `3 d, H. D9 Y2 _) E" J
. Q" C9 ]7 e2 _6 ~# _5 e
3.刪除、複製及修改指令介紹 (此單元較少使用)# u5 x! T. I. g
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:- Y' E$ h! ^9 n# e
Operator + Scope = command
& u: P* r/ ^- n i7 E (運算子) (範圍)
& y9 }; p x Z1 J 運算子:
+ j1 R6 {+ t' y2 w- @ d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。7 s6 }7 D& }7 k$ j) V, [
y 將資料(字組、行列、句子或段落)複製到緩衝區。: v$ s1 [* H# g4 o r
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
6 D( o8 ^3 u7 N0 l0 S9 b 料放置於游標所在位置之行列下。" t" P% ~& }8 ~3 I; [' o
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句- r; D1 N" U: {: a$ o
子等之資料,並插入新鍵資料。
+ T7 ]+ F- a! p7 P- T8 \& ^5 t 範圍:& C2 d6 e' W" f& v; E2 U% G* g
e 由游標所在位置至該字串的最後一個字元。+ U3 E2 L9 }! X F
w 由游標所在位置至下一個字串的第一個字元。* C2 L: B! ]# i; e: \4 P5 b
b 由游標所在位置至前一個字串的第一個字元。
! l7 o. x$ t& m V $ 由游標所在位置至該行的最後一個字元。
/ Z" B9 ]5 e: w, R 0 由游標所在位置至該行的第一個字元。( r& f) T+ d+ n9 g
) 由游標所在位置至下一個句子的第一個字元。
1 L. A5 K5 J0 x: T6 g3 I ( 由游標所在位置至該句子的第一個字元。
Y( `: K8 R H6 ~: U { 由游標所在位置至該段落的最後一個字元。
1 |' f$ `, O/ E* E& { } 由游標所在位置至該段落的第一個字元。* |* Q! r+ C |- U. a
整行動作6 m0 V2 h( @9 R% F( C i+ u
dd 刪除整行。8 J2 e9 H* `5 ~3 Z @% r
D 以行為單位,刪除游標後之所有字元。
1 }4 N5 O7 V f: l cc 修改整行的內容。
7 Y4 k5 l+ Y% y" r5 ` yy yank整行,使游標所在該行複製到記憶體緩衝區。
( ?" a5 E9 s. _+ {9 \" O
# y. t, D1 {' w7 Q& I4.刪除與修改
$ c" [! s7 ~5 {" H( R" S x 刪除游標所在該字元。
|- c' Z! j( v- { l$ |* V. ^ X 刪除游標所在之前一字元。, @, E, f, {1 v5 m- m% y7 ]
dd 刪除游標所在該行。6 v* k/ @7 w8 |- l7 ?1 L
r 用接於此指令之後的字元取代(replace)游標所在字元。
9 T: W C3 H+ N6 R. l8 f( ^ 如: ra 將游標所在字元以 a 取代之。
& b' L) R& W; o% _9 R R 進入取代狀態,直到《ESC》為止。
$ S. ^6 J! F$ X s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
0 G$ q1 M7 _7 Z# X7 l S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
. T6 D" V& ]8 i \3 k# q" `* G: B7 N8 w4 n {
5.搬移與複製2 G% L. S! I% e/ u& J1 }
利用delete 及 put 指令可完成資料搬移之目的。: C. c8 d' D$ ^
利用yank 及 put 指令可完成資料複製之目的。
- S/ Z8 \& E- { T9 t yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
, {. {1 V9 U0 R0 ?2 U! u1 K" I 可將緩衝區內的資料複製到螢幕上。' q P. B* W, g) @2 O
例:
/ I0 h# g/ I# Z1 m) } 搬移一行 ‧在該行執行 dd' I( b9 q1 @' v& A5 J8 \9 H5 a
‧游標移至目的地5 Z4 c9 L" N$ D* x- c6 a- d* D
‧執行 p
3 H% x+ \, v( E. q0 H/ | 複製一行 ‧在該行執行 yy) ]3 p* `- x: C$ `
‧游標移至目的地
' {% B# h- ]5 Z ‧執行 p% W3 y G% y' e1 n: Y. f d7 K
: z# w; D; Y- Y0 [
6.指令重複
( x5 p B3 h' x 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n' c1 _1 d) G. f+ U5 D; m
次。: D2 `" p4 @& @; v0 X) M
例:
& u- N7 A8 m+ q* Y- y 刪除10行 ‧10dd
6 l0 t: L. R2 [5 x4 E; ^ 複製10行 ‧10yy
! H! O. {0 ^9 w6 v( f& G3 A ‧游標移至目的地+ V0 p8 S" L' |$ ^9 i9 n( U% D
‧p7 E$ K6 M% t" H6 E; {
指標往下移10行 ‧10j
3 c3 e, N: K5 |0 ]- P2 ? \/ X5 V. r1 ^3 D: `% H3 I" t) l
7.取消前一動作(Undo), `0 [# U* D/ M8 B2 Y7 L. {- O
即復原執行上一指令前的內容。% M2 J% M% _ \7 C) X
u 恢復最後一個指令之前的結果。( x5 E& q; n$ K! h
U 恢復游標該行之所有改變。
) H/ B9 u( L9 B$ w9 Z% V: s4 v. \, i/ d, ?" ~. I: l2 m
8.搜尋2 M& h2 m; H" k
在vi中可搜尋某一字串,使游標移至該處。
# p/ U% ~0 e3 y$ M /字串 往游標之後尋找該字串。; `) O& K C" S. v
?字串 往游標之前尋找該字串。- d* G4 D7 Z: O( W
n 往下繼續尋找下一個相同的字串。: f3 D8 f. ^: |- _4 D* i$ z
N 往上繼續尋找下一個相同的字串。- S* m' r ~6 u1 W
" V1 H8 l' |2 _; ~! m" ~
9.資料的連接
' s0 N3 f2 o \# D4 h; t) B J 句子的連接。將游標所在之下一行連接至游標該行的後面。, x5 P5 j: w2 u0 d) M% n
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
! d0 Z X, D' L/ g (可利用a、i等指令)再按《Enter》即可。0 C: j: x4 {$ u' J3 x) }7 c' M
2 {: H3 I3 y2 j10.環境的設定
, I8 n- p8 p8 q. L( p4 D! P- ?, w; E :setnu 設定資料的行號。
7 ^5 j% |/ ~/ w: \7 V :setnonu 取消行號設定。+ @) k* n! @: T) ] G6 N
:setai 自動內縮。9 V. {( E4 y& s, B. X, x7 T
:setnoai 取消自動內縮。. w; r Q5 l( s3 b1 z7 d* y1 K
自動內縮(automatic indentation)1 _: C* l- `6 ` H$ W
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自; i- H7 X2 k1 E$ F4 B h; {
動內縮的功能,用下例解釋之:. v. E2 T8 e4 D' O+ I
‧vi test
M3 V0 y3 h6 o7 h$ l* J3 W6 g ‧(進入編輯視窗後)* j3 ]/ e0 F' z5 u2 C* t; A
this is the test for auto indent* ]; c+ y+ Q: R: s
《Tab》start indent ← :set ai (設自動內縮)* Q9 i* v& @ K5 p6 x' C
《Tab》data* Y( B! Z. c% W+ U- [1 z, B
《Tab》data/ r$ f( o- r4 l
《Tab》data ← :set noai (取消自動內縮). N' D( |0 h$ p! S& Z# d( [
the end of auto indent.1 c+ _3 R0 P8 e% h1 G9 O
‧註:<Ctrl><d>可刪除《Tab》字元。3 i k# q# Z6 d8 r. t- n2 |9 h
" z2 T0 h N) Q! N11.ex指令& W' {$ ^; F- h) S( @
讀寫資料
# v. u+ Z4 h' E# t% E :w 將緩衝區的資料寫入磁碟中。, T; r/ j1 H' u
:10,20wtest 將第10行至第20行的資料寫入test檔案。( K& z, }/ F$ E* p) {, L; T5 [! b
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。; I8 B1 c% N3 v9 Q; D, y* K
:rtest 將test檔案的資料讀入編輯緩衝區的最後。9 e" F2 H L0 a ?7 |
刪除、複製及搬移$ f4 \9 h% X6 c( m/ B2 k& W
:10,20d 刪除第10行至第20行的資料。
+ f' R/ j9 g7 T :10d 刪除第10行的資料。- c4 b0 S5 [6 ]6 i: L! E
:%d 刪除整個編輯緩衝區。
: E# v; V6 I; }3 v' f :10,20co30 將第10行至第20行的資料複製至第30行之後。
& m; O& x O# _1 W9 c( r/ K4 e :10,20mo30 將第10行至第20行的資料搬移至第30行之後。
) Q; `' f1 h7 P2 F3 B 字串搜尋與取代% l9 M% I' W6 p4 L' F: T; M, {
s(substitute)指令可搜尋某行列範圍。' I& a4 J" [' U$ ]1 ?
g(global)指令則可搜尋整個編輯緩衝區的資料。
; N& L9 V0 Z Y1 m$ H9 f" R s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條- b7 `9 x2 z ?, U x* Z& C
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
6 |) j* {' O4 P: d) Z1 i. K :1,$s/old/new/g 將檔案中所有的『old』改成『new』。$ T9 l% R+ Q2 I6 }
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
3 c3 Z6 v' Y2 _; Z6 H1 k% v :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
6 z4 m: H k( O2 K( c
% f1 j7 p N. \8 O# c/ t12.恢復編輯時被中斷的檔案6 a: @, a$ W7 P( p$ ^% Y
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
& ^; I/ t% R4 F$ t9 Z 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
1 [7 u) t5 F* u8 ? 的檔案內容。
! l6 _1 C( a+ V$ ? %vi -r filename/ Q& g0 h& R& w
1 L: t7 o @8 t Z: `( |13.編輯多個檔案/ _2 Z: Q8 l' M, W
vi亦提供同時編輯多個檔案的功能,方法如下:
. L$ s# E0 f: b8 {) W2 A& Y3 b %vi file1 file2 ..7 V5 b2 w( F+ w
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
+ ?! Y. z, A1 ]( ^ 再利用 『:n』載入下一個檔案。
: p- P. Z8 u, f/ ~0 w, D" L w4 q% x) M; b
參考:
9 t b6 k" Y2 U/ j- ?2 Z: E7 l) g% t) J
& W- _1 K b" Q+ m2 W1 Ehttp://chunchaichang.blogspot.tw/2010/08/vim-s.html
/ _+ O3 I5 m1 D4 `) q |
|