本帖最後由 IT_man 於 2017-5-6 23:16 編輯 9 g9 j8 ^- o* F3 W! f# X0 L
- c4 T* K0 O9 n) `9 q# K% |& v
vi指令說明(完整版)
% d1 o+ Z# j& n4 x C' j7 I- vi 的操作模式- K+ W2 c& L. z5 o6 Y1 n, E
) I( `' S) v h& V3 {& v, B
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
h8 G( u( ~/ C8 B% y1 o
1 \! `8 [& V7 L! o' a, p8 x 如何進入輸入模式; x, E: b6 ]) k2 F5 O
a (append) 由游標之後加入資料。& h/ Z- N5 w7 C% h+ s/ f: ~, w& e
A 由該行之末加入資料。& J" Q' b/ Z" H2 m* d, d) }+ o% k
i (insert) 由游標之前加入資料。# c" A" t: d# j; l$ B2 L c
I 由該行之首加入資料。
; G; o" y4 W }3 ^1 g' n4 ?0 s o (open) 新增一行於該行之下供輸入資料之用。, x. ?2 N- x X, b+ ]1 G
O 新增一行於該行之上供輸入資料之用。9 N6 |6 Z; G( M8 k
如何離開輸入模式
% I1 i- D9 z. c J6 W7 } 《ESC》 結束輸入模式。
8 v4 O% ]) T% |6 ]! G' c
5 u6 V0 l S: I s1.游標之移動' M: Q' c! V4 L& Z3 z' j) m
h 向左移一個字元。$ j7 `' z4 E4 H( v, W. ^, l
j 向上移一個字元。5 r6 D& u+ G+ ?/ T
k 向下移一個字元。
~. e3 T( v7 f! x" h l 向右移一個字元。
& D# j: n. g- E1 M/ \* ~! \9 q 0 移至該行之首
7 Z9 [$ f2 Z' m1 i, @# T0 v $ 移至該行之末。
8 D6 h6 z1 v' n7 p9 l2 @ ^ 移至該行的第一個字元處。# f; J+ X8 I. A* Q1 R0 z
H 移至視窗的第一列。
- L7 N) v: Z$ P- y* } u4 } M 移至視窗的中間那列。* v6 x/ R! n- {9 q4 [ }
L 移至視窗的最後一列。$ F2 ^! `1 a; Q$ z! I" s) ~! ]9 z2 T
G 移至該檔案的最後一列。
+ C. d/ I$ z: p2 v/ V5 b: s9 y + 移至下一列的第一個字元處。
* ~+ i O% J; @) x - 移至上一列的第一個字元處。
# z; ~4 K& y- I ? ( 移至該句之首。 (註一)
/ j" Y1 }. y! S# o' G ) 移至該句之末。
% p& j# e1 e! ^* X. J3 [ { 移至該段落之首。 (註二)5 d8 H) s4 o+ N6 }
} 移至該段落之末。4 x6 z) ]. l; z/ G+ ]
nG 移至該檔案的第 n 列。% e# M8 r n# f' X9 ?
n+ 移至游標所在位置之後的第 n 列。
/ C* `" T/ `: }# ?, i. Z5 } n- 移至游標所在位置之前的第 n 列。- u6 @3 L3 \4 e( B/ p, J
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。 H0 {! f) }$ c; H
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
5 s1 n, y* \1 t$ }6 Z 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
' P3 M5 T( U7 `$ ?; \7 m E( O: s. ~
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。+ F0 d- M& v; l( S' t# p, \
<Ctrl><b> 視窗往上捲一頁。
) L0 @9 T3 \0 ]# K <Ctrl><d> 視窗往下捲半頁。
# B' F: E+ j1 i' L <Ctrl><u> 視窗往上捲半頁。
, u+ e0 d4 w& ^1 V <Ctrl><e> 視窗往下捲一行。) f. h0 v$ a% @% ^
<Ctrl><y> 視窗往上捲一行。 |3 x" Y: T8 ?# v
/ K/ s) }- b5 @5 q3 A/ k3.刪除、複製及修改指令介紹 (此單元較少使用)1 {* j0 G6 i1 G- m2 F$ w
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
! l5 Z4 e4 f& `, H Operator + Scope = command
( ]+ f! v7 u, b& |0 z. Z% Y (運算子) (範圍)
! z3 X$ ]$ I4 @/ R: V3 W 運算子:
3 ]. L" ?5 t; s d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
5 d5 G+ A% h5 W* c! \. Y y 將資料(字組、行列、句子或段落)複製到緩衝區。
/ [; L3 Y% b0 L+ X, C# q9 Z p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資3 z- I1 R" m$ |! o g( {
料放置於游標所在位置之行列下。: o& |' j v$ R9 W+ _
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
& A0 G& J0 U8 X! o( D4 Q: ^ 子等之資料,並插入新鍵資料。# E3 n" G+ x9 y+ v; z' h D
範圍:( P0 I( w- G3 ?6 p+ b! U; `/ V
e 由游標所在位置至該字串的最後一個字元。
) x+ p4 q( b" a$ |1 ~/ ` w 由游標所在位置至下一個字串的第一個字元。3 A2 {. a1 r1 z @% c
b 由游標所在位置至前一個字串的第一個字元。! `9 X9 {- m- O# u b
$ 由游標所在位置至該行的最後一個字元。
3 n' i. } t4 C 0 由游標所在位置至該行的第一個字元。2 ~$ L( i7 x, ^1 j) f
) 由游標所在位置至下一個句子的第一個字元。$ m& V0 ~0 D- k% C
( 由游標所在位置至該句子的第一個字元。
8 p* J. w) v1 U4 c; W { 由游標所在位置至該段落的最後一個字元。
4 J2 K0 q+ P! y' K9 ^& C } 由游標所在位置至該段落的第一個字元。
$ Z, L; {# K' r; ]$ w! O0 O2 C 整行動作3 v0 U }1 Y2 J2 C/ Z4 d
dd 刪除整行。% \8 ^% H/ C$ l/ g O. W
D 以行為單位,刪除游標後之所有字元。
& b. Y: C9 y b6 ]7 F cc 修改整行的內容。9 T4 Y- |4 @* w A. ]7 V1 F$ J
yy yank整行,使游標所在該行複製到記憶體緩衝區。
# Y5 a/ n# N8 t
) r2 d: \1 Q/ C6 e4.刪除與修改
~4 H f- i5 `# o& S, L x 刪除游標所在該字元。
4 w* g2 D7 j6 e( ?# o& I X 刪除游標所在之前一字元。
; ?6 h" i1 g; M" \ W; f dd 刪除游標所在該行。
+ Z5 t# N& v4 y( U m, S r 用接於此指令之後的字元取代(replace)游標所在字元。
; X% B" Z; D% Y* U4 } 如: ra 將游標所在字元以 a 取代之。4 t7 r" \) b: l. G1 n8 }
R 進入取代狀態,直到《ESC》為止。) ]$ z7 v# `2 J6 d, \3 f8 V
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。! a. l! _8 V& B. S
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
& M$ k) ^+ n5 r$ Z* p# j" i- u' K( w. c4 O. [4 l, V- f. G: h
5.搬移與複製# n/ ^8 q) ^- A4 s7 Q/ j( v: P
利用delete 及 put 指令可完成資料搬移之目的。5 P3 O+ v* ^' N: F# H/ Y
利用yank 及 put 指令可完成資料複製之目的。
5 }7 A1 K& i2 T2 \0 s% M yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令5 ^' @9 x2 F* n0 k
可將緩衝區內的資料複製到螢幕上。
) u+ p2 P0 W3 H0 K7 s+ g 例:
z; H; q" D# I) q ~ 搬移一行 ‧在該行執行 dd
4 S( ?* j, E6 p ‧游標移至目的地
: f" h# {: u# h( H* C1 H ‧執行 p
) n7 w+ X+ J3 S! e 複製一行 ‧在該行執行 yy
2 x3 I8 I+ u& M; a( _+ r/ m0 F ‧游標移至目的地
* ?1 a8 _9 P6 k, [% A, i ‧執行 p, U* Z: M7 _: i$ K1 [
/ K/ E# t0 z6 N2 @# }+ u
6.指令重複7 X" F& V0 p% g3 M0 T
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n* Y# R O- ]$ p; ]# G
次。
6 M) L+ b5 L+ w0 Q+ G3 j 例:& I+ @0 l( C) j1 u
刪除10行 ‧10dd
; l& m4 \/ `/ E8 `" u# _ 複製10行 ‧10yy
, K4 Q$ @5 W$ S- U( S% c$ c ‧游標移至目的地
) M4 U8 x; A0 V8 r6 a% [ ‧p
+ o- P3 O/ G j 指標往下移10行 ‧10j
% A4 g- h% c9 V0 _6 u$ V5 i7 [ j) w) F2 F# d) X4 g9 ?
7.取消前一動作(Undo)% ]; `& Z) J8 k: O, ?& a! t
即復原執行上一指令前的內容。7 S. ]2 b. F% E5 D2 b0 x
u 恢復最後一個指令之前的結果。& x! I0 J) d3 l4 R }2 _; B
U 恢復游標該行之所有改變。/ l. q- k) ]3 t* J
7 |3 _9 [# f5 O
8.搜尋
4 u- d1 w$ u/ \1 ? 在vi中可搜尋某一字串,使游標移至該處。
& Z" E# e' X" |! ` r$ b& q; @ /字串 往游標之後尋找該字串。
3 r& K& B1 O1 q0 \" `- S# T" { ?字串 往游標之前尋找該字串。
$ ?9 A/ [) x0 A) f, |, T' T6 T n 往下繼續尋找下一個相同的字串。, q8 k# z' y8 q8 y& V
N 往上繼續尋找下一個相同的字串。
5 z; L2 c( O1 Y' I
9 U+ ^( m4 r# d7 ?* h; O9.資料的連接% R3 P- H8 C2 {1 i1 h4 e3 l% |
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
' E% O* D7 n7 o+ L' g; w8 B 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式( ]+ N* S; _; ]. w& K( T
(可利用a、i等指令)再按《Enter》即可。6 ?* r+ ^; C; k, k4 a9 V
3 f( k- Z- I$ p5 ]* D7 O10.環境的設定! l7 c; e$ D, c3 v+ `- E# d* y6 B
:setnu 設定資料的行號。
" g ]3 D/ `4 `$ j- q6 D# H, @, p :setnonu 取消行號設定。, B7 y0 o4 M8 w
:setai 自動內縮。
7 A9 ^. o) h9 E8 L: \% t4 ^% a( w :setnoai 取消自動內縮。
% h: q5 b7 W1 A$ V 自動內縮(automatic indentation)
1 C }8 Q" I0 |5 d; \- G! w8 P7 R 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
/ ?; _7 o2 H! m! W: s 動內縮的功能,用下例解釋之:
& P1 `5 Q s) L% _ ‧vi test- O) Z5 U0 k2 Q
‧(進入編輯視窗後)
6 y1 t' Y% V2 v& X F this is the test for auto indent
. M/ ~1 ?; @6 @: ?; ~ 《Tab》start indent ← :set ai (設自動內縮): H1 s9 D& S. O' Y; D# C
《Tab》data
3 E2 x, {4 q' u5 n$ F; @ 《Tab》data6 f* {+ A! X) ~
《Tab》data ← :set noai (取消自動內縮)
# _( p0 P+ u. ^ the end of auto indent.
7 E9 Q, |9 n0 y" V+ {8 E% W ‧註:<Ctrl><d>可刪除《Tab》字元。% A! P% ^+ j1 Q; u: j5 q
! [8 R2 T" ?: z8 j U$ f2 b11.ex指令9 Z9 O* P' a$ e
讀寫資料
0 G3 j9 O7 D8 C. d; R; Y3 U :w 將緩衝區的資料寫入磁碟中。
" A2 n! s( s. |6 V7 K9 j$ T :10,20wtest 將第10行至第20行的資料寫入test檔案。
/ _) }. l: R- ?' Q :10,20w>>test 將第10行至第20行的資料加在test檔案之後。
3 U( o. m' A: D& f :rtest 將test檔案的資料讀入編輯緩衝區的最後。
; O G! b) l1 ]" M/ C 刪除、複製及搬移9 k7 _2 f3 a6 F
:10,20d 刪除第10行至第20行的資料。+ f2 o/ q' M b# e3 k
:10d 刪除第10行的資料。
& q6 z! Z+ W; M :%d 刪除整個編輯緩衝區。
0 v7 L( t3 t* f4 m% Z" Q :10,20co30 將第10行至第20行的資料複製至第30行之後。
; @; F8 M" r9 a :10,20mo30 將第10行至第20行的資料搬移至第30行之後。
r+ A4 g# R0 m, J. q 字串搜尋與取代
8 o& m- A* [) s6 J s(substitute)指令可搜尋某行列範圍。
1 q4 c0 F3 [5 P1 _+ z0 ?& E n# l g(global)指令則可搜尋整個編輯緩衝區的資料。
. O9 }8 I1 f. B+ b* h s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
2 [6 R$ o% L2 J/ d/ j! ~! B 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。3 F! t, g ^ h ~) [4 {! S" H. K
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
/ E0 ^7 ?6 G, l6 f1 C8 I% `3 f. M :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
+ [7 @" ^# L) k, Y2 a4 P& V5 x :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。# |! J; j+ K6 b5 k6 f
4 b% O& ^' a2 r9 P. t. R# `5 E! C" B12.恢復編輯時被中斷的檔案
N; T" T5 i1 w" S& [& b3 z! i 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
8 c8 B4 H" p& E. ^ 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
^7 z0 m0 A" y 的檔案內容。
6 `/ Y$ M7 X7 x7 ?8 Y, N p/ ^" D %vi -r filename
0 W* ]5 `1 i9 w; z. y+ R1 i2 m# I2 f9 z$ _
13.編輯多個檔案$ u( d0 G+ F# B" b; T
vi亦提供同時編輯多個檔案的功能,方法如下:6 s4 k- ]: o9 ^
%vi file1 file2 ..8 V) Z0 {5 [. o
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
# ?$ q- l2 y5 j7 X 再利用 『:n』載入下一個檔案。, v; O D _1 x) k) [6 [
. ~! f. {6 j! r5 M# c1 j參考:
7 J* h* n) u/ A
2 Y; |! M' U$ O% k1 H2 A: Jhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html9 h, N. b8 `; A& U4 ]9 g
|
|