本帖最後由 IT_man 於 2017-5-6 23:16 編輯
( f, K. C9 s. p1 P8 q1 c
% X/ g) {0 k' Y5 [6 Svi指令說明(完整版)
, A9 {3 B/ W9 P* E1 R( b- vi 的操作模式" v' A% b1 f2 g- q2 P
5 p1 ?9 k# C7 B, h
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式5 _! ^9 X, C' \* w* S' t
& g% b* Y0 x0 s; ~7 f, f+ N3 Q
如何進入輸入模式; k# J6 s! k O1 T8 H
a (append) 由游標之後加入資料。
. v: y! P3 T: t7 K A 由該行之末加入資料。 p+ E8 A6 T+ _+ M6 B5 \
i (insert) 由游標之前加入資料。
0 E U3 ]; i |+ g: T I 由該行之首加入資料。( M& E% f( K m3 d% R
o (open) 新增一行於該行之下供輸入資料之用。
. r* ]7 B% ?; o5 I: V" l8 C O 新增一行於該行之上供輸入資料之用。0 c: y% Q& C5 U+ n
如何離開輸入模式
# G0 O! w1 P, J, I- g" k. i+ a 《ESC》 結束輸入模式。
3 G0 J# u/ P* ~; _6 @- 指令模式
5 y/ T: f2 ?4 o# N. P! r
0 n+ g1 i- C1 Z: z* A T1.游標之移動
+ @& K- k- E! ] V" G2 H" W) X h 向左移一個字元。
3 m3 L! s# w6 `! z9 y" { j 向上移一個字元。
! e5 R& f+ }7 K1 ^% t) t3 @ k 向下移一個字元。
+ E( q. V1 ? n" c l 向右移一個字元。
. l, W. y/ s7 N; \9 p ~4 q 0 移至該行之首
9 w- ?( d% }# E, P $ 移至該行之末。
0 f& I0 P/ s1 b: @) t$ S ^ 移至該行的第一個字元處。% w' z1 K( \/ H( `0 O/ t0 k ^
H 移至視窗的第一列。
: O4 m1 v L$ T# r' x M 移至視窗的中間那列。9 S1 B" X- B+ u/ \, O
L 移至視窗的最後一列。. M: E2 S1 N# B
G 移至該檔案的最後一列。: a# T" D" ~+ l/ `" ^. f7 i8 R2 M
+ 移至下一列的第一個字元處。8 [( R7 O' ~2 X/ q8 K5 _. F4 h
- 移至上一列的第一個字元處。/ J) g" ?! A1 J, |- V3 Q3 ^+ U" F: P
( 移至該句之首。 (註一)6 t. X# ?" q$ P% i" I
) 移至該句之末。
, r: n1 Z% z' R# ^3 E! Y. n! D { 移至該段落之首。 (註二)0 B: N: V$ w- }7 l
} 移至該段落之末。4 p9 P1 u1 y: I3 r1 [& d
nG 移至該檔案的第 n 列。
" a2 }% B' m/ ?, K n+ 移至游標所在位置之後的第 n 列。
4 V2 x) V& L* j* R n- 移至游標所在位置之前的第 n 列。
2 B9 J" {( H7 @* Q2 I <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
! @! H$ Y1 O# \5 v 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。* P: J4 h6 p, y$ E/ d) k3 D9 z
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
6 q, t' i5 [ { H" ], Z
# ]) j7 r( X1 Z! `( e( `7 M3 f2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。: L7 p. @& o" L( ~) e) R
<Ctrl><b> 視窗往上捲一頁。
: O3 }6 Z) d' G+ z O+ @$ X0 R <Ctrl><d> 視窗往下捲半頁。
3 l( t5 I' M5 |7 e1 G& ~# u& t <Ctrl><u> 視窗往上捲半頁。( _8 A, b, d5 n: U1 P) x
<Ctrl><e> 視窗往下捲一行。
- Z: D) X: {/ g' @+ m <Ctrl><y> 視窗往上捲一行。
# G! y6 }+ q5 n3 }4 m
! J8 E& ]5 J) x$ m2 y3.刪除、複製及修改指令介紹 (此單元較少使用)
. @5 q S8 a( b( N1 c d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:; @1 E. M* _, f% {7 ]; o0 ]
Operator + Scope = command
0 |) Y3 b3 z! d8 B, M' d) w c (運算子) (範圍)
' j5 X: c8 R* y' V4 e 運算子:
1 S* E8 O* t0 `7 ~+ [" E d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
6 _! q$ [6 \! J ~ I y 將資料(字組、行列、句子或段落)複製到緩衝區。" a3 E# T+ j" N4 j7 a0 `
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資$ a* t- O7 U0 ]8 {: ]9 M4 x, a) o
料放置於游標所在位置之行列下。
' {7 j" `7 f5 P5 R7 ^ ^ c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
: c2 a9 n& {% Q c 子等之資料,並插入新鍵資料。
d; p d G: Q. I$ R2 B! W 範圍:% @4 `( [1 N9 f& h, r) O5 ^
e 由游標所在位置至該字串的最後一個字元。* s2 }: t2 ?. L8 c/ U. O. x
w 由游標所在位置至下一個字串的第一個字元。/ g W) U$ p; U4 S* u2 S. l+ t
b 由游標所在位置至前一個字串的第一個字元。" e. o5 L2 \) a% ~- ?) Y z
$ 由游標所在位置至該行的最後一個字元。
* ?# W: [* D3 ^ 0 由游標所在位置至該行的第一個字元。6 `: U b6 M% E
) 由游標所在位置至下一個句子的第一個字元。; y+ t x3 R; I: a0 B
( 由游標所在位置至該句子的第一個字元。
( }* d+ g* [4 a, M0 g { 由游標所在位置至該段落的最後一個字元。
- w, T, X3 L" Q } 由游標所在位置至該段落的第一個字元。
7 e7 o- ]( N* h- a' V0 \ 整行動作2 u8 \/ o+ p5 d6 N# j
dd 刪除整行。
; q' J) h; G. s) {6 n, F D 以行為單位,刪除游標後之所有字元。( L# S" L' I; y3 W
cc 修改整行的內容。
]4 k% o+ M1 q2 |& K yy yank整行,使游標所在該行複製到記憶體緩衝區。) E W& @ E' \) x! i
# r8 f- q- {. i+ @8 ]( M8 l8 o, r/ e
4.刪除與修改: R& {5 T/ A3 T, h; I+ r. M
x 刪除游標所在該字元。5 i: U4 n9 p" U/ Z0 Q* C
X 刪除游標所在之前一字元。* s* C6 s) V5 X5 x/ y- \- C: W
dd 刪除游標所在該行。
2 W$ b8 N z- K1 t. o! w/ f r 用接於此指令之後的字元取代(replace)游標所在字元。) v3 C: S1 ~' Q7 D. P. F. G
如: ra 將游標所在字元以 a 取代之。
: S/ F) r0 E6 K/ s R 進入取代狀態,直到《ESC》為止。
& a- o1 @9 ^ T9 @ s 刪除游標所在之字元,並進入輸入模式直到《ESC》。4 c, Y# J: J m& h& r
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
1 w. `) }6 A: s; ] Z7 |: h5 t' a; G# c
5.搬移與複製3 ~9 `: U/ \4 J
利用delete 及 put 指令可完成資料搬移之目的。
, Z+ [; o5 }0 r5 z. q 利用yank 及 put 指令可完成資料複製之目的。
3 X. k, A/ F- A) [% E6 y yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令/ P' y) M+ p& r# V
可將緩衝區內的資料複製到螢幕上。3 O! b( K2 s% o( g) c
例:8 s- d, Q9 l" I# W
搬移一行 ‧在該行執行 dd; V) U$ G+ X0 n
‧游標移至目的地 C3 k, S5 x1 a s5 A v
‧執行 p1 u# L8 x$ c5 i1 T4 `1 J9 F$ A) \
複製一行 ‧在該行執行 yy
& n* i9 ^1 S) C+ s, }- x ‧游標移至目的地3 ~% F% j' B- u; n
‧執行 p
# b5 R. {" J0 r; O; S; c& g- q
- a# S' k# X, A6.指令重複
* i4 A4 M, {- \3 Q 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n% ]3 [0 o+ n0 z' N) w
次。
) l' H; A/ Z' w$ N0 A& n 例:; U5 L1 {9 w5 g; R- [! l8 {4 T
刪除10行 ‧10dd
2 k! F% S: J: E. j4 g' i 複製10行 ‧10yy
) ^$ O; M. ]6 v& [5 H; s ‧游標移至目的地- q [, C' ?, ]1 P- ]
‧p
: y" u u4 e0 r% L+ K9 b P 指標往下移10行 ‧10j
5 I9 T* Z( u- L/ m. T8 \6 Q. U [1 P4 P+ {" Q3 Y
7.取消前一動作(Undo)' _0 |9 a. E! T# ^- h9 n
即復原執行上一指令前的內容。* m/ q' @* Q$ u3 n p6 s |6 ]1 {
u 恢復最後一個指令之前的結果。5 m* v9 S8 ~: c' R- F
U 恢復游標該行之所有改變。
8 Y. Q" a, c% K/ | t8 B$ v( E+ W( U8 h: i+ J
8.搜尋; I2 E$ r6 L$ F( L8 t: u5 D
在vi中可搜尋某一字串,使游標移至該處。, t. {3 V7 |7 l; }( G0 [& g& `
/字串 往游標之後尋找該字串。! M- h& u* N: v7 v) x" f
?字串 往游標之前尋找該字串。* d" H% ]! Z2 @" V4 W
n 往下繼續尋找下一個相同的字串。
. a0 b' @5 G' V# n' E- T N 往上繼續尋找下一個相同的字串。3 D. A; Q3 j4 `4 g2 H6 E
7 C1 T% \" A5 x% q( c$ e/ k9.資料的連接6 m; I0 r* L' ~6 f' k' d9 ^0 o
J 句子的連接。將游標所在之下一行連接至游標該行的後面。+ U- b( \0 g" v8 J
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式3 k8 F5 h1 L* l/ f% M7 z
(可利用a、i等指令)再按《Enter》即可。
% T6 m2 }: g/ t. `: s2 ^
8 q8 R9 v) K4 k, D: n10.環境的設定0 T( e. J8 A! |4 Q `: w6 u$ l
:setnu 設定資料的行號。
1 G% o- W' u2 F# W3 S. C7 t+ B :setnonu 取消行號設定。" z6 z3 K% l# ]
:setai 自動內縮。
# W1 E: i0 a9 `9 Y: f :setnoai 取消自動內縮。
$ t S( L2 J" ]$ b. S 自動內縮(automatic indentation)
/ ]( { N: B3 b 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自, ]! o) z L# r+ G/ S3 e
動內縮的功能,用下例解釋之:
4 a, M m6 C: {. P ‧vi test
" K! v' B) Z6 `, y1 P1 r# B ‧(進入編輯視窗後)
, \1 } P; u# z9 j7 _- B this is the test for auto indent
! _! X# I- }9 ~+ k o* {, C% } 《Tab》start indent ← :set ai (設自動內縮)$ w( _& @) k3 F; O' S
《Tab》data
^. Y( t) x* |, g0 ?0 B 《Tab》data
* l# n$ V5 F" y 《Tab》data ← :set noai (取消自動內縮)* E0 g5 Q$ h+ W
the end of auto indent.+ s8 w/ Q( ~- D! n
‧註:<Ctrl><d>可刪除《Tab》字元。! I9 D( w3 r* h8 M
$ a2 _* q" l$ W. \# A11.ex指令
U1 `# x c5 F* Y- M5 C$ z 讀寫資料
. r* u6 U' o. ~! D& ^% K: P :w 將緩衝區的資料寫入磁碟中。
- M1 ~# g. S+ q' ~& j" d \8 L" z5 | :10,20wtest 將第10行至第20行的資料寫入test檔案。
5 R( w% F) S$ k7 y :10,20w>>test 將第10行至第20行的資料加在test檔案之後。5 E2 E/ m) q- g' y0 c W
:rtest 將test檔案的資料讀入編輯緩衝區的最後。" Z9 s0 @4 R7 P2 c0 h1 S# ]
刪除、複製及搬移 m$ u, c2 o4 y; v. Q
:10,20d 刪除第10行至第20行的資料。
& K- B c) U @+ O :10d 刪除第10行的資料。! q: A0 j7 A4 L8 I
:%d 刪除整個編輯緩衝區。
( d- |4 @9 Q2 j% Q; [0 [1 ^ :10,20co30 將第10行至第20行的資料複製至第30行之後。
3 s5 V3 } Y4 r, P i3 \# p :10,20mo30 將第10行至第20行的資料搬移至第30行之後。
# h# ]( H3 R& U* Z1 D! [4 s+ ~+ x/ O 字串搜尋與取代$ X+ W2 ]3 G/ ~9 h, U
s(substitute)指令可搜尋某行列範圍。' L* `7 {6 S; I M
g(global)指令則可搜尋整個編輯緩衝區的資料。9 @6 w6 @' \( b H
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條 G* B* _! w) k$ y1 L' i7 L
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
. S: e' Y4 J( }7 p% U :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
5 j0 z2 C0 z9 ~% q' P: s9 U :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。. c7 z0 ^1 w, o, e4 T7 U
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
! O9 F3 w$ @# B; D- p
4 Q% W* ~* H! n6 u$ v12.恢復編輯時被中斷的檔案
* K" V6 M3 P6 d 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未, m$ {! d; m, S! e; l
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前/ q) ~/ x! h* R; W
的檔案內容。; I" ^/ W- a7 E6 C
%vi -r filename
$ b# U* g: O6 I2 w( \8 {$ h+ h5 _! j6 { }0 a
13.編輯多個檔案
0 h6 E( u- _/ c0 }' ]* N4 n vi亦提供同時編輯多個檔案的功能,方法如下:
7 U* \' W- E+ A# W %vi file1 file2 ..' X: W C# t, H/ v, F2 M: T* H
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後/ h, M4 `; B( w4 u; q7 ?
再利用 『:n』載入下一個檔案。
5 N v! p* B g% Z; i' D. X9 P! x, E; j, d# }' u9 D
參考:
' M! ?/ g( y% H$ A) k. \& \* ]* Z/ @& H k& g+ a$ |7 O/ A7 q" l$ w
http://chunchaichang.blogspot.tw/2010/08/vim-s.html, r: k3 o9 O6 V: {
|
|