tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 ! x. R+ K# U5 t( P% X1 a3 p; O3 c
6 j7 \6 k" H# n, q7 H$ ^/ U) ?
vi指令說明(完整版)2 @* Z/ Z' L4 f L( M
; R) W& a+ y% {' e% Jvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式: l! @& X: a7 k! P/ W' w
' b* Y; e8 Y$ y8 t7 N
如何進入輸入模式
, r' O2 i' w+ C a (append) 由游標之後加入資料。
. x. P* O* u; b" F( [7 T+ U1 A A 由該行之末加入資料。
8 E& w, l" n' c7 Y( k i (insert) 由游標之前加入資料。
( ^1 R' R6 J5 G' J. ] I 由該行之首加入資料。! m. s, C8 q. m- c) E+ U; G! u
o (open) 新增一行於該行之下供輸入資料之用。
2 ?. n) C4 c& F7 \ O 新增一行於該行之上供輸入資料之用。3 s3 [8 _2 {7 X) B0 }
如何離開輸入模式4 A% Q0 f" U% @2 I) I3 V! O5 y
《ESC》 結束輸入模式。( V/ V. ]0 R% v6 k' }
- 指令模式
5 z% M! P5 a5 Y+ j/ S. ]
- Q: `$ {# w$ f- S V
1.游標之移動
6 F# j0 l% j, Z h 向左移一個字元。6 n( x$ |% c0 T+ Z* |
j 向上移一個字元。
/ ^' R9 f* H: Z7 [' p1 h! A1 T k 向下移一個字元。
$ }' B& c* Z @* }# ] F l 向右移一個字元。
& B3 |# p+ t: x. c 0 移至該行之首# j8 Z4 u( b7 j$ T
$ 移至該行之末。
* a; |# e: @9 ~! k0 e ^ 移至該行的第一個字元處。
K5 c+ \4 x1 Z) ]4 D6 K, k& t H 移至視窗的第一列。4 p6 q* D$ h) w0 ^ l; ~
M 移至視窗的中間那列。6 z; o* m t9 H0 w6 o! f8 B/ R
L 移至視窗的最後一列。
2 Z+ `3 E7 ?; I6 ?, ^/ J G 移至該檔案的最後一列。
7 O! b. B2 u6 h3 F0 c + 移至下一列的第一個字元處。
" j7 {, k5 e4 \9 c. k - 移至上一列的第一個字元處。
0 n4 m% Y" I0 @6 H7 X ( 移至該句之首。 (註一) k" _5 Q; d9 j6 K
) 移至該句之末。4 @1 p) E8 V( q/ j7 v
{ 移至該段落之首。 (註二)
) t! @& N& t$ u7 C/ h } 移至該段落之末。) e! G& e/ T7 p# n6 F4 @; f
nG 移至該檔案的第 n 列。0 v& l; K- q$ b9 n- c* T
n+ 移至游標所在位置之後的第 n 列。
& g. B2 f5 u4 K* Y2 D+ W n- 移至游標所在位置之前的第 n 列。
0 J' B% h$ Y2 |: l: h* M# W$ Y <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
' s+ f" X) X- T6 X 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
+ `9 @' _3 D! e1 R0 ]1 Y/ ?0 F7 n { 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
/ n- p# Y; A5 X/ V" v' N0 D& z. G' Q( s8 \- C
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。1 {: k: N/ c; V' H3 G+ Y4 _( O
<Ctrl><b> 視窗往上捲一頁。
0 S; n3 @( t& w9 g$ u }) U2 J <Ctrl><d> 視窗往下捲半頁。
* P. ~5 Q- B& P2 X# \" A: }8 e0 D <Ctrl><u> 視窗往上捲半頁。+ H6 N" Y- G, J
<Ctrl><e> 視窗往下捲一行。
& i4 J" j) x/ E0 @/ j <Ctrl><y> 視窗往上捲一行。
; u4 i3 h/ L" I( G0 r. v) b7 y" Q" R; w2 A
3.刪除、複製及修改指令介紹 (此單元較少使用)
% ~' v# v0 F/ X" B/ b6 t* ] d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:$ I" s+ U4 ?( U$ J# ]# Y- A" |0 L
Operator + Scope = command
6 s4 H2 }: Q; C, S (運算子) (範圍)
1 f7 Z7 q6 y( o* \& ^ 運算子:
4 H+ q/ B- f7 x8 M/ e/ e# M9 B7 Q d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。5 e- h3 e) n: t
y 將資料(字組、行列、句子或段落)複製到緩衝區。
7 H$ x8 u( R: ] p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
, J6 k9 k, U4 r5 M 料放置於游標所在位置之行列下。
! ]7 m! Q! P0 } c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
% s0 Y; \" \, z' p5 ? 子等之資料,並插入新鍵資料。6 K9 Y+ M2 ?; @3 t: r) f4 y
範圍:
/ c# L4 P" |/ n9 _0 I e 由游標所在位置至該字串的最後一個字元。$ i6 F- p7 _- a0 \$ a/ q g
w 由游標所在位置至下一個字串的第一個字元。
3 c2 g% [6 |3 J4 K6 C b 由游標所在位置至前一個字串的第一個字元。
! _6 C* R; Y7 G, O5 W" u7 _8 J $ 由游標所在位置至該行的最後一個字元。
0 O2 S4 F- {" u: I1 l 0 由游標所在位置至該行的第一個字元。
3 \* Q' q. V: L4 E% h ) 由游標所在位置至下一個句子的第一個字元。
0 `, p( z) W/ d; C ( 由游標所在位置至該句子的第一個字元。
+ N8 ^5 U* k/ t9 X* Y0 b) y { 由游標所在位置至該段落的最後一個字元。
* F9 z$ N1 \1 C3 V5 j$ V9 q } 由游標所在位置至該段落的第一個字元。
C4 B' r7 z8 o5 S1 h8 | 整行動作
/ |" S# S' J8 r+ V, ~* ` dd 刪除整行。
! @5 j1 `6 w6 U# A% [( I D 以行為單位,刪除游標後之所有字元。7 e" r* X7 w3 U( k
cc 修改整行的內容。1 y- O5 r; ?6 b) ^
yy yank整行,使游標所在該行複製到記憶體緩衝區。
$ C! i, J$ G _, p% {+ X/ V3 u) w5 v5 M7 w, ` a# s7 R
4.刪除與修改
! v1 t7 Q% @0 S/ R8 ^ x 刪除游標所在該字元。8 F* l* E% c- `1 c
X 刪除游標所在之前一字元。& y# U- { C% z2 n: k
dd 刪除游標所在該行。
' m& _5 t9 k3 `5 d, g" ? r 用接於此指令之後的字元取代(replace)游標所在字元。
2 f0 E$ U# B7 M5 a; k" c5 B0 r 如: ra 將游標所在字元以 a 取代之。. W$ [1 F' I9 y$ y" ?
R 進入取代狀態,直到《ESC》為止。
( N: G7 ] b9 Y0 s m% N! L E& f1 O s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
# M8 r, b3 }" [% Q) b i S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。6 x7 G7 P Z6 @& E4 d
: t. A/ L" V6 \. F
5.搬移與複製( Z7 W, K$ s( H$ k% k2 i3 z
利用delete 及 put 指令可完成資料搬移之目的。
M8 h% d w0 I 利用yank 及 put 指令可完成資料複製之目的。
/ m; L, D* u- C" Q8 n yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
& p# }/ K" b6 h" h# J2 v! k 可將緩衝區內的資料複製到螢幕上。; ^) R- `. E2 {0 T
例:4 ?! K. V5 c! S) M6 i2 u8 X
搬移一行 ‧在該行執行 dd) v1 z' H/ B8 T8 {
‧游標移至目的地* P- O! |0 [& P. G. V1 {
‧執行 p
, q' Y# [: W+ H8 E; [% ] 複製一行 ‧在該行執行 yy/ i# a8 b- U/ p. p- x! w3 E6 m: c, a
‧游標移至目的地
4 [1 z7 A& @8 {& O ‧執行 p6 ]. i0 r9 \; }
% D& y4 _% O2 a; z, H
6.指令重複) K# O* Q$ ]) T
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n7 x2 d: r1 E( Z9 V) A
次。
. S9 ]- V3 J& R( n- r- R6 @ 例:. c7 ?0 I, u4 q4 T
刪除10行 ‧10dd+ g$ A6 W3 Z# T; n/ U
複製10行 ‧10yy* Y6 g1 H: \. F+ Z6 |
‧游標移至目的地
( r, r" i+ i" S. s( o( G! I( m ‧p; W( n1 l+ S9 W6 k3 r* \
指標往下移10行 ‧10j
3 ~/ E7 j4 A; M L! ~9 J) P4 [' t5 L" q+ e
7.取消前一動作(Undo)8 M- B9 D/ C I6 ~
即復原執行上一指令前的內容。
5 y6 Z4 \5 Z% ?! l2 r u 恢復最後一個指令之前的結果。( L1 a6 k3 x% _( ]) y6 j
U 恢復游標該行之所有改變。% t2 r8 a* v) E( r. a
: ]1 B) q, D3 t4 L- {* G9 a8.搜尋
$ r/ a7 P6 k- |: L6 U 在vi中可搜尋某一字串,使游標移至該處。" v1 z% a, l9 D
/字串 往游標之後尋找該字串。
& n: `1 D% a4 R- b( f l/ U) m ?字串 往游標之前尋找該字串。
8 [' I I! N0 J k1 J1 n n 往下繼續尋找下一個相同的字串。
# v+ {$ z! Z5 h% r7 T9 U# B N 往上繼續尋找下一個相同的字串。
8 A+ w$ w( O1 ]4 Q! R& u" L' F( J
: d9 L9 A# o5 x# |$ ?9 F2 y9.資料的連接1 w2 P7 T3 V6 d
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
+ C7 o4 S; \. q1 l* | 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式8 Y6 m2 s1 n- l3 J& M
(可利用a、i等指令)再按《Enter》即可。2 u& ]8 p4 w4 m v+ }8 v* ~
! ]! u/ }" P+ s$ ?
10.環境的設定
: ], a& |. |6 V :setnu 設定資料的行號。
9 U5 P* B P: \8 E :setnonu 取消行號設定。3 s% o' _, G; g5 a4 [6 w+ x9 F
:setai 自動內縮。
4 U# l- r4 u5 q( p$ c- j2 g' L1 W :setnoai 取消自動內縮。 o3 W; x0 w7 Q" F1 ]& y) v" C
自動內縮(automatic indentation)2 [: Y8 p, Q' `4 b. M
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
# b8 ?" Z7 H/ \3 e 動內縮的功能,用下例解釋之:/ R; i. p2 M- w! B
‧vi test9 h! V" w& s' l& g7 L9 B
‧(進入編輯視窗後) p" ~( P0 R* Q* A
this is the test for auto indent
( b; l, n) E, `9 i6 U2 g z 《Tab》start indent ← :set ai (設自動內縮)3 z8 U/ L( c" P
《Tab》data0 Q2 H4 E2 f1 d2 a& q
《Tab》data% T, D7 }) v6 H; R) O
《Tab》data ← :set noai (取消自動內縮): A8 N$ [( d$ r
the end of auto indent.. X0 t- l/ z7 r0 u0 l: ^! R5 j
‧註:<Ctrl><d>可刪除《Tab》字元。; Z+ X# A7 {! {
- p+ W& k9 E( M6 B1 i, [
11.ex指令3 n6 k: z* i7 @. X8 v
讀寫資料
, E1 t" Q: D1 x, |) a. [$ u :w 將緩衝區的資料寫入磁碟中。
: p2 {. N9 K! c; C :10,20wtest 將第10行至第20行的資料寫入test檔案。6 |9 q# n% \# A( @+ G
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。: \$ ]( j. U. d3 c) _2 K
:rtest 將test檔案的資料讀入編輯緩衝區的最後。
, B5 w+ |; r2 w: c/ i7 \ 刪除、複製及搬移9 x* K2 U4 r- t' Z' c V+ l
:10,20d 刪除第10行至第20行的資料。5 q7 u# G$ u6 Y7 j- T, S, k d# c
:10d 刪除第10行的資料。% T- M- E U) p& \0 P: o' |! q
:%d 刪除整個編輯緩衝區。" _1 ], c; _+ m* M8 D+ r
:10,20co30 將第10行至第20行的資料複製至第30行之後。
, e. O& D" b0 z. w5 n3 m( ? :10,20mo30 將第10行至第20行的資料搬移至第30行之後。
- Y. Z- O1 A& x9 X% N$ Z) ] 字串搜尋與取代
+ ]# i9 H3 m5 j4 X s(substitute)指令可搜尋某行列範圍。7 h. d( d& n# ?+ F8 E
g(global)指令則可搜尋整個編輯緩衝區的資料。! r% \, a! P$ \* I, F$ S
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條. u* e0 M: F( v5 w
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
8 m! N: K( N9 p- L0 Y :1,$s/old/new/g 將檔案中所有的『old』改成『new』。; Q8 j6 ^$ i2 w7 w+ \/ E
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。% m: e6 j: }/ A O0 T7 w" w- a3 |1 n) A
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。) u' t' `& X/ C) j: E8 m
( Y8 k% n. F% v; }
12.恢復編輯時被中斷的檔案
+ N- ~, A4 n/ R! o 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未$ x- @& P# w' u* h
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前1 f( R; O, ] G) }' s6 R
的檔案內容。5 B1 Y' G0 X+ O) b! D
%vi -r filename
, t/ a& i2 b5 U$ M- P$ [( V- l! O0 u8 e8 ?0 a; ^1 Z( L/ @
13.編輯多個檔案; C9 a& k3 g6 Q' ]* W4 C
vi亦提供同時編輯多個檔案的功能,方法如下:# G- I+ ]4 `/ P+ r; J" h
%vi file1 file2 ..1 s2 L; n: e, X4 n
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
, `; x: G4 R* Y2 Z% B 再利用 『:n』載入下一個檔案。+ A& N5 r( P6 A- e# M. {
) m i, W D$ v) D. _3 p4 Z% v
參考:
9 P) j! Z& K$ }& x
$ z- Q2 O+ S2 u: ahttp://chunchaichang.blogspot.tw/2010/08/vim-s.html; y& [. c& _: X2 U
|