tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 / S6 Y2 |4 `3 K6 I7 E, {2 W" _
. I ~* r5 b0 C( k* A tvi指令說明(完整版)* R% |$ b/ }! i& ]
- vi 的操作模式# w; R% q# ]6 ?+ N- D8 R( p
' x6 f& e5 e, x& h6 R3 W' x4 h% G
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式% i* M& ]+ Q0 N. v0 k8 v
5 [' ]8 ^7 ^! ~ 如何進入輸入模式0 l# f6 s3 M; |+ }9 A+ h$ o
a (append) 由游標之後加入資料。6 n; l6 ^' z$ v- B, B$ ~" b* d
A 由該行之末加入資料。
0 I% O9 s& g, j' a( d( b0 W2 e i (insert) 由游標之前加入資料。 ]5 y5 a, h0 S, ~0 B
I 由該行之首加入資料。 w# j- J" |* f! v+ @& A* S
o (open) 新增一行於該行之下供輸入資料之用。- W. P, d M6 ]' v" _' L
O 新增一行於該行之上供輸入資料之用。
1 m9 G% O* n% U9 x* f 如何離開輸入模式
2 Z' n8 I8 A5 A 《ESC》 結束輸入模式。9 T& ^1 L+ O0 l9 ]: R R
- 指令模式
$ S, O0 y6 _$ a+ B" @# d# K
. u" _8 Z, W4 t5 j3 Z8 S
1.游標之移動, P% U4 \0 I6 n( Z m6 r' U
h 向左移一個字元。. n+ p+ E9 h, [
j 向上移一個字元。
( L, S! v, ]) l. N. H k 向下移一個字元。
* T( | I T1 q# N l 向右移一個字元。& g+ Z9 z: q v6 ?
0 移至該行之首
! M4 z2 Y8 S0 a/ w, a, C $ 移至該行之末。: i' W% t! D" m+ M0 T
^ 移至該行的第一個字元處。
; | l0 R o; Y, o. P/ E8 I6 n% q# B4 v; s H 移至視窗的第一列。
/ x0 q, V/ ]$ b% x h% Q M 移至視窗的中間那列。1 p; v. |: B$ Y H; U8 V1 F
L 移至視窗的最後一列。
$ P# O6 z- h) N( I1 h G 移至該檔案的最後一列。
0 @4 U2 D- ]+ u. g2 r1 x4 s9 A8 C/ Z + 移至下一列的第一個字元處。
. z& K! B" u0 A - 移至上一列的第一個字元處。
+ n- {! C, f X5 U0 M ( 移至該句之首。 (註一)
! n& m- q `. [ ) 移至該句之末。7 p$ M' T. O% K0 I# `" q
{ 移至該段落之首。 (註二)
' u7 n6 \. T0 B+ G" a; s/ {) z } 移至該段落之末。" ?) k1 V9 w8 n& ?! T. c
nG 移至該檔案的第 n 列。
% N. y" K8 o" T$ ?1 a9 e" g2 d# q n+ 移至游標所在位置之後的第 n 列。
5 \+ @4 p( V- I n- 移至游標所在位置之前的第 n 列。
- |; A* y) b& }9 p8 T! y Z$ ] <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
1 Y ^$ Y7 _7 z7 A5 g8 T4 F 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。5 ` v% S1 X0 e9 f8 n) T( P5 H- L
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
# Q5 F v0 e- @# T1 W! n3 t. f
" M' [$ u4 G' \; P5 i. l5 z2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
9 g. U1 D2 h6 y. `9 J Q1 Z <Ctrl><b> 視窗往上捲一頁。
) }! a& E, v: ]0 F4 H" J <Ctrl><d> 視窗往下捲半頁。8 P- b4 @ x* j' B1 [
<Ctrl><u> 視窗往上捲半頁。; c* s6 C; e5 `/ u0 O& y, g$ |- L: K( |
<Ctrl><e> 視窗往下捲一行。- x0 B7 t% E' |' ]) T" g# c
<Ctrl><y> 視窗往上捲一行。$ `, J) t& W w- I7 b) e$ S% @& j) e
" b1 I- k7 n* r- A& E5 I. V! S
3.刪除、複製及修改指令介紹 (此單元較少使用)7 c W, L$ p* s
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:6 r. ~- }$ u0 F) H. U6 q% P$ ?
Operator + Scope = command
3 l* j( u2 P' g f (運算子) (範圍)
+ T1 B, F3 h5 a/ o; ] 運算子:
4 C: m: d4 q5 A* A d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。: v4 V! R) N5 `; g5 {9 m8 H6 u
y 將資料(字組、行列、句子或段落)複製到緩衝區。
1 ~- f" a6 R8 H! v) o p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
2 S4 c' d& c, C+ \) V 料放置於游標所在位置之行列下。
: v8 X6 x. s$ g; M3 Z7 F# [ c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
4 C7 @* a) m/ ?* b* T4 | 子等之資料,並插入新鍵資料。
1 m, F. E4 P/ A7 |! ~. e 範圍:
/ S; L1 s$ d) T$ A e 由游標所在位置至該字串的最後一個字元。
0 m0 w& W: z/ F9 X; W w 由游標所在位置至下一個字串的第一個字元。: \, W C# ~8 V5 q" F; Y& h8 p: n
b 由游標所在位置至前一個字串的第一個字元。
( W2 a/ |% |8 c2 p: K' S $ 由游標所在位置至該行的最後一個字元。* a$ L8 _8 V! @4 p9 ?1 w( {
0 由游標所在位置至該行的第一個字元。
" G, |% G# o$ \ ) 由游標所在位置至下一個句子的第一個字元。
& P$ i8 c! F; a ( 由游標所在位置至該句子的第一個字元。* p; N& a2 k# f4 j) Z
{ 由游標所在位置至該段落的最後一個字元。
E) p- y/ ~. ]% ^9 I } 由游標所在位置至該段落的第一個字元。$ A" x3 D# X( T+ ?* p8 g( J0 ]; j
整行動作# ^! K2 h" Z; s$ B% ?
dd 刪除整行。( ~; N: F: ~/ [
D 以行為單位,刪除游標後之所有字元。/ `, j* j- o- c7 ]+ x8 V7 B
cc 修改整行的內容。8 _8 r. {9 t0 X7 ]
yy yank整行,使游標所在該行複製到記憶體緩衝區。
$ k* `- z, J$ r$ t; ?6 l( O: F; |; A U
4.刪除與修改5 z/ _/ G2 z1 T1 X4 f8 F2 z6 Y
x 刪除游標所在該字元。! V+ h! ~5 }2 |6 P6 i! C
X 刪除游標所在之前一字元。
4 C& w! ?! I3 |) J2 L6 y8 J$ Q dd 刪除游標所在該行。
3 J$ F. ~, j& H r 用接於此指令之後的字元取代(replace)游標所在字元。3 b* E3 y! c! K7 X( ^5 H6 i
如: ra 將游標所在字元以 a 取代之。' `% m, G; z; x6 e E# L7 Z2 n' _
R 進入取代狀態,直到《ESC》為止。* M# y# j2 j, r6 v# `$ L
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
" G( W8 s( ~! `+ t0 E. a S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
' Q; T- ^- [3 n/ T
# L. H% z; L; a: J; o4 m# w8 e/ X5.搬移與複製* q9 y/ k- r' b) a f' F, v1 r" m# F
利用delete 及 put 指令可完成資料搬移之目的。, i( ?9 J4 Y. }! {, L
利用yank 及 put 指令可完成資料複製之目的。7 j/ a7 O9 k% T
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令. X- N7 d {- W, r6 u& d+ c' b* y
可將緩衝區內的資料複製到螢幕上。) E) u( b. d7 L
例:
2 w9 z6 J# |& b4 u, F 搬移一行 ‧在該行執行 dd6 `0 f& M, s2 R' m
‧游標移至目的地
7 e0 l3 U0 O: e3 ?0 [: @+ U3 B* U ‧執行 p
( W( l9 @# R( s% }! B2 J 複製一行 ‧在該行執行 yy2 o! w) F% i' b: a K% b k! y
‧游標移至目的地1 O- t( |5 |- ?/ f1 o
‧執行 p
* g- d- k2 x' c |* A/ \
# Z( R, Z2 R: d: b' i( d6.指令重複2 X' w2 V7 b! x3 D" ?
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
" r/ T$ {( l, T! @( J9 Z 次。( j9 @' j! K' V$ @
例:) d/ k7 y! K9 Z+ }1 X6 s9 y
刪除10行 ‧10dd3 r7 s6 ~3 D5 b Q/ l6 n7 Q0 {# i; Y
複製10行 ‧10yy- @. Y: E2 \1 l! W! o8 j2 k$ E
‧游標移至目的地" X# J; S+ ~# E! O- C, j
‧p1 g& r/ y n6 f" ^- g
指標往下移10行 ‧10j" E$ k6 m! Q6 d1 ^- W
" e. l1 F" b% ~! K; d% t
7.取消前一動作(Undo)$ [, V: {5 b9 z7 a1 z; }
即復原執行上一指令前的內容。+ s5 Y9 l4 z; b; M- x
u 恢復最後一個指令之前的結果。 B) U3 ]' Y( s8 J" Y) D
U 恢復游標該行之所有改變。% E2 P1 X$ ]+ o+ @# ^8 [ e
8 B V# ~9 m: o3 Z7 t) X/ N) A# j
8.搜尋% p2 `8 v! n) z2 U# K
在vi中可搜尋某一字串,使游標移至該處。
/ ~1 K9 o( u: C /字串 往游標之後尋找該字串。
4 ~2 Y: J; E7 p. w$ n7 x ?字串 往游標之前尋找該字串。
/ f5 f7 w; D( v( F2 I n 往下繼續尋找下一個相同的字串。
+ e0 i1 ~: h+ A5 W) R* n( { N 往上繼續尋找下一個相同的字串。
5 \0 n' k/ U- y( W# A) \5 p: U# B- ?' i2 e1 E
9.資料的連接( d9 s8 Q. K7 u( S& z5 i
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
: O. V! }6 K$ g3 k7 }$ l 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式# {6 m' x, t9 M3 s' E) X; U( g y
(可利用a、i等指令)再按《Enter》即可。 S0 f# @# D. B5 J* H+ W
- Y7 G- f* T+ V
10.環境的設定
" z; { Z. o# ~* P- j' W* P& i :setnu 設定資料的行號。& H) M0 c h, @; v p, L$ w
:setnonu 取消行號設定。
5 q7 ^+ d+ p' t/ X1 o :setai 自動內縮。
z' h9 R7 Q- {3 m :setnoai 取消自動內縮。+ d( Q$ @( Q: _* C# x7 h9 K
自動內縮(automatic indentation)
: N9 I$ ?3 y, f6 V7 B 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自 h" T2 C' _" g" j3 ~& ?
動內縮的功能,用下例解釋之:# {( w- Z( U( g; u
‧vi test9 s! @4 l- v* U* q; y d0 C V
‧(進入編輯視窗後). M; n/ q$ s/ @" u" F
this is the test for auto indent5 f9 Z5 m6 u$ G6 @
《Tab》start indent ← :set ai (設自動內縮)
6 O& O2 {/ l% u# k 《Tab》data
; Q3 M5 ]' S3 C6 ^ 《Tab》data" c) a* `! o5 q8 I
《Tab》data ← :set noai (取消自動內縮)
# B% z5 p1 S: Y) m" b" ]7 [6 D the end of auto indent.5 s) g+ K0 l1 m# h
‧註:<Ctrl><d>可刪除《Tab》字元。
) h- [* ]# I, O, C+ ]4 A2 A3 I, j1 M
- ^0 |- a/ I0 s* _4 l! _5 t6 ~11.ex指令0 {4 a; d6 J- g% f
讀寫資料2 b# h z# D8 o2 E/ E8 h, ]
:w 將緩衝區的資料寫入磁碟中。
; ?" Y+ B) l; T. Q' s% U :10,20wtest 將第10行至第20行的資料寫入test檔案。7 ]9 H1 y0 S: W
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。6 X0 t4 x# T" r1 E/ ?8 M$ w) `# h* C
:rtest 將test檔案的資料讀入編輯緩衝區的最後。
1 b3 V: ]( E% Y# J 刪除、複製及搬移
- ]! y6 W6 Y9 U& N6 ] :10,20d 刪除第10行至第20行的資料。
& M# V5 M& l3 [3 t$ x4 i :10d 刪除第10行的資料。
; b( T$ W) R, t :%d 刪除整個編輯緩衝區。
* p- G# ?4 ?* c/ n. ^8 P) L( R :10,20co30 將第10行至第20行的資料複製至第30行之後。; L/ w/ c7 [9 O& |$ h' G
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。& O- d$ q# `1 P6 W0 e& {
字串搜尋與取代* ~; U% ]7 B2 D, H
s(substitute)指令可搜尋某行列範圍。
5 o2 n0 e7 q3 p+ @/ p5 s% `0 |! T- p g(global)指令則可搜尋整個編輯緩衝區的資料。( i' p- U6 O8 B2 Z `9 I5 {. D
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條( k y* U; [( a! G/ Z; x2 @
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
9 s( H; O, A/ ]9 R( l :1,$s/old/new/g 將檔案中所有的『old』改成『new』。% O# g* g [3 b1 E7 E
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
$ m2 f6 V/ O/ Z$ d/ P; a5 ] :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
7 i% L8 o# o/ f3 m) j/ Y, S6 N/ o& a3 Y. _, y( j; g$ Y
12.恢復編輯時被中斷的檔案- _3 X, Y& f) x7 {" s8 v
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
; N; y) x8 @5 C) j! c# ^2 A' x$ W 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前3 g/ M- w/ K. T4 W' M
的檔案內容。
+ k- \6 `; B3 `" p %vi -r filename
* W8 G( T) R" @; q Q
+ l) A4 e' R! H, O6 I* v# D" o13.編輯多個檔案$ w# b/ \ [( t# S. e4 K% S2 y
vi亦提供同時編輯多個檔案的功能,方法如下:
" Z0 x; J0 E1 r& d; H: q %vi file1 file2 ..# C$ ` |) t8 [3 M
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後# \& `4 X, _, _/ c- h0 D/ L
再利用 『:n』載入下一個檔案。
, x4 e& B5 `7 I# o& T8 S' R5 _( _3 k
參考:8 T; Q: z) W% S+ |% x/ v
& i% s! t6 s' T$ p
http://chunchaichang.blogspot.tw/2010/08/vim-s.html1 {: b6 b1 Y; @. b
|