tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 0 l D9 i @# m5 G$ `- R& ` L
5 v, L7 E, I1 v$ ~8 g0 ^( a* N
vi指令說明(完整版)- z; u* r& I0 K8 m; ]5 ]. ?/ L m: w
- vi 的操作模式
& U( m3 y3 G E8 u6 E+ A
3 q; p+ [9 G, f+ vvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式" M, ~5 {9 y H+ h3 w& V& i0 w
7 C8 r5 i. s3 j( z7 K2 J 如何進入輸入模式* D0 w8 ~: t" V1 Y
a (append) 由游標之後加入資料。$ r: e. o2 @& {" {! R1 a7 W
A 由該行之末加入資料。
! H$ ]5 R9 Q' k$ E i (insert) 由游標之前加入資料。
2 B& K9 l9 i% f I 由該行之首加入資料。
2 M3 {# M! q8 ?/ U o (open) 新增一行於該行之下供輸入資料之用。
8 G. \8 p6 Q, ~* I5 l O 新增一行於該行之上供輸入資料之用。
5 X% k2 B: K. M+ J2 w 如何離開輸入模式
5 Z4 V, v. e. C: y m+ N5 A6 b 《ESC》 結束輸入模式。2 o5 P& E/ n. O
- 指令模式: j z0 W8 T& U v' l" |9 O
: r6 O) n) a5 B5 G- i1.游標之移動
& F! p" g2 Y4 Y9 M9 k6 d3 { h 向左移一個字元。' e/ Q# k% O6 ] L. Q
j 向上移一個字元。4 z# E9 C- ?3 i- W5 ~
k 向下移一個字元。
6 n* H' W) ]" K l 向右移一個字元。 ]; l/ I% l4 r: L, _9 H, b# M
0 移至該行之首
* d* D( C7 Z; t! K& A $ 移至該行之末。) Q3 }- u Q; D7 r' d j" z
^ 移至該行的第一個字元處。' p" _8 j2 }$ f: v; ^
H 移至視窗的第一列。
, G& ~) m' |8 b- \4 W, J( Y M 移至視窗的中間那列。! e+ q6 {$ L9 ~. [2 N
L 移至視窗的最後一列。
$ L+ J4 e0 t$ }) r# x1 e( R G 移至該檔案的最後一列。
" T7 p( {' `+ O( E) G. U# E + 移至下一列的第一個字元處。
" f. n; \. v7 g/ T2 o - 移至上一列的第一個字元處。. d6 ]5 |0 |: ~' e2 K8 W1 E
( 移至該句之首。 (註一)/ e- E1 M2 F" a2 x6 ?3 P
) 移至該句之末。3 g. \0 D) s! i3 w5 ^! U
{ 移至該段落之首。 (註二)
$ S. K0 S8 b7 j% l+ Z } 移至該段落之末。/ w! R- Z" M W% G6 M& m0 h/ Y
nG 移至該檔案的第 n 列。
$ H) F0 x* s, e. h n+ 移至游標所在位置之後的第 n 列。
& U, b: Y" k- a n- 移至游標所在位置之前的第 n 列。
. V, R4 g E5 g0 T" c: b8 r <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
8 K/ N% a6 E3 W$ D 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
% l1 t* s ^2 |: @ H3 k) a 註二:段落(paragraph)在vi中是指以空白行隔開的文字。0 I0 o, I1 |- p& ]
) [/ g$ e* T# ]( I* _# i9 U; K, p( E2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。0 v4 D. h# X) r/ [. n9 r0 ~
<Ctrl><b> 視窗往上捲一頁。
& T* J0 q% @& Q+ W; y8 X. J& D <Ctrl><d> 視窗往下捲半頁。
# u$ x) C6 Y f, @ <Ctrl><u> 視窗往上捲半頁。
" Y! Y, h+ C, Q3 E% `4 `5 G7 G <Ctrl><e> 視窗往下捲一行。
8 _7 e- A! `+ {# ?9 G* I0 x# X0 o <Ctrl><y> 視窗往上捲一行。1 e- `7 ]: D/ H6 ~ a! k. L
/ r9 e* F. B: o9 |3.刪除、複製及修改指令介紹 (此單元較少使用)) `( U b5 a! Z6 @# G: U U; E7 `
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:9 ^- ]2 d3 ]+ X+ j- F
Operator + Scope = command
. A! t+ `) y7 C; S0 \ c4 g (運算子) (範圍). J/ _; J. R4 o* G) r% F
運算子:
: X. e# l# I/ s5 S& ^ d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
& k9 n; v. n5 w- ? y 將資料(字組、行列、句子或段落)複製到緩衝區。+ ~+ Z) [* d0 o8 c
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
8 M( ]$ f) f) L/ M# ?( a 料放置於游標所在位置之行列下。0 H& H/ p' h2 a0 a
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
. s% Z0 T. N' ^* S( T3 r7 I 子等之資料,並插入新鍵資料。# V. U: ?0 u% I; r
範圍:
5 q6 U2 B" K" _3 `) P; L o e 由游標所在位置至該字串的最後一個字元。
6 k3 O9 ^8 ?9 e w 由游標所在位置至下一個字串的第一個字元。
7 Y6 p. j* B, o- y. n b 由游標所在位置至前一個字串的第一個字元。: x5 ?! b3 X3 i2 B, p a
$ 由游標所在位置至該行的最後一個字元。$ A& q2 C3 [( t* s: x5 o$ v
0 由游標所在位置至該行的第一個字元。
6 j7 G M8 k: O! r% _ ) 由游標所在位置至下一個句子的第一個字元。$ }3 O' z+ K7 x; D+ u! [( z( ?
( 由游標所在位置至該句子的第一個字元。
$ G' Y1 y9 l. O" ~/ t; I0 l E { 由游標所在位置至該段落的最後一個字元。7 w! I7 K2 w- `, C: M4 p H4 ]
} 由游標所在位置至該段落的第一個字元。" Q4 Q4 e# W. M$ J$ j. l; W
整行動作
2 K5 M0 N' G8 U& W' ?; x dd 刪除整行。
$ ~( B6 Q' s2 z& L8 o, i D 以行為單位,刪除游標後之所有字元。* u% C/ T* a7 Q0 W* I' _
cc 修改整行的內容。
2 O1 R1 b4 q4 [/ C+ k yy yank整行,使游標所在該行複製到記憶體緩衝區。7 P& j; [( J( T4 |. G5 w/ L. r; c6 j
6 u2 j8 d6 g& ] f3 f0 x7 I4.刪除與修改" D% l# ~3 Q4 ?0 {4 _# g! q
x 刪除游標所在該字元。1 w+ w& j* t @9 S' y
X 刪除游標所在之前一字元。8 Y3 B3 `! w+ g O# J( ~+ I
dd 刪除游標所在該行。& O9 p) j4 P' ]- A3 Q
r 用接於此指令之後的字元取代(replace)游標所在字元。 {5 V- f; e: Y; ]7 g5 p, @2 ]2 W
如: ra 將游標所在字元以 a 取代之。
' [: B- e _4 }1 m R 進入取代狀態,直到《ESC》為止。
h$ \. }- F/ Q/ P$ }) I2 G s 刪除游標所在之字元,並進入輸入模式直到《ESC》。$ s; I: K w# h4 d$ Q
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。) ~/ v5 [3 l" A& B+ ]
7 [6 P4 {# @1 y2 V
5.搬移與複製
- g& D8 O0 U: y# p! U 利用delete 及 put 指令可完成資料搬移之目的。
- a4 w% Q0 t0 m. t 利用yank 及 put 指令可完成資料複製之目的。
8 S3 ?8 _) `* A6 b$ L$ V# p yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
9 R/ ~1 w |+ x: ? A* u& s! B, ?! E% D; ? 可將緩衝區內的資料複製到螢幕上。
# p1 H3 d) P) D# ]0 o0 C& S 例: J& e& J/ {5 f) `4 e4 i
搬移一行 ‧在該行執行 dd- H1 i4 Z" O! y* K7 q# p
‧游標移至目的地
! w1 c! |$ t1 o( | ‧執行 p
4 S: M7 m/ w6 r, H6 N& F 複製一行 ‧在該行執行 yy5 |* C: B8 }/ C3 ~
‧游標移至目的地* r8 N1 l3 x5 O
‧執行 p0 b- ? L' Z) b
& x/ M2 F- v4 W# Y& v1 x. M6.指令重複6 a. F& ^9 `1 w( C8 g0 S0 t4 s
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n0 }) k1 }; G: V% o: Y8 Q
次。# \$ ^1 |. E% h% y2 w4 q
例:& e* \5 \% A" ^0 d6 L( J: F
刪除10行 ‧10dd
' E4 {* [2 M& D. V) d* U 複製10行 ‧10yy
0 h: X9 h, y& o A ‧游標移至目的地
3 {# E- Q8 Y. x$ K$ _. P ‧p8 X5 K$ p, k7 f$ z" P9 }
指標往下移10行 ‧10j
: M" |5 G8 r' R
# G. ]5 X; T* v# o7.取消前一動作(Undo)4 X! T5 k% p3 Q- z/ V% ?/ y8 t
即復原執行上一指令前的內容。' l. ]- w. q7 k5 C6 d; _
u 恢復最後一個指令之前的結果。
7 Q7 X/ L* `5 r, s U 恢復游標該行之所有改變。
5 c3 n- ~& {# D2 Q- @) R Q9 A0 j# `1 r$ s; c
8.搜尋
! \/ d6 ] u, L( _* @ 在vi中可搜尋某一字串,使游標移至該處。
; E& z. A i. I' e /字串 往游標之後尋找該字串。& ?3 t" j# z+ ^/ ]3 q: a. [1 i
?字串 往游標之前尋找該字串。
* J4 t/ J: |$ ]/ ?( j$ V n 往下繼續尋找下一個相同的字串。2 Q2 f# O* _- T; U9 s) x
N 往上繼續尋找下一個相同的字串。
9 P3 B1 G1 P$ I ~8 a9 Y
5 g {/ C Q2 R# i, d9.資料的連接
% Z5 g( ?# `) d) i1 |2 |* j J 句子的連接。將游標所在之下一行連接至游標該行的後面。
7 }2 n3 a3 \& E! @$ f# S 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
. y6 O7 Z3 N8 ~ (可利用a、i等指令)再按《Enter》即可。2 F& H( r+ E% V) ?$ A: e* J+ D' O" ~
3 a4 f2 k7 V1 b R. c
10.環境的設定
' M& r; L; w8 H7 H* K1 ~* W :setnu 設定資料的行號。# \- d6 N; Q# |/ M3 B
:setnonu 取消行號設定。
; C: F) e8 s6 _3 E- X+ ? :setai 自動內縮。
6 R9 Z$ N! N1 C: M :setnoai 取消自動內縮。; C! j" K8 Y7 y: p$ r" r5 v
自動內縮(automatic indentation)
! |" P' n7 T( z5 q 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
3 z3 s* u, @$ m/ [$ E 動內縮的功能,用下例解釋之:
/ P, K& C/ Y, D7 w: {, @0 O ‧vi test* [# P% V- \2 N' j: v$ ~
‧(進入編輯視窗後)
4 m% W) j& ~" l( V! U& z9 s this is the test for auto indent: F; M8 F* t% C1 n
《Tab》start indent ← :set ai (設自動內縮): Y1 S6 [, m0 U |8 t! d) @* ]# {* |
《Tab》data) t& A7 C% e0 y: j" @" K
《Tab》data
' n1 Z4 f G$ h% m: O 《Tab》data ← :set noai (取消自動內縮)0 V3 G @6 h$ u+ ^3 ~) P& z C
the end of auto indent.
/ d9 n. j* k- \ M" W) f ‧註:<Ctrl><d>可刪除《Tab》字元。
$ v3 g( i2 Y) A0 c: r1 ^- ]3 N* C$ y4 g' t4 {( z# M
11.ex指令9 Z; ?6 ~6 U2 c( M1 y* Q; R0 X
讀寫資料
& J- f2 E" }' A% ?( x! Q, U :w 將緩衝區的資料寫入磁碟中。8 L4 v3 I" N. j
:10,20wtest 將第10行至第20行的資料寫入test檔案。
: u$ E" N x4 Z# E' j7 Y :10,20w>>test 將第10行至第20行的資料加在test檔案之後。
5 K5 K, ^ ?9 `) e :rtest 將test檔案的資料讀入編輯緩衝區的最後。
7 {& a& _' T7 ^- H, ^ 刪除、複製及搬移
/ i- y/ m2 o# R/ i& q( t: Q" B :10,20d 刪除第10行至第20行的資料。
* }0 ` _" _) D4 X :10d 刪除第10行的資料。
; C/ w% q4 F) W6 p2 U- w7 o- k :%d 刪除整個編輯緩衝區。3 n: }$ O0 w0 [0 W# y- e3 Z6 L
:10,20co30 將第10行至第20行的資料複製至第30行之後。
2 U: Y+ ?7 ^& z" R" x :10,20mo30 將第10行至第20行的資料搬移至第30行之後。2 c0 V5 E. b, `5 r5 d5 g
字串搜尋與取代
& w4 g6 E4 h* L; G& r/ H s(substitute)指令可搜尋某行列範圍。
& p, x, ` a+ W! y* W) x g(global)指令則可搜尋整個編輯緩衝區的資料。( y5 _; T. v. n3 P$ D7 |2 Y0 }
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
5 f) a' V% O4 W3 d5 X7 J' r 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
' D2 ]5 J+ ]2 u9 V! W( a% i: \& K1 l :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
* P( z! R& t" f" V/ D7 z) g/ g :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。# |' R+ I! M# c# U0 z" J
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。" Z2 e. }& W9 ~7 V1 C( J! ^
6 x! v, Q$ c* [, _- |; J9 a. a( I2 x" F& p
12.恢復編輯時被中斷的檔案
' u( ]+ s. Y( z7 c1 R/ y2 \9 ] 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
2 Y9 A; C4 C) f1 y) P: Z 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前9 a7 s8 q' B- y1 e# A8 i+ H* n
的檔案內容。
/ F# V# m/ @, i% \1 Z M6 [6 X* C %vi -r filename
! Q" h8 o2 W+ m7 {- ~; s; u; k, W5 y- g2 e" a( ~
13.編輯多個檔案
. c. F5 z+ e+ j) {7 ^ vi亦提供同時編輯多個檔案的功能,方法如下:
7 t3 `: p3 y- L2 M0 U; ^; W %vi file1 file2 ..
! Z* @+ v; k/ G' h3 C8 I 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
# I3 B) p0 ]# w. S 再利用 『:n』載入下一個檔案。
! \; a7 r6 R0 L! t2 N8 B$ _* |+ w2 k" U2 f: @$ J
參考:5 y8 D5 v; o- n- c5 A( i S
+ U. A4 _ w1 A; |& e6 f" bhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html0 c" e' L* Z0 d
|