tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯
" \1 l8 W7 j# ?& \& O- F9 }0 b
$ ~- o6 `* m/ D* c `; evi指令說明(完整版)
- b3 [8 G# w) v. P4 U5 ^+ _0 R- vi 的操作模式/ b" f; t4 c& A# u% q# X! k; j
- E0 m5 M0 Z" Q6 b, Tvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式: j& \, H ~" l$ `9 w/ ]# u
' h+ c! H Y/ {$ W3 e7 L 如何進入輸入模式
5 c3 `) n$ w) P4 `) C: k8 [, I a (append) 由游標之後加入資料。
/ A) K, \, F' W1 `* O A 由該行之末加入資料。# [, @$ @9 k i8 l
i (insert) 由游標之前加入資料。, \/ J- A7 ~, H) [! M5 k
I 由該行之首加入資料。
' }% ~) ^: w/ I! D9 i1 p; x9 |5 C o (open) 新增一行於該行之下供輸入資料之用。
; T" Q: z/ X7 `4 B/ d2 | O 新增一行於該行之上供輸入資料之用。- t3 K0 X% p- U& j
如何離開輸入模式5 s# H# s; f' O8 U; u7 ^4 L6 N q1 G! I
《ESC》 結束輸入模式。8 q+ X; C4 G& P3 Q
" Y7 h* m8 r) O! A8 e
1.游標之移動
' [, N$ n& A- H7 V7 O. ` h 向左移一個字元。
9 M* ~" t3 F9 K j 向上移一個字元。" q8 d2 V- u) H8 o; v7 X
k 向下移一個字元。/ {3 G `: y/ H6 _% A2 }. C# `
l 向右移一個字元。1 [& ~5 Z7 a3 M4 V7 u P' r3 t
0 移至該行之首
0 S u; K0 P0 J3 [ $ 移至該行之末。1 b+ @$ T% u* H6 l$ U
^ 移至該行的第一個字元處。
8 J4 j, t- r3 s5 v: E H 移至視窗的第一列。. h4 J; g# `, k3 y- m
M 移至視窗的中間那列。2 D/ x7 o% } j6 W- _* A2 r% |
L 移至視窗的最後一列。
" n5 v, g2 @8 F6 q( e G 移至該檔案的最後一列。
7 M% a4 a( M( }% v7 P3 a; W + 移至下一列的第一個字元處。, Y- U0 n7 y r' a
- 移至上一列的第一個字元處。& F8 v+ b. y I, p
( 移至該句之首。 (註一)- a* {! ]7 X1 u+ E
) 移至該句之末。) ?: v! t. V' i/ X4 p& U
{ 移至該段落之首。 (註二)
) }# a! N- X: I' O- q9 R/ { } 移至該段落之末。
3 L1 {0 ]" Z5 X j nG 移至該檔案的第 n 列。' Z) S/ Z% N! |! R. \0 t0 }
n+ 移至游標所在位置之後的第 n 列。
# {! ?, Y" e$ Z; \) h n- 移至游標所在位置之前的第 n 列。
7 u: E, _# ?! v* w <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
0 e* P/ u- i/ h3 X 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
; u4 G4 H8 E+ `) C( s 註二:段落(paragraph)在vi中是指以空白行隔開的文字。8 H, z* {" g9 a, |
; u% H: @* l5 F f3 X
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
0 ~2 w" l) D6 X8 m" q5 V <Ctrl><b> 視窗往上捲一頁。) z1 `* P# f9 O5 P! w3 {% j) T
<Ctrl><d> 視窗往下捲半頁。
& e# f1 M2 U; i/ }, Y6 D! k3 z* m <Ctrl><u> 視窗往上捲半頁。# z0 t3 ^5 ]& _# e. ]9 ^ G/ }4 F
<Ctrl><e> 視窗往下捲一行。1 ?3 V& _$ q; J; x! M' _
<Ctrl><y> 視窗往上捲一行。
& E" O# {( u; R( H$ p' d4 P. Z& O2 `* A2 h. E
3.刪除、複製及修改指令介紹 (此單元較少使用)
: @+ e+ k5 x# M7 i d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:$ m7 n6 g' j8 e1 `, t" l* {% }
Operator + Scope = command
+ ^$ D+ R; `6 }4 i8 k3 s (運算子) (範圍)
* a# x) U9 g6 Y" @3 ]: ?8 J 運算子:& Z [5 ]# W, |& G% T2 @
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。9 K$ _! g( ]# n3 Z: x9 F
y 將資料(字組、行列、句子或段落)複製到緩衝區。0 v3 |( U/ c( L! i, w) ~& F {6 D' Z. G
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
6 w/ [4 W: ^ b. t* m7 T5 a 料放置於游標所在位置之行列下。3 D w% c& g* G5 R
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
: s9 }. j# T/ ^1 J' |4 s 子等之資料,並插入新鍵資料。
, R, H$ C" ?# Q9 H) Z" F# [: d 範圍: B) j1 m1 M$ f3 h0 q
e 由游標所在位置至該字串的最後一個字元。
4 m( N5 ]/ ?# @ w 由游標所在位置至下一個字串的第一個字元。9 v2 J9 u5 j* e8 `2 Z
b 由游標所在位置至前一個字串的第一個字元。
! @- m1 w7 Q& v1 H8 b $ 由游標所在位置至該行的最後一個字元。
( X; f! Q2 G$ g4 @. ]* V: r, i 0 由游標所在位置至該行的第一個字元。; N p2 n# l/ B" z
) 由游標所在位置至下一個句子的第一個字元。: r# U8 V% O/ c$ k ^2 {
( 由游標所在位置至該句子的第一個字元。
3 ?8 _5 J& w! z, k { 由游標所在位置至該段落的最後一個字元。
4 K$ Y% I/ A) `( `& G } 由游標所在位置至該段落的第一個字元。
- S/ a; p7 O v2 w3 e0 M 整行動作 i7 l$ g& O( m8 v1 f1 r/ R
dd 刪除整行。: J. ~8 X; k1 }& m6 _( D( i, F
D 以行為單位,刪除游標後之所有字元。) h6 d. S$ h& z ] @& C6 _
cc 修改整行的內容。9 l: L* s& P( e) [
yy yank整行,使游標所在該行複製到記憶體緩衝區。
' t8 ]- A( B/ S1 k: L( \
7 D- j# ?1 } \# }+ s ~4.刪除與修改5 T. O% l' h* F0 ^7 p+ c( k
x 刪除游標所在該字元。
# g T/ T% E5 e" ^ F& ^( q X 刪除游標所在之前一字元。
# o& |8 E% f7 h; N, { dd 刪除游標所在該行。2 S m2 S: X1 k. Q5 B
r 用接於此指令之後的字元取代(replace)游標所在字元。
3 Q, l$ @1 N: w* M M 如: ra 將游標所在字元以 a 取代之。
) o6 W( j- G4 v R 進入取代狀態,直到《ESC》為止。6 e( F, A' M1 N E, V' Q+ _
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。6 n, F' ]" N* {9 ?
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
9 m k% ]: E* j1 g: o# E( @; B- h! m I! J7 ]9 d {
5.搬移與複製9 ~3 K; u4 v( I& I! d3 W
利用delete 及 put 指令可完成資料搬移之目的。) Z# N% S; g% \
利用yank 及 put 指令可完成資料複製之目的。: O4 @1 F2 |) i4 B: z! _' K
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
/ x$ ^' |2 _. @" A) g; W 可將緩衝區內的資料複製到螢幕上。9 P8 Z; ?0 J& Y0 {2 e$ L
例: T. P o/ y/ D. \: T, Q
搬移一行 ‧在該行執行 dd
; p/ E w! q# `% S ‧游標移至目的地: ?( h4 x6 x% e# K! T+ s4 }
‧執行 p
' _' u' u7 a, ] 複製一行 ‧在該行執行 yy% e6 b* K+ q1 j) S+ L j1 u
‧游標移至目的地
0 ^! ~' ^3 B: k* ?; V ‧執行 p F4 a$ L' L+ g) x
4 k! v% U( e# g6.指令重複
6 l' F. G' ]; i B# s 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n+ q6 m# G f# b+ M
次。
( v: o7 W6 C1 u3 m 例:3 F( T0 H; @. v( }/ i. s f
刪除10行 ‧10dd5 [" ]% L" }0 Z7 E0 F, ]
複製10行 ‧10yy& g& Z/ [5 G& W" D5 H# V4 {
‧游標移至目的地
8 y. Z* o3 d/ k8 G( C3 Z" K3 y ‧p
! b) k! ?' W" u. P/ n4 b 指標往下移10行 ‧10j
2 a# n$ m* c7 i6 ~5 N ?9 a5 }% \ `2 ? Z7 k$ k; Q: ?
7.取消前一動作(Undo)
& K4 g' E- ]+ D 即復原執行上一指令前的內容。 \$ ]; H8 m6 ~- ?
u 恢復最後一個指令之前的結果。4 f8 r; I. m. A/ s7 e
U 恢復游標該行之所有改變。
: _* M- ]1 M c ^9 F
( Z3 W+ i; Q' Z0 b: r0 ~, X8.搜尋
+ R9 {( S& j9 i% h5 U( w 在vi中可搜尋某一字串,使游標移至該處。
! u& u/ q/ m" V4 }7 } /字串 往游標之後尋找該字串。
x% o; ]. `) k! ~ ?字串 往游標之前尋找該字串。
. B7 F/ D6 D" p+ s, ~ n 往下繼續尋找下一個相同的字串。! U4 C# Q1 C, E3 G
N 往上繼續尋找下一個相同的字串。
, X# f9 @4 v0 M3 H; Z# ]6 H1 B8 Z+ g& b& P# R
9.資料的連接
3 z! c0 ~, ?) ^6 i J 句子的連接。將游標所在之下一行連接至游標該行的後面。
6 ~4 N( ?" Z1 W8 Z/ L 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
: q+ N6 H4 A* Z) }0 a/ K (可利用a、i等指令)再按《Enter》即可。
' p6 l9 Y+ Y. T/ z, X$ p. B' B' ?: e" B; @7 ^" n
10.環境的設定
! d% Y2 Z6 C. V; ? :setnu 設定資料的行號。
, o) E& v; ^( |+ V w8 W% { :setnonu 取消行號設定。$ Y/ L' ]' X2 n- ~
:setai 自動內縮。
7 G# Y9 ^) t4 S; T5 m/ k$ j1 ? :setnoai 取消自動內縮。
2 Q* V& C+ J% |) V; L2 j 自動內縮(automatic indentation)$ x! a; S4 Z0 ]' {3 R2 F
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自- m. w/ d& y* v' }( |' x' X
動內縮的功能,用下例解釋之:1 @+ R, ?- F$ r# ~9 v
‧vi test0 L/ e7 \5 a0 Z" a) O2 w9 k$ Z
‧(進入編輯視窗後)' }8 a* Z- o& o
this is the test for auto indent- Q: c9 t* g% P ^: R
《Tab》start indent ← :set ai (設自動內縮)
* ~& L. I6 f, D- N# Y+ q/ ? 《Tab》data2 g. |8 h8 [: f6 z7 ^
《Tab》data
+ b$ c7 C( A4 u7 v2 M. N, ] 《Tab》data ← :set noai (取消自動內縮)# t- k9 \: q) c: ]1 N
the end of auto indent.
5 g7 H6 G$ T6 l ‧註:<Ctrl><d>可刪除《Tab》字元。3 x) t2 s+ o" h t! W6 o V. `: R
$ C" s' ^! t9 ^/ y) `- N: x- B* N8 |! `11.ex指令
4 Y9 B* d0 i5 }/ [+ R2 }, R3 l 讀寫資料6 o9 j, g6 q7 q1 n/ c. u
:w 將緩衝區的資料寫入磁碟中。- h9 Z4 H/ }: D; N* w* M7 `: l
:10,20wtest 將第10行至第20行的資料寫入test檔案。; N$ a$ N5 ^# {* _5 a! \
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。% O5 |$ A% H; H4 c; I
:rtest 將test檔案的資料讀入編輯緩衝區的最後。
% f7 P! h6 b, T8 e; T9 d( P. G# J9 J 刪除、複製及搬移/ B* A" B7 G; P- _8 ^; f1 t
:10,20d 刪除第10行至第20行的資料。
+ ^- P+ i! a" z# I- x :10d 刪除第10行的資料。
: o( w9 E5 n! w! O7 G1 e* }* z) v, a :%d 刪除整個編輯緩衝區。
1 ]" T/ M) N, P+ _4 P. n( J& ~ :10,20co30 將第10行至第20行的資料複製至第30行之後。- W, H7 ~8 c+ f% _7 A
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。: m6 t4 X8 F/ n1 n1 c2 }
字串搜尋與取代
2 A- v8 ~1 e: I s(substitute)指令可搜尋某行列範圍。
$ q$ Y+ M# S0 I# k0 H g(global)指令則可搜尋整個編輯緩衝區的資料。
* [ |9 q5 c C$ [% L2 H s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
! q# {4 e8 u2 Z1 ` 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
& S& ?0 ]3 Z' G2 Z* w :1,$s/old/new/g 將檔案中所有的『old』改成『new』。5 E# m, U; P( B# @
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
5 F+ v. b. ~$ E! F7 p9 r1 d9 Z :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
: C2 T8 R c: G& s% k/ R6 B$ {+ m8 K$ f/ T8 E
12.恢復編輯時被中斷的檔案
- g: ~, R4 F) G% c8 p% v4 r3 q8 u0 T1 u 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未) ^ w) J. A& P) \
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前( n3 T+ P; ^) _! _$ H
的檔案內容。
) a: T; X8 D/ `2 `* H %vi -r filename' z7 O) i& g, y5 j
8 P) y* N8 c, v+ [- [) u' q$ H+ A& {) m
13.編輯多個檔案 m4 i1 s$ n$ Y2 O* i' S
vi亦提供同時編輯多個檔案的功能,方法如下:
9 B) T/ M$ q* q4 y %vi file1 file2 ..8 B4 j H0 _1 x+ S" V) h
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後% C' E( ~2 o7 B/ W0 q
再利用 『:n』載入下一個檔案。
5 F/ h5 G/ ]" q/ S& }! M
$ p- S( ^1 c2 ?參考:, ^! k5 J2 z$ V1 h. ~' `
- `- q2 _- b5 n) N8 |4 R# u* jhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html- m; D2 F; O- ?! {1 H7 _
|