本帖最後由 IT_man 於 2017-5-6 23:16 編輯
5 ]5 A5 z" l4 ~+ o4 M! w& y" ?; ?+ k
vi指令說明(完整版)
) O6 a; f& n/ }& S; e- vi 的操作模式/ i3 q x( {( F2 k- o- m
# M' D- ^ v5 e$ m: q
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
- s; O: |* l% l$ A3 m
9 R; D5 l2 z+ k0 `
如何進入輸入模式" z7 r. \! J# M0 A* z! C, L* g
a (append) 由游標之後加入資料。
1 B, J2 N& I8 [( s, q5 P. C$ b A 由該行之末加入資料。
! q1 K- o2 W& J i (insert) 由游標之前加入資料。
* x" `2 B2 ]' S) |! M2 `& C I 由該行之首加入資料。
6 I/ y) t4 M' f+ q* ]$ y2 ? o (open) 新增一行於該行之下供輸入資料之用。
, s# k" Q2 E4 u& ~) p O 新增一行於該行之上供輸入資料之用。& L1 k, @3 ~6 J* |2 F( o: [
如何離開輸入模式5 |2 D" W$ f0 j" A+ G" ` a/ w
《ESC》 結束輸入模式。
8 P X; _: R! d+ P 7 E/ w/ y* F! U% u# u2 d" f
1.游標之移動/ N# g. @0 E' z. X; t* G/ g
h 向左移一個字元。 _1 k' `; |& n r0 ]+ n9 l
j 向上移一個字元。
( y* e [+ k9 r& E7 w" w7 X6 M k 向下移一個字元。
! G) q' w" |! s4 ~3 _ l 向右移一個字元。# `& D. Y; C+ a4 k' z
0 移至該行之首/ e" _$ _ e( C) O% ^, o
$ 移至該行之末。
2 R2 j& X1 U" {$ f& M# ^ ^ 移至該行的第一個字元處。
6 c5 H0 V1 z) p2 _ H 移至視窗的第一列。
0 m, ?/ }4 c8 R3 I$ Y7 J0 R M 移至視窗的中間那列。
1 ]# H4 r. H4 d8 [2 p L 移至視窗的最後一列。2 v1 }: m# F' U1 N5 n
G 移至該檔案的最後一列。2 B7 \, ~. M- U& z" N
+ 移至下一列的第一個字元處。
* {& x) j( b4 h N5 c - 移至上一列的第一個字元處。8 W3 ?/ ]1 A- G' `4 X7 H- Z4 g$ j
( 移至該句之首。 (註一)
( K: J- a. R) m; b) M ) 移至該句之末。8 Y( B/ m! ^) O2 o7 V
{ 移至該段落之首。 (註二)
$ n7 p6 c) J7 [! ~ } 移至該段落之末。! x4 y' p: J. ~6 w8 k
nG 移至該檔案的第 n 列。" A p5 ]) ~- E7 k* V7 D
n+ 移至游標所在位置之後的第 n 列。- l1 u$ J" y" l8 y' x7 ]
n- 移至游標所在位置之前的第 n 列。5 q+ J% Y6 e# G7 l( R) q7 s
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
2 n) D" [- o( B+ O1 t3 h 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
6 @8 z' F0 P' T6 d/ E 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
+ U+ v1 v. u& b# a% u. \: {( e" [9 t7 ?- j" H8 j0 @% l; v
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
" u F5 L1 b" F" S& @ <Ctrl><b> 視窗往上捲一頁。6 r7 C; } I2 g5 c+ B
<Ctrl><d> 視窗往下捲半頁。
! q" Z6 O% X& j* O <Ctrl><u> 視窗往上捲半頁。
) H M# A4 w" }" z* R- O0 d2 G <Ctrl><e> 視窗往下捲一行。
O+ i* D# M# Q/ {# K <Ctrl><y> 視窗往上捲一行。% P$ y! Z: u0 Y/ o! A
* E) [0 z. W. p8 Q1 W# X6 O, O
3.刪除、複製及修改指令介紹 (此單元較少使用)' Y7 S" p; ]% D- l7 b- i1 p
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
t$ S( G0 c/ [ Operator + Scope = command \5 G/ r, k5 b6 ~3 K) N
(運算子) (範圍)
# B0 r2 F) Y2 ~( _7 s 運算子:
) }% M& W; O( g# i* k$ @7 f d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
/ C& \" z* Y1 c+ P y 將資料(字組、行列、句子或段落)複製到緩衝區。
- s3 H0 q' {& M$ S, p% H' | p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
! C8 |& F1 h. X: A+ t 料放置於游標所在位置之行列下。9 h% y3 Y4 R4 y }
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
( E" ?6 |2 x6 X1 ]7 F4 j 子等之資料,並插入新鍵資料。. ]- Q8 F8 }2 j! J/ m
範圍:
$ c1 R- m" z6 g9 T8 H e 由游標所在位置至該字串的最後一個字元。
9 x2 u( A2 h9 P; ]) c7 {! V" y$ C# i w 由游標所在位置至下一個字串的第一個字元。
( F" P3 b. |. O w o, M, j b 由游標所在位置至前一個字串的第一個字元。
: o# M O5 H# T6 ^" Z1 V $ 由游標所在位置至該行的最後一個字元。1 y( w' @" A3 H/ {& Z- n
0 由游標所在位置至該行的第一個字元。0 \% O" |' @7 I7 G
) 由游標所在位置至下一個句子的第一個字元。
7 l* P9 U/ o3 E- v3 E9 G ( 由游標所在位置至該句子的第一個字元。
3 ^2 l6 l+ P9 V2 v6 c/ | { 由游標所在位置至該段落的最後一個字元。9 d1 P1 I4 ? w! ~
} 由游標所在位置至該段落的第一個字元。( a, d ?, f) N( S- v
整行動作
" b' q$ [! p( H; @( A% k5 R" s dd 刪除整行。
4 j7 u# F3 a% F D 以行為單位,刪除游標後之所有字元。; l" U/ Z4 [5 S: f# Q1 K z# e
cc 修改整行的內容。- \! J( v- @" I" q" X" y: h2 [
yy yank整行,使游標所在該行複製到記憶體緩衝區。
6 X0 e1 e) m: v9 y1 L) o' \: _6 `
4.刪除與修改9 }- `3 x) x$ ^# j+ A4 G6 Z
x 刪除游標所在該字元。0 v$ k0 Q& q* S7 B. ?
X 刪除游標所在之前一字元。
0 q0 Q+ B" c, E' a1 v7 O dd 刪除游標所在該行。
, M: d( O9 ^9 X$ D0 c6 {4 X r 用接於此指令之後的字元取代(replace)游標所在字元。
" ~. o0 g) i5 C3 B, W z4 { 如: ra 將游標所在字元以 a 取代之。
) G+ k% O: x4 ` R 進入取代狀態,直到《ESC》為止。3 f, l: `5 B' C
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。( Y9 T$ F, H' ]" n" K5 n
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。3 I& q {7 I: U8 G* `' H7 E, @
& S8 \8 c' o# v9 B, o7 \4 {& v0 Q& @5.搬移與複製5 P% k9 t4 V! }/ g. w0 {
利用delete 及 put 指令可完成資料搬移之目的。0 Z8 q! O) n$ D, `, O
利用yank 及 put 指令可完成資料複製之目的。1 h1 G- h' z" y; m+ q
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
6 z+ K; E7 B8 Q 可將緩衝區內的資料複製到螢幕上。; N7 Y: a8 H% ~7 i2 F! ^2 C
例:3 c- X8 J& H. D; K
搬移一行 ‧在該行執行 dd
! c. y h" Z4 `7 p" a0 U ‧游標移至目的地
( V# ]& Y0 ]% ~* [" w! f0 a- z ‧執行 p
! d7 ^% \2 E( s9 X/ h4 M 複製一行 ‧在該行執行 yy
& z3 s8 z7 B' g6 i0 P* i7 E3 J ‧游標移至目的地
' \* n* T o) o+ V( e1 A; h g ‧執行 p7 [ L; @+ r) S* \4 {
- D2 }6 A- P$ G8 c; ~
6.指令重複5 s2 ?( s7 G) m9 b
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n& B7 x) F+ }7 N0 w
次。
9 ~ w% y) C- n0 Q0 G$ D& c( \9 E" r 例:
0 O7 R! n0 [* g' O 刪除10行 ‧10dd
9 ?* s& U9 A3 \( |" F l 複製10行 ‧10yy
+ D" X" P) a! W s4 N# O. T, { ‧游標移至目的地
( ^' _- l7 {" D' i6 P9 v ‧p8 C. {) d. b( w
指標往下移10行 ‧10j
# g _ c6 o* T' P# V
: T" p$ S d6 W- o7.取消前一動作(Undo)* Z( _" Y( x# K1 b& A
即復原執行上一指令前的內容。
# N2 O. x* f% X6 d% T# t% b! R u 恢復最後一個指令之前的結果。1 Z: u! i i) F5 z
U 恢復游標該行之所有改變。
$ S& q4 t2 Y- }; }
- Y4 b9 q; F1 F( G3 t& {) c8.搜尋
b* L3 x! n8 D8 ?( y 在vi中可搜尋某一字串,使游標移至該處。
! M/ I' J7 _. h /字串 往游標之後尋找該字串。
5 k0 G0 a5 S" c2 j) i+ s ?字串 往游標之前尋找該字串。. L) o( l( r* u, N6 D
n 往下繼續尋找下一個相同的字串。
/ T% S' }6 ]+ Z! a7 P8 v0 t N 往上繼續尋找下一個相同的字串。) _/ t, A1 y% s3 r }! J, C2 H3 `
$ C" m- j4 R& G' l9.資料的連接
+ r7 n$ z X, u* m. i$ z: H6 ?$ L. T J 句子的連接。將游標所在之下一行連接至游標該行的後面。
) I! P: |$ W2 Z6 f; `5 p6 A 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
8 @8 U( [. E" B* t2 h* r( `" o (可利用a、i等指令)再按《Enter》即可。, P- n$ s j& k$ w) u8 l8 J# _/ B
: l; o2 X9 i5 k. B. R3 R: L$ J
10.環境的設定- h. i% i% D" H: \! m, Y
:setnu 設定資料的行號。0 q2 g/ W( ~, m' j( L* [) k
:setnonu 取消行號設定。3 T! j7 \* f& @/ E
:setai 自動內縮。
: ?+ J3 @) g! k [% c :setnoai 取消自動內縮。/ f/ Z F' R5 c7 D5 n# n
自動內縮(automatic indentation)6 F4 E' ]% S& i1 H# C! X$ k
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自3 v3 B- ^& h8 I1 _8 ]; [# O- C* w
動內縮的功能,用下例解釋之: `6 W* @" E$ G; d% z u( z" I
‧vi test9 g0 j8 H6 y6 x+ N' j {
‧(進入編輯視窗後)
. v; h$ V1 Y0 G this is the test for auto indent
# ]. C) X% [* y" y" F# K1 }8 m: m 《Tab》start indent ← :set ai (設自動內縮)
( f$ `& w- \2 U 《Tab》data
0 D; D2 d6 p5 V4 ~ 《Tab》data
5 \3 o2 S- V0 Q) {/ ] 《Tab》data ← :set noai (取消自動內縮). c8 U" A$ }7 p! d
the end of auto indent.
5 [. ^! X' z/ K) M ‧註:<Ctrl><d>可刪除《Tab》字元。% M1 u+ I d8 ]
( c9 p1 ~" O \3 P8 J9 p11.ex指令
; v* M2 C4 s, q' F, y/ L- R. g 讀寫資料6 f8 L! c4 n, W
:w 將緩衝區的資料寫入磁碟中。 ]+ \# Q' e) I! s
:10,20wtest 將第10行至第20行的資料寫入test檔案。
: _) s; O$ |+ Z6 _ e& r b: I. j :10,20w>>test 將第10行至第20行的資料加在test檔案之後。' j, Q9 j2 W) e9 N
:rtest 將test檔案的資料讀入編輯緩衝區的最後。! X$ ?. Y& k+ i/ l' Z- x# D
刪除、複製及搬移3 `6 s C. o: l5 s' X1 a$ z+ E! s
:10,20d 刪除第10行至第20行的資料。0 m2 K0 A' \% t
:10d 刪除第10行的資料。
* Y- e0 J2 \ O' y$ i" K :%d 刪除整個編輯緩衝區。
- f ~" d! g( c7 m; r :10,20co30 將第10行至第20行的資料複製至第30行之後。6 E8 \; f6 x8 F& ]$ I! H
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
- N6 v8 |6 |9 l/ n3 f7 J 字串搜尋與取代: H; Z9 K2 I1 f2 B
s(substitute)指令可搜尋某行列範圍。. r! S/ D, e1 w5 |7 w0 T) Y. N
g(global)指令則可搜尋整個編輯緩衝區的資料。6 E; C. A3 j) b" D* h$ z9 D" M
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條+ `7 y i5 z. p* g8 D" @* [; |
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。- k& {; _( u N+ o$ L7 ]% l* B
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
, z4 c1 Q5 r& E9 J" w :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
/ x* w& m6 y' c, @. G :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
- j( Q9 v8 D# B& ^$ |! s( {0 f( ?- z9 T8 D- i" x
12.恢復編輯時被中斷的檔案 q# S/ B1 t: i1 F
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
5 Z4 W0 y- ^# G/ g$ l& G! F 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
9 `; U7 |' L6 Z" d$ I0 A$ i1 E- O 的檔案內容。- y. ]! G" H+ C! g7 S+ J/ T
%vi -r filename9 B& S4 F$ V8 J
* i) c# F' g5 |6 O+ H
13.編輯多個檔案, W) |. m* r. q! W- E+ L
vi亦提供同時編輯多個檔案的功能,方法如下:
8 e' h1 n$ s9 K %vi file1 file2 ..
' q, N3 v o5 O2 X$ f- K0 y( ~ 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後5 X( M' Y- q [2 x2 ~
再利用 『:n』載入下一個檔案。
6 K- w1 }: P. o; V* A' Q
& N# L/ l! T/ E+ s( q參考:
& E" t. D2 W+ q6 U. Y
- ~# S) i- X6 Q8 H, g0 [: uhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html9 }, B3 z5 \( C! A! h4 `/ i
|
|