tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯
6 ?# w( [" d# m# a3 R# |
9 |+ [2 f1 U& s: Vvi指令說明(完整版)
9 ]9 ^& G$ M" }3 x# x- vi 的操作模式
# _$ F( u7 b0 X4 U# W7 m" }
8 B2 ^! H% p9 q4 {; kvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式8 \0 ]' m; Y5 W' |) g0 o
/ l: X a% _4 m3 B% l: \6 Y' _ 如何進入輸入模式# b2 d6 w( _$ m* u: ?3 C$ I
a (append) 由游標之後加入資料。
[' \8 \! ~' {5 E A 由該行之末加入資料。2 q- q7 ]& {( W" b! v+ |3 A/ n
i (insert) 由游標之前加入資料。; ~5 X% L2 O ?8 T) c) V
I 由該行之首加入資料。
( ~9 P" s3 F) {5 _3 d1 J! ]; R o (open) 新增一行於該行之下供輸入資料之用。
4 {& e. o. A& |/ q8 K. s/ Y) l1 O& Q O 新增一行於該行之上供輸入資料之用。+ ~8 K4 _% x$ a( b, @/ c1 Q9 s" ]
如何離開輸入模式7 I5 \) K7 `! u2 f' z
《ESC》 結束輸入模式。
* u$ u" _/ c5 Y9 R) X; t . K0 ?1 U* r6 ^4 g/ C- B
1.游標之移動
, \& e+ E6 s# |3 f/ H8 t h 向左移一個字元。
( c3 @" X* Q8 Y6 J" o( F( \ j 向上移一個字元。2 o- S0 c; q( [
k 向下移一個字元。
: `, Y& h B G* W l 向右移一個字元。. i1 @; u! N) W6 x' k; @2 l: o
0 移至該行之首
4 s1 K) |+ o% Y* ~% O0 C; R $ 移至該行之末。; D& H* p; ?/ e0 q. G$ f
^ 移至該行的第一個字元處。
; s$ w. k D$ O; Z. o: K' }% S H 移至視窗的第一列。- t& g) n4 }4 Z- G l$ f5 o; R
M 移至視窗的中間那列。" j9 z2 O. g- h7 R, u; U
L 移至視窗的最後一列。
- h# w7 s! u4 P; c1 U G 移至該檔案的最後一列。
# S0 b" o+ r" o + 移至下一列的第一個字元處。
- G$ D* y h( D/ h - 移至上一列的第一個字元處。
1 `, y' {* G4 G% S3 E1 t ( 移至該句之首。 (註一). w+ N& V3 w; i
) 移至該句之末。
! X7 w+ E9 m4 Q# o: x { 移至該段落之首。 (註二)+ Q0 K5 X7 \ a5 W
} 移至該段落之末。
2 Z$ _9 W ~* l& q8 g) C7 G nG 移至該檔案的第 n 列。
Z6 {! Z2 w D6 j' p n+ 移至游標所在位置之後的第 n 列。$ i! U, s5 {' R' c) Y+ f& F
n- 移至游標所在位置之前的第 n 列。
$ J' W/ s3 Y, f. ]+ `; L/ T <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
) r8 J) l- ~1 k; L6 d4 T# m2 S2 \ 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。" v1 p) x% ?; o: |
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
; ~) x7 Z5 B* u1 E
) }& k- Y8 E4 h2 ?5 W2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
) r/ K& ^0 e, D5 H1 K, Y' j1 U8 C$ m <Ctrl><b> 視窗往上捲一頁。# u5 g3 x- W5 ?- L
<Ctrl><d> 視窗往下捲半頁。
# ^8 s7 [! D6 G l; ? <Ctrl><u> 視窗往上捲半頁。" G5 p$ { I5 I5 v' s( B$ D( s
<Ctrl><e> 視窗往下捲一行。
; d- v( x2 x' m" W <Ctrl><y> 視窗往上捲一行。 R: m3 p9 K8 C3 {# t" j; M
% P* v% n: i0 e3.刪除、複製及修改指令介紹 (此單元較少使用)9 X* r( J8 [5 b4 b o
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
. n; T- L" d; R Operator + Scope = command" v# k$ Z/ U6 ]7 P0 e: d
(運算子) (範圍)
' L- z' n! ]- z) p, A' \ 運算子:
5 g( ]" z+ }. ^+ N; ^# e d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
% R4 `- X, M7 |0 F, j y 將資料(字組、行列、句子或段落)複製到緩衝區。
& I5 K: D& X! J8 ~ p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資0 A) F0 j4 Y; @7 P$ J# [
料放置於游標所在位置之行列下。1 |3 i D E* K8 ~. r) v
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
# V3 w2 j5 |4 N( X2 e( @ 子等之資料,並插入新鍵資料。
; R; Q- L( P4 D% G" }1 o) @7 u 範圍:
0 q0 x2 q9 `7 ~ e 由游標所在位置至該字串的最後一個字元。" d! v$ i+ L- R) e0 o1 j& h0 K" Y
w 由游標所在位置至下一個字串的第一個字元。
5 p% e K3 C8 a# k7 p b 由游標所在位置至前一個字串的第一個字元。2 g H2 }9 \( P. m5 |" F) X
$ 由游標所在位置至該行的最後一個字元。
& E% {5 M5 P. U4 | 0 由游標所在位置至該行的第一個字元。
% D" m$ b# I! ~$ C! \! e$ {* H8 W# ?+ A ) 由游標所在位置至下一個句子的第一個字元。
4 t6 R" ~; L1 M ( 由游標所在位置至該句子的第一個字元。
: F- I; @$ ~" Y, z$ C+ R { 由游標所在位置至該段落的最後一個字元。7 k! I V. V& R) J
} 由游標所在位置至該段落的第一個字元。
: | N8 h9 f5 E 整行動作# }! @, R4 S2 _( P! k
dd 刪除整行。% k2 e6 ]9 p; B& t+ q/ d
D 以行為單位,刪除游標後之所有字元。) P: D+ p! r8 C5 K/ U6 ~
cc 修改整行的內容。
4 {3 i, G- a+ y yy yank整行,使游標所在該行複製到記憶體緩衝區。' v D. w4 ^) d
2 v5 @* k1 I. a7 w: V
4.刪除與修改
" k4 b' `2 \* i. K; ~! V x 刪除游標所在該字元。7 c( C( T0 {+ l$ U
X 刪除游標所在之前一字元。) N$ J' V- U6 W0 g
dd 刪除游標所在該行。! L; X' V1 G( E3 C" _) O
r 用接於此指令之後的字元取代(replace)游標所在字元。! R4 N w$ c* ]" q4 _
如: ra 將游標所在字元以 a 取代之。# F4 H- t; }' m1 K6 G7 K
R 進入取代狀態,直到《ESC》為止。* T3 F9 l6 d% c+ s7 Y9 y) j
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。: [9 P- r4 x( \0 N- Q3 \/ F
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。+ Y9 R# d4 \+ \. B) F; Q* h& I
5 A$ E. v" i, e+ R4 _5.搬移與複製
" Q1 k1 R5 A+ i0 ` r5 b2 w 利用delete 及 put 指令可完成資料搬移之目的。
0 i' L" J; ?3 H5 `% h9 d3 p 利用yank 及 put 指令可完成資料複製之目的。& g% T8 a- F: u p
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令4 b9 {! R3 ]5 t& \8 f
可將緩衝區內的資料複製到螢幕上。
1 }) M% J& N4 c 例:: _5 r' W6 \2 y3 N) [' H
搬移一行 ‧在該行執行 dd
, A" T+ T( Z' o. D+ R8 Q; M ‧游標移至目的地+ J# Z9 Q; ] c R
‧執行 p
; D& X, B, Y* ^6 N* n1 u 複製一行 ‧在該行執行 yy
4 F9 t* t" p9 i/ j% f ‧游標移至目的地: Y8 ^" w D! `
‧執行 p
$ t* |# s1 H4 C' l7 Z. W1 m! W( I: E8 V8 `9 g9 T
6.指令重複
0 G& c7 w" \. W' m' r' x 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n; M+ Z. A6 t/ n/ q5 z5 U
次。
. H" g: K8 J1 h$ \! J 例:2 h; v5 G# f( ?7 G8 l
刪除10行 ‧10dd! y- [0 f* q( l& s
複製10行 ‧10yy) j7 e# ^( c* V# p
‧游標移至目的地 p$ x" ~! I. \, p6 w
‧p
: X: w! M; o7 ?* U1 G 指標往下移10行 ‧10j$ _* K4 [$ M0 Z
& a- i. {& B; B. e7.取消前一動作(Undo)4 s D4 }1 d& v0 z+ ?. }6 ~
即復原執行上一指令前的內容。6 p1 b9 C4 R" R6 ^1 ?. V) \ ^& p
u 恢復最後一個指令之前的結果。! i% ]" I8 }1 t( a
U 恢復游標該行之所有改變。
) c1 \3 c1 b* ~4 E! Z7 {
: I% _* c; y4 c. Z, x/ b& {: q8.搜尋
" R# \6 x; X# o 在vi中可搜尋某一字串,使游標移至該處。5 O" v# P5 e& B s8 Q D
/字串 往游標之後尋找該字串。' `% M9 t9 t7 E2 y
?字串 往游標之前尋找該字串。9 b3 D) }0 Z( J+ G( _! O) S7 l
n 往下繼續尋找下一個相同的字串。
! Z& O/ R+ C3 T, q5 h4 \ N 往上繼續尋找下一個相同的字串。
; w1 q4 X& G# ]! d, x, Z2 P9 x1 c7 S
9.資料的連接) k' Q: s5 a2 U" x
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
5 @( a( [9 a+ @ 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式+ r* v5 d5 j4 q/ p; \
(可利用a、i等指令)再按《Enter》即可。4 K+ k X( M2 _3 ]: i% o6 Y; J
& `4 ?$ [ M3 m2 W! K
10.環境的設定/ r4 R. F) V0 q# S9 q. u9 o1 u
:setnu 設定資料的行號。9 r9 b# _$ s7 m' t/ ^
:setnonu 取消行號設定。+ v o5 V) l& K' e6 n
:setai 自動內縮。/ C8 u: l, {# ]( V, ~" x
:setnoai 取消自動內縮。8 `1 J8 p. E- }) X
自動內縮(automatic indentation)
5 s. i8 {4 b0 D6 o$ f( u: W/ P. r 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自7 I0 m5 \. k- i. ~
動內縮的功能,用下例解釋之:
1 d: Z W, R- A ‧vi test
& v* U! m: ~" q1 f8 O4 @ ‧(進入編輯視窗後); z g! p6 q0 n! J3 ^
this is the test for auto indent
! A! s: g4 B9 ^6 N 《Tab》start indent ← :set ai (設自動內縮)8 l1 ?! j* F0 x& C. g+ Y) W
《Tab》data
, C5 T j# i2 h7 \6 w+ P) H 《Tab》data
/ n* B/ I, _: r" L! _ 《Tab》data ← :set noai (取消自動內縮)
. F0 U: B; Y5 o9 Q9 H% t the end of auto indent.# g) O- k2 ~0 T+ I/ B
‧註:<Ctrl><d>可刪除《Tab》字元。
6 Z [& ^& _ H7 \* i
& z, g$ r% H; h7 H% O11.ex指令0 W2 p) h& j/ j7 Y; G) \( N
讀寫資料
) F( C/ x1 ~3 v+ t5 a :w 將緩衝區的資料寫入磁碟中。
9 c: J& ^ _$ y, l0 R :10,20wtest 將第10行至第20行的資料寫入test檔案。9 }3 H- T9 J0 D1 z) K1 n
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。
$ a0 o4 [5 t( y6 A, I/ n- B :rtest 將test檔案的資料讀入編輯緩衝區的最後。
& Z. m& D/ t7 w0 R0 L9 M5 { 刪除、複製及搬移3 g4 I7 }, j l! S/ f: x2 x
:10,20d 刪除第10行至第20行的資料。
0 J7 ?1 C: m$ m- ? :10d 刪除第10行的資料。
1 Y0 S+ @: y* C5 L6 x& {2 I8 H :%d 刪除整個編輯緩衝區。7 k8 S7 N. w/ a2 G4 D
:10,20co30 將第10行至第20行的資料複製至第30行之後。; x9 z. [ t) p/ y8 X2 T( \
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。) {+ |* C* S3 W, U9 O
字串搜尋與取代
1 O2 R) a. y* s Z. r s(substitute)指令可搜尋某行列範圍。
0 s! b$ v5 z/ r; b g(global)指令則可搜尋整個編輯緩衝區的資料。
, g& G9 S3 M3 k" P z s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
$ K0 C- R N5 `1 R 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。& k% M/ W9 o2 s9 o2 _# e# f
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
( i5 C9 h; ~: z! y :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。7 Y- J8 {/ O& j6 l, H
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
! H% V) q- `9 d1 L/ t$ U9 P) O* Y0 ~& |$ Y' _
12.恢復編輯時被中斷的檔案
2 t. L7 {* C: x 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
+ B5 `- T' P& v 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
5 Q4 X3 Z4 O" S% ~: ~' J& b 的檔案內容。
+ }' G- n+ d, }$ {. M %vi -r filename
. Z; ]3 r( @ E( A* m Y) ~: I- }( V: Y* d7 j. c
13.編輯多個檔案6 G$ S' v5 G+ P2 I7 f! _3 T
vi亦提供同時編輯多個檔案的功能,方法如下:) D/ A% @5 }$ |, ]% d% j4 x
%vi file1 file2 ..* p: H# ?0 F" F! p2 A! {3 R- I
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
# [- A6 w! d1 q+ | 再利用 『:n』載入下一個檔案。) j5 W( G! h9 e. K0 i
4 B* O- W* C: V
參考:3 k g! Z/ r" M/ l8 ^3 y. G, a
% O. j* `+ E8 o3 _http://chunchaichang.blogspot.tw/2010/08/vim-s.html& Y! p3 C" @+ v3 i A8 N
|