tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 7 I2 u0 m# A' i) |4 [
1 A3 |; Z4 [+ P" s, O' E4 F
vi指令說明(完整版)
; j' y/ d& ~- q/ S8 |- vi 的操作模式+ L* h2 f H8 x1 N. c4 F# i s
2 m, D7 V9 H& g
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式3 a- }/ W3 T% |/ ~' F$ j7 G( I
1 m- a$ z4 a% X$ y s 如何進入輸入模式3 [- u/ O. h$ U) r
a (append) 由游標之後加入資料。
1 U5 y& p2 W8 M7 D A 由該行之末加入資料。1 X3 @. s0 \( I9 ]" w; ]
i (insert) 由游標之前加入資料。2 x9 c* f6 {6 y7 u
I 由該行之首加入資料。
t6 [! c/ |- Z3 F2 J' F% o0 I o (open) 新增一行於該行之下供輸入資料之用。6 @3 }3 ]: g0 c/ E& }2 T" P! f
O 新增一行於該行之上供輸入資料之用。. }* ?' L# J. F* i9 I( o; ?2 m
如何離開輸入模式4 ~, U N5 k" G: Y1 q1 H
《ESC》 結束輸入模式。
* g3 u M1 h- _# P9 H0 ~ L; o8 M- 指令模式# d1 W) w. x, Q1 ?( u
; U- ?( K7 j4 y; G
1.游標之移動
5 `! @9 [0 G: ~% [! P. \8 E3 W h 向左移一個字元。$ v+ u" C1 L2 H, z+ J
j 向上移一個字元。% b$ n4 Q3 N. K
k 向下移一個字元。
4 g" u" O. \# k- ~5 p l 向右移一個字元。/ E3 n5 Y8 E( f+ ?# \, s4 ?
0 移至該行之首( D0 S) b5 D9 w, d1 I% Z- N. H
$ 移至該行之末。
8 \6 P- o+ y( Y& |4 p: C% O6 _/ w, J ^ 移至該行的第一個字元處。3 Z0 L" X `2 b% h
H 移至視窗的第一列。) U) j- H, U' G2 g9 k) s; E
M 移至視窗的中間那列。
( M; n' b3 g, m$ h L 移至視窗的最後一列。
3 K; s( x- C d% M7 d7 b, [7 J" L G 移至該檔案的最後一列。- h8 [7 ^4 j/ Z ^
+ 移至下一列的第一個字元處。7 |: w* M# {$ l/ g7 c
- 移至上一列的第一個字元處。$ i; U: A( U2 M3 t3 Q
( 移至該句之首。 (註一)
* c6 r+ o$ w0 I$ n ) 移至該句之末。
% l9 ?( d) C+ L, } { 移至該段落之首。 (註二)
7 h/ J: W$ N7 P } 移至該段落之末。
, j* T4 U) w, Q4 x5 e0 j nG 移至該檔案的第 n 列。
( k4 S: x; r& r( v" ]# }' @" q n+ 移至游標所在位置之後的第 n 列。' \1 s& D% P% b8 ] m, s6 c0 X( V
n- 移至游標所在位置之前的第 n 列。
- {# {# v# ^- B& E5 H <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
2 x. M s/ A# F { 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。7 y6 Z/ d- \$ F
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
! m8 O3 Q' @6 O0 F6 q$ h( J1 O' U) H o
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
7 O. p4 D# k0 x ]$ o7 r7 O. i <Ctrl><b> 視窗往上捲一頁。: a- g* z4 z `
<Ctrl><d> 視窗往下捲半頁。
- Q; t& N' K/ L* @' k. ^- s, s" F2 F <Ctrl><u> 視窗往上捲半頁。
6 `0 Q: K& R& Z3 M" U; F/ t: q5 \+ z <Ctrl><e> 視窗往下捲一行。
1 R# s* `$ h) \& n D$ g <Ctrl><y> 視窗往上捲一行。
: m2 p* k r2 S% k. }1 }
- ?' k3 i1 D( }3.刪除、複製及修改指令介紹 (此單元較少使用)! [! L8 @' O' q8 S* V! _& e
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
: `7 q- }! r+ Q e Operator + Scope = command
- p/ p0 m1 M# X& Z$ I (運算子) (範圍)
. L* x0 g$ f- ?+ @4 p, W 運算子:
" {( l- b; }9 a4 u1 K5 j d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
1 @8 S0 j- L; I' k! Z y 將資料(字組、行列、句子或段落)複製到緩衝區。3 {, u+ J# ]4 O6 X% S
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資3 d9 b- S7 X1 D$ J5 }
料放置於游標所在位置之行列下。
. E% j7 ]% n% r4 |3 a0 a c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句8 \7 P& k, p, ^0 N) o, A
子等之資料,並插入新鍵資料。
/ V% u" o8 | A: b' ^ 範圍:/ G& @# \6 X7 }) @0 G% m0 D
e 由游標所在位置至該字串的最後一個字元。6 Y3 _5 l; S( C
w 由游標所在位置至下一個字串的第一個字元。% ~( k& f4 z- J2 M& b! K6 |" z3 }8 W l
b 由游標所在位置至前一個字串的第一個字元。
* V6 }& k& V ?5 |" [% V $ 由游標所在位置至該行的最後一個字元。
2 G9 r& I" U; s2 r; ?0 N7 s1 r 0 由游標所在位置至該行的第一個字元。
1 w- P% s) k3 `$ a+ O6 O3 J9 w/ S ) 由游標所在位置至下一個句子的第一個字元。
6 g4 V% B) l; s3 u- Q K9 r7 p ( 由游標所在位置至該句子的第一個字元。2 v+ T% k3 y1 A- r# b8 C9 Y6 g
{ 由游標所在位置至該段落的最後一個字元。* H, ^4 _% u* I5 }
} 由游標所在位置至該段落的第一個字元。+ G# t* p6 ]0 o
整行動作
+ S' Q/ h I) d- `- W) |7 i dd 刪除整行。
: [1 I" N2 K$ L8 Q( ?/ p7 U D 以行為單位,刪除游標後之所有字元。
7 k, I7 q) Z6 O3 m cc 修改整行的內容。
% J @" D# w$ E# K* _ yy yank整行,使游標所在該行複製到記憶體緩衝區。
; d3 u$ T8 r3 Y& n* n& |1 i, j% t& b* W: \, k( K5 {) G" y2 f& @
4.刪除與修改
, I- L! G% b) V) n! N D x 刪除游標所在該字元。( f! \+ H1 p9 e* J
X 刪除游標所在之前一字元。
6 \& V" N! o4 v dd 刪除游標所在該行。% Q9 y/ F! I: C) Y# p
r 用接於此指令之後的字元取代(replace)游標所在字元。
! t" Z7 B8 r9 J3 |& M) c$ ^9 v 如: ra 將游標所在字元以 a 取代之。% V( Y& e8 J, w4 G
R 進入取代狀態,直到《ESC》為止。+ D b% I9 n' b r
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
' q+ g3 _; [ J/ h. a6 F( U! e8 ] S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。8 G" k, X3 e$ C& H3 o
7 D) G; B0 U9 ~, m
5.搬移與複製
% d# n- Z, e4 G4 a5 ^ 利用delete 及 put 指令可完成資料搬移之目的。
2 I- z1 o# m: c9 c+ S" K 利用yank 及 put 指令可完成資料複製之目的。$ c& Z$ G0 e* |
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令. J) Y3 K1 j+ I5 ?
可將緩衝區內的資料複製到螢幕上。
& o {: d& D, J& x 例:" b4 @( e+ B# b& V8 e- ^" Q: q! ~
搬移一行 ‧在該行執行 dd, |; V. q( n [* N3 h) @* N
‧游標移至目的地
, x: q% _( M% ^7 i8 u ‧執行 p, M" O# R" S8 R6 T% y5 z% q7 _
複製一行 ‧在該行執行 yy
x7 M/ J7 U) Y6 |+ X ‧游標移至目的地
x( N$ O+ I2 |. ]+ q j0 ? ‧執行 p7 u4 T E( X1 {) S: A
+ b' V3 W* y: A2 C" j2 b9 P# X6.指令重複6 \ b4 s! _( E: E
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n4 C3 ^3 p0 w9 d, P" h, Q
次。+ k3 S5 J+ x2 L0 d7 G
例:7 u) }4 y& p* n5 F1 B I
刪除10行 ‧10dd/ y/ P0 l8 K7 l3 p
複製10行 ‧10yy
5 D% m$ O/ s+ F& Q" @( h/ G ‧游標移至目的地
6 m( G8 A, p6 J8 G, P1 q ‧p
$ T# H" I( W) C% S 指標往下移10行 ‧10j2 M5 M* u0 B4 R, h" r% W$ v
. f7 O- G3 S1 K% ]- L! c7 ?8 ~
7.取消前一動作(Undo)
4 @, n3 [) v- G' w: X0 ` 即復原執行上一指令前的內容。* e+ G' N. ], }+ z1 ?6 A
u 恢復最後一個指令之前的結果。. m, m0 m% G" Q
U 恢復游標該行之所有改變。3 S+ L9 i+ j+ X0 N" l S
" t# c' m# |9 L7 }, f7 i( O
8.搜尋
. n+ [, D% q: v# d 在vi中可搜尋某一字串,使游標移至該處。
$ i( V2 z) t/ L. i) j0 q$ b9 z3 ~ /字串 往游標之後尋找該字串。
6 L9 o" n+ P* Y, N) a* B ?字串 往游標之前尋找該字串。7 x/ r7 G) u' w/ O& }1 b0 g& S$ k
n 往下繼續尋找下一個相同的字串。3 m `8 m! N# ]5 x# P( }
N 往上繼續尋找下一個相同的字串。
$ x1 U; U. v7 n
* v8 b) R) O; F& y9.資料的連接
1 K2 X% s0 J8 v0 u0 D: I J 句子的連接。將游標所在之下一行連接至游標該行的後面。( {6 m; r% j* _9 S- ~
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式 {: l3 T2 T. t" `: b0 L8 B$ _
(可利用a、i等指令)再按《Enter》即可。- B/ I4 a4 d' s A# Q
& s% q" \3 n2 k$ P5 ^5 e10.環境的設定
. i- @" f& o9 J$ X( A6 G :setnu 設定資料的行號。
" G+ R5 ^, L$ p# ? :setnonu 取消行號設定。
3 ~0 E# t1 `/ G* W: L. I0 h :setai 自動內縮。
! X% X6 h/ V) F, ~5 j& S :setnoai 取消自動內縮。5 p# ^4 U% P# _( ^+ `8 L, d
自動內縮(automatic indentation)
5 a. w8 C5 U: @9 P- S0 r* A 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
% @* g7 s, g d% B' ?4 ~ 動內縮的功能,用下例解釋之:
8 j) X9 ~2 Y& z ‧vi test0 {, l6 g+ V$ b) H7 _
‧(進入編輯視窗後)
[8 J) j. [4 `# ?# r$ Q% r this is the test for auto indent1 h8 J' R1 ^/ P: i
《Tab》start indent ← :set ai (設自動內縮)8 S0 ^1 U' E. _* M
《Tab》data
/ h) U: o: \' U( L! x+ i 《Tab》data
3 s, T1 i3 {8 i& }. D o3 g% q 《Tab》data ← :set noai (取消自動內縮)
; j5 V2 J& v0 f N% Q: H the end of auto indent.
2 [/ a; I/ E( d% _. l% p# N ‧註:<Ctrl><d>可刪除《Tab》字元。+ z- [. X$ ?6 r6 W1 y- E2 L5 c
+ I# f8 w0 O7 W9 |6 u* a11.ex指令
* F% @9 D/ ^: a8 @9 C& s2 } 讀寫資料2 t, K/ t) l/ `: F- E3 @" V
:w 將緩衝區的資料寫入磁碟中。
0 w1 \3 b& q7 P8 k: k1 A :10,20wtest 將第10行至第20行的資料寫入test檔案。
# J% a$ b D! g8 I :10,20w>>test 將第10行至第20行的資料加在test檔案之後。' ~- J) T! h, L" ?
:rtest 將test檔案的資料讀入編輯緩衝區的最後。5 Y. C* w% S9 X( s0 _2 ]" N4 U
刪除、複製及搬移; T+ a- ~" A4 S6 T- ~6 {
:10,20d 刪除第10行至第20行的資料。. Q" {5 j% z: a9 P2 M/ J; ]
:10d 刪除第10行的資料。
) A% n" J4 _" q& _ :%d 刪除整個編輯緩衝區。
" b* d' J2 C" t; m- `5 z :10,20co30 將第10行至第20行的資料複製至第30行之後。' H Y C8 A, Z8 A% ]% ^+ J
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。& Q! @% Q. a: h. Z' U
字串搜尋與取代
$ B' S( `5 b2 C1 S s(substitute)指令可搜尋某行列範圍。
7 R, N2 k2 g+ i) B8 S g(global)指令則可搜尋整個編輯緩衝區的資料。! t3 f8 ?& v2 Q6 q6 f
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條) y" r2 P5 I8 |7 b8 }# }
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。9 G, ~; B" e+ D- z. Z0 E: U# F Z/ V
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。, T/ b, W- ?5 y. r
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
( c* q; m1 D4 ]- [ :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。, T- A1 m! ?. p0 L
* b ]; f( i$ t
12.恢復編輯時被中斷的檔案
U) U& b: o4 ^+ j 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
# V% [* f% v# b: Y3 R5 D5 i 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
/ N5 _8 V, g: \+ c% b t' F$ N6 ^ 的檔案內容。/ H! T0 z, t/ H$ B6 h! @# s- @+ E+ X
%vi -r filename
& v$ y; S# t8 u& t8 n% \, |; z6 E1 p% x- ?% K# A; ~' }
13.編輯多個檔案
7 t' U! @% P4 B! r; s vi亦提供同時編輯多個檔案的功能,方法如下:% L" z a! v' n
%vi file1 file2 ..1 |+ B4 }- x0 Y$ K: V; l+ q
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後1 _* D4 J8 X4 [& p% D" f
再利用 『:n』載入下一個檔案。" L* f4 l3 {% y
2 c1 [6 `( M6 E2 y5 `
參考:$ f! N* [2 U! v* R6 g: R
/ b0 s8 C: }- p+ P0 m& Vhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html
- [! ]' e8 Q& C) N- T; O6 Y* A |