tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 % ^' \7 `& f, Y5 Q% L% ~4 o8 z
& T- H _& n2 G7 U' ^+ I, Gvi指令說明(完整版)
0 L* D- H" K( T3 E# L. y: V- vi 的操作模式 O0 Y2 l4 ^6 i; B" C8 n' O
; X4 `0 |% ^* A6 X2 e9 xvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
5 n! U q& U+ Y- i8 X& j
) D- M, X" m |( M1 T5 T% \. v: \# ~ 如何進入輸入模式; T1 b2 h9 O$ X8 M, |3 z% Q, ~$ @& g
a (append) 由游標之後加入資料。" ]1 G1 I3 B+ ~! v* N7 U
A 由該行之末加入資料。! w) d; a) L y. V
i (insert) 由游標之前加入資料。
' I$ ]) e# n8 S7 ? I 由該行之首加入資料。
( Q% ` e9 O# y0 w1 b0 | u+ T8 a/ Y4 S o (open) 新增一行於該行之下供輸入資料之用。
' w! I( W9 g! } O 新增一行於該行之上供輸入資料之用。& x, j% b4 N: V0 d
如何離開輸入模式
2 i; R( U% b4 Q4 z 《ESC》 結束輸入模式。* F& z0 {' I2 w
- 指令模式
0 n% F, N; X" v7 H2 L2 ]
# S: m' \0 {2 m# l; ^1.游標之移動, M S& k1 Q% d: K$ S" I8 @
h 向左移一個字元。
8 ~ |9 ?4 s' z/ ` j 向上移一個字元。
9 ~# B4 |( A# s$ x5 ] k 向下移一個字元。
% Y9 i: |7 R* Y* }; q) \ l 向右移一個字元。
$ ?) ~ h: l) f! \. R* l, d6 A 0 移至該行之首
% n, d W9 S. s, A3 y/ i) V $ 移至該行之末。
. p/ @- z5 V- F9 l9 w) Y4 O ^ 移至該行的第一個字元處。7 R9 X0 g: o5 o/ G5 o9 q. i7 n
H 移至視窗的第一列。 @4 T$ I& d% D2 |$ o3 v( b
M 移至視窗的中間那列。1 l& ?, P/ g( x1 U
L 移至視窗的最後一列。' s; @4 v+ w# r. a. U
G 移至該檔案的最後一列。' G3 Z7 T* c' E) q
+ 移至下一列的第一個字元處。1 ~$ U& R6 j- G
- 移至上一列的第一個字元處。8 V) v$ h3 N2 [) G ]
( 移至該句之首。 (註一)6 I; {: ^+ w" I/ J
) 移至該句之末。
$ g( B6 H" |& G- O# u; D; a& @ { 移至該段落之首。 (註二)! Q9 e& R2 w9 r1 ^' j# i
} 移至該段落之末。
$ A$ {' F; e$ j7 R6 R8 V2 b" y nG 移至該檔案的第 n 列。
( t; v0 P0 n8 [' F4 y. E n+ 移至游標所在位置之後的第 n 列。
" n6 m8 S5 I2 |- D$ E) @$ f* F n- 移至游標所在位置之前的第 n 列。% l3 l! l5 c- d/ _- v& j8 Y6 P
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。* `7 j C* o! K" \
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。( s8 ?+ O& V0 t, u2 ]& K
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
$ e) t. b& k' t2 e8 Q6 P8 _. l8 t( {4 g" p$ `$ A" J6 o3 q$ U( u- P
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。# _% r' B! Z5 y: W6 G8 y3 a, }
<Ctrl><b> 視窗往上捲一頁。
: J; i% a2 W& _' Z" a <Ctrl><d> 視窗往下捲半頁。. p2 r( B. I: ?7 r6 I; F L
<Ctrl><u> 視窗往上捲半頁。
2 a) |( q8 ]) x( ?# W <Ctrl><e> 視窗往下捲一行。) ^" C! ]; d" |- p0 `9 Z
<Ctrl><y> 視窗往上捲一行。
; Q1 Z' m( U; L* G& p7 b! @$ _6 h! n
3.刪除、複製及修改指令介紹 (此單元較少使用)
( i% w3 f0 {0 G$ g7 f. A$ C d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:! ~3 H2 \( \& l3 G; ?/ W
Operator + Scope = command; `' r' r1 C! z; l! l, q* v4 F4 v
(運算子) (範圍) O; \9 z$ J5 u+ ?0 A
運算子:- [ s) ]$ U) j# d& f6 Y7 p t
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。; w4 f& i+ s! s
y 將資料(字組、行列、句子或段落)複製到緩衝區。4 H, I' a9 {0 I" I- B: ~4 r
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資2 `0 F6 p$ |& {: C0 [) j$ D
料放置於游標所在位置之行列下。* F$ m1 |. d* E; Z4 f2 g/ [
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句9 _9 ?! @' Z8 u% e( `
子等之資料,並插入新鍵資料。! U/ t) d6 W# k# K/ k# X5 i# p ^" f- c
範圍:$ L) a6 X) ?7 \/ M4 g7 T0 m" O6 A
e 由游標所在位置至該字串的最後一個字元。
' L, T( Z+ g! V* }3 n6 h8 [& {* p( G w 由游標所在位置至下一個字串的第一個字元。4 W- V* r" c, r# h. e
b 由游標所在位置至前一個字串的第一個字元。* f7 g3 @6 u& O# D" k0 y
$ 由游標所在位置至該行的最後一個字元。6 R* e; L& E0 g2 Q$ p) s6 s1 w; a
0 由游標所在位置至該行的第一個字元。
( }+ t$ ~5 z: `1 h ) 由游標所在位置至下一個句子的第一個字元。2 n. S- v$ q4 ^8 E/ g( _! g* V8 d7 p
( 由游標所在位置至該句子的第一個字元。4 p. j) T7 _4 V5 V; A. e
{ 由游標所在位置至該段落的最後一個字元。
0 G' l) S+ g- g4 J, W } 由游標所在位置至該段落的第一個字元。/ e! Y N$ c3 v( Z
整行動作$ ~7 m9 h O! d
dd 刪除整行。
8 Y7 _. H. X8 A+ Y- ^6 Y* g2 } D 以行為單位,刪除游標後之所有字元。5 Z" C- x# W# Q3 G
cc 修改整行的內容。: T& E8 z0 ~" j# |
yy yank整行,使游標所在該行複製到記憶體緩衝區。
" R) Q6 U& a. ?; ~4 ^9 p6 Z
$ ?- I2 Y" b2 v+ A8 o: @4.刪除與修改/ |& |& w0 `" F% e5 |$ [3 P
x 刪除游標所在該字元。
/ A# x E* g R J: y X 刪除游標所在之前一字元。
2 W+ h2 H, X# G# ~ dd 刪除游標所在該行。4 } s3 P- n( g9 L7 W
r 用接於此指令之後的字元取代(replace)游標所在字元。
( a1 D G7 s& {% R( ?) M 如: ra 將游標所在字元以 a 取代之。
% s2 P( U8 ~; h u$ q R 進入取代狀態,直到《ESC》為止。$ b* d! E5 d' U
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
# q2 V7 a8 @) d S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
; \" w1 Z( D+ D- o- o# v. f9 B
; {7 E* r7 C: F) U9 D5 J% s5.搬移與複製
: @/ n6 K' L, q6 y m [- Q' e T 利用delete 及 put 指令可完成資料搬移之目的。! C0 _& x6 M% x' D
利用yank 及 put 指令可完成資料複製之目的。! ]8 I+ R% _$ R; B9 F- d+ R& u
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
0 k$ `6 p8 C" c: Z+ `! x- F 可將緩衝區內的資料複製到螢幕上。2 i- r) L1 P( n7 D9 @- N
例:
1 F$ L9 M+ N& n. l8 ^ 搬移一行 ‧在該行執行 dd
. z( @4 `7 P6 G- N& I% J* x0 o: e ‧游標移至目的地
( k+ ?: H0 y6 u! ]9 [) N ‧執行 p; E. e3 y K* r8 j7 n* d( O
複製一行 ‧在該行執行 yy
) ?# {# F- ^. x+ p: { ‧游標移至目的地8 @" n |3 G" n+ f; _
‧執行 p6 ~, q) g- D5 y2 X
! n4 u/ ^2 a& v6 |9 \
6.指令重複% L2 y# f; |; P5 X! t: [& P8 j3 g
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
1 V& _: T. m4 [* }8 U& e* n6 L* U 次。
' Z! P1 e; x7 r. ~: y# D% }. B 例:
* T: @0 r/ w' @ L2 D8 K 刪除10行 ‧10dd) \/ k5 X8 Y2 y& o: |. F
複製10行 ‧10yy
! t+ y. @# ]" O* K: U7 n4 c ‧游標移至目的地
# E2 U8 S6 ?( ~! E! t- _: w ‧p C) O9 q+ W3 h. u9 _5 l
指標往下移10行 ‧10j2 Q8 u6 r7 z) j
8 {8 C$ ?# G9 O3 W9 E( u
7.取消前一動作(Undo)
3 P# @( D' D4 Y$ v$ f/ m 即復原執行上一指令前的內容。( S* L* X/ D* P+ ?- v8 _
u 恢復最後一個指令之前的結果。
. B) o* c! C v! e8 k8 _ U 恢復游標該行之所有改變。+ w7 h3 ]5 f4 Y- u" I
+ H J0 T6 F( A3 q
8.搜尋6 X; k, n; M1 t# I
在vi中可搜尋某一字串,使游標移至該處。. K! a) [: [$ a- A. R6 `# p
/字串 往游標之後尋找該字串。
' B! _$ F# q4 m ]! z7 R ?字串 往游標之前尋找該字串。
7 k2 I: x8 I7 n, m n 往下繼續尋找下一個相同的字串。
3 k( |+ E+ z, D r" l N 往上繼續尋找下一個相同的字串。" E' A# }, l5 P1 J0 a6 z
( A2 s3 n3 C( a9.資料的連接: b3 ~3 U% ^3 X4 }# k
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
2 N* w1 Z8 u; x 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
. Y% N T0 u; w8 F" r (可利用a、i等指令)再按《Enter》即可。
$ k+ ]6 \, S# E/ a# j9 s9 A
# h. |7 N" r: F+ ^5 x10.環境的設定' j2 S- b0 |5 r# h; h1 x* f# Q
:setnu 設定資料的行號。
- O7 O8 s3 {9 C7 Q1 S :setnonu 取消行號設定。
4 }0 ~' ^4 M0 C) @0 i; a :setai 自動內縮。
: I" Y' ~& m: g5 f :setnoai 取消自動內縮。3 \& w% p+ S) L+ I Y/ L- y" ]7 M+ b
自動內縮(automatic indentation)
' n* F2 Y+ r* g( q; |* t3 Z 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
8 g" o& L' Y' f( g* J: @$ q. N1 D 動內縮的功能,用下例解釋之:2 N- {: s9 r9 \3 G4 ?- \
‧vi test
' l; n: c0 S% V2 f1 ^, j7 A ‧(進入編輯視窗後)
! n7 U% c" c# k( m5 m5 b$ w( l5 { this is the test for auto indent
* z/ m3 o+ s/ u& f" J( @ o 《Tab》start indent ← :set ai (設自動內縮)
2 M$ F2 t$ W: \0 f1 F6 r& K5 `2 A 《Tab》data
# F( r7 c! T+ ~ 《Tab》data; m$ M- q& h# ?3 }& Q
《Tab》data ← :set noai (取消自動內縮). {$ e/ ^, @5 v' T3 s7 a
the end of auto indent.
$ x3 _. u% T0 v5 i# Q; c6 M ‧註:<Ctrl><d>可刪除《Tab》字元。
' D* o0 f+ t( @
) o& e4 R* I' `! W. E11.ex指令& W9 n8 @" V! I( L7 f( v
讀寫資料7 H8 Z( E4 a0 E. @- H! `5 a( q
:w 將緩衝區的資料寫入磁碟中。1 \- ?; X* g: i# B
:10,20wtest 將第10行至第20行的資料寫入test檔案。$ [( l& C& o# w* h1 R* S
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。1 c: r c3 ?6 B' z% B, l, `
:rtest 將test檔案的資料讀入編輯緩衝區的最後。( y$ D& c8 z/ Q! k; r
刪除、複製及搬移
6 a8 C( R6 i' Q3 t- p :10,20d 刪除第10行至第20行的資料。3 X! o/ N% r0 W& \. x
:10d 刪除第10行的資料。4 p: a, M" v9 ^' o6 ~. g
:%d 刪除整個編輯緩衝區。4 P* r" @0 u0 t' w4 C
:10,20co30 將第10行至第20行的資料複製至第30行之後。
' t/ s) z( B% I0 t( P$ w. E :10,20mo30 將第10行至第20行的資料搬移至第30行之後。& m4 n+ ~+ t, H1 x' Z; Z
字串搜尋與取代
( X# P* W( h. l s(substitute)指令可搜尋某行列範圍。" `' I3 @: s3 h2 K( K) ~
g(global)指令則可搜尋整個編輯緩衝區的資料。4 l& s. C6 e% R: S- _
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條2 I$ J9 \& ^2 p1 R2 f+ }' v, k$ ?# U- C
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
, `* q h* b# U :1,$s/old/new/g 將檔案中所有的『old』改成『new』。/ l/ M" v+ a9 K& D1 X$ X/ T& K( B7 K
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。- q: t% \! b) I
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
4 l' p/ R) \0 Q" V3 q6 P" Q; s! ?" o" o! U: k# U
12.恢復編輯時被中斷的檔案0 H2 p/ I$ ~$ a
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未8 z4 Z) y1 d( U1 c' x; R' y* Q
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前( v7 S/ `$ W0 Y
的檔案內容。
8 @4 U! J! H8 L3 E1 v, ` %vi -r filename x; D" X: d1 z. n F3 v" d7 @
( v& z- H9 `0 P( u13.編輯多個檔案$ w) P3 W& q5 [8 z
vi亦提供同時編輯多個檔案的功能,方法如下:
+ Y9 r6 ~/ Y4 t %vi file1 file2 ..
6 G8 j; |' u$ y1 F 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
@5 |5 ~& H T ]8 ^# M- X/ Z' B) e 再利用 『:n』載入下一個檔案。# r* o- B- r. e
9 x% c {: P! e4 U7 l- r, R參考:
8 V+ t: @/ X% j& d0 o P2 m% y' D j3 U4 I; u5 R$ c# A- s" ~- f, ?( }/ o
http://chunchaichang.blogspot.tw/2010/08/vim-s.html
: O5 O) K5 u9 L% _: \9 V |