tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯
) a' ^# |( \: }/ |% a; ]' J- ]8 e3 |9 ~ ?% {; ?
vi指令說明(完整版)/ c D# G* Q$ _8 ^% M8 A
- vi 的操作模式9 Z& Q# t# M. Z, t8 m
; O( w9 [7 O; f4 r% D" x
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 " P% f: I& ]3 K
如何進入輸入模式
" Y- N- [ Y r a (append) 由游標之後加入資料。$ Y a0 N0 n% O& D$ l
A 由該行之末加入資料。
4 ~9 y Z7 ~% B i (insert) 由游標之前加入資料。
& ~( t" n1 s& [+ \# [ I 由該行之首加入資料。
3 C, r4 m1 w4 H2 m$ j o (open) 新增一行於該行之下供輸入資料之用。5 V- H9 x0 f; J9 ^) z
O 新增一行於該行之上供輸入資料之用。
6 f4 S% s+ f8 [0 r! r) c h 如何離開輸入模式
' R" n( v2 ~8 Z3 G 《ESC》 結束輸入模式。
* I# d2 L% {0 ? Z7 g
8 Y6 O' u$ N' t" J% h1.游標之移動& Y6 R# k. q/ J! u9 _! D
h 向左移一個字元。
# Y+ k# ]( \9 u' L( z j 向上移一個字元。
" X. [$ [7 t Q7 J; ~2 i; G+ B k 向下移一個字元。* ^0 X; h* u. [5 m, M0 V8 N4 z
l 向右移一個字元。4 ~! ]2 T3 e& H& U
0 移至該行之首
% H" Y9 f! e- P, k9 x$ o $ 移至該行之末。8 i) @9 ~3 X, a/ z
^ 移至該行的第一個字元處。3 ~$ \5 c( u, Y* u9 m2 X
H 移至視窗的第一列。/ I1 F4 Y2 y& J: i) x
M 移至視窗的中間那列。
; H- n" |+ t! P' F: V+ ^+ m4 r: A. N L 移至視窗的最後一列。
7 H. V/ m" b8 h/ f& e G 移至該檔案的最後一列。' e/ \( J5 o: Z$ K
+ 移至下一列的第一個字元處。
4 E+ i7 a' \4 @, Z - 移至上一列的第一個字元處。
2 I0 Q: q, U9 M: O% s ( 移至該句之首。 (註一), w' Z J8 U# y9 r9 f3 p
) 移至該句之末。9 ^! U, T8 K" g8 G3 t( _$ [
{ 移至該段落之首。 (註二)7 P& `! M+ q& s8 a) ]2 p
} 移至該段落之末。6 ^, Z5 m# i* B/ r
nG 移至該檔案的第 n 列。% K. v# z: \# r& ] a% A: U' v
n+ 移至游標所在位置之後的第 n 列。
" i! j& F$ @6 j' ~8 t n- 移至游標所在位置之前的第 n 列。
! H" c* r* t6 s& F0 c: f <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
5 b7 j4 [& t" C! r! t+ ^& n, ]7 A 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
, }5 g* c8 w0 n! ]* ]( q9 ]3 @ 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
) K# N& {6 h9 Z& }( z
2 B) m, }: G9 L1 l/ S2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。/ c: r9 h+ [7 l2 M4 u
<Ctrl><b> 視窗往上捲一頁。
z: G' o7 z& ~7 ]) ] <Ctrl><d> 視窗往下捲半頁。+ w# q9 {; O6 U6 r4 m
<Ctrl><u> 視窗往上捲半頁。
' q E3 n8 J+ t, S9 b <Ctrl><e> 視窗往下捲一行。
0 H( k: _7 e2 |& J) u% H* S# U <Ctrl><y> 視窗往上捲一行。
, z+ b& \2 U |0 }7 g" S! r/ w4 P4 Q. o5 Q# F* n! h& O
3.刪除、複製及修改指令介紹 (此單元較少使用)4 b1 T$ _5 t# }& r6 ^- j
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:& l- p8 H9 q, i# H
Operator + Scope = command; K( L& ?* B" U( B! ^% Q
(運算子) (範圍)4 d1 [$ |% _4 U( u. p' p% ]
運算子:; q) G3 V4 O9 \2 q! ~: c+ Q# R: Y
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
2 ]/ u6 B$ X3 N: X- }6 G7 z/ k y 將資料(字組、行列、句子或段落)複製到緩衝區。
: v4 x, O/ j9 N: `! O- o/ b0 ? p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
9 d* f9 r! T `* R4 o4 i 料放置於游標所在位置之行列下。
! s" @4 N$ I: R0 c5 y w c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
* i6 F$ N" U6 {; Y 子等之資料,並插入新鍵資料。
7 S- Q# B7 M' z. f$ o 範圍:
& W# g! K( s7 Y: j) g e 由游標所在位置至該字串的最後一個字元。7 U. ~5 E# q# |0 j- n$ \( Q! N
w 由游標所在位置至下一個字串的第一個字元。
. c4 D* P* g1 h2 |% N3 u# W b 由游標所在位置至前一個字串的第一個字元。
" {' i' A& H" V0 A4 H8 i- ]- q- ~ $ 由游標所在位置至該行的最後一個字元。
7 o4 h# C/ g& U3 r* M 0 由游標所在位置至該行的第一個字元。
! J* g$ M* K! x. u) R ) 由游標所在位置至下一個句子的第一個字元。
M" V+ u: [: u8 r$ G* X ( 由游標所在位置至該句子的第一個字元。2 } I) o% y' v1 x& i+ k% `5 P, ?
{ 由游標所在位置至該段落的最後一個字元。
k, e: F. D. y } 由游標所在位置至該段落的第一個字元。3 ?$ O5 Q' T2 Y
整行動作$ `0 w4 _3 }) z% o7 H; o
dd 刪除整行。" j& q$ f" Q, M+ g0 b2 P
D 以行為單位,刪除游標後之所有字元。
/ F1 A: P7 C4 [* @5 M& \ cc 修改整行的內容。$ M9 R, ~( x* b% C2 r, c
yy yank整行,使游標所在該行複製到記憶體緩衝區。6 ^6 m0 ~/ k! m
7 t4 |0 H. m1 O' Q+ R( Z& I4.刪除與修改
& b; @8 s$ A% z& D& d0 U k& w- g1 e x 刪除游標所在該字元。
6 K3 S1 N' v9 r X 刪除游標所在之前一字元。
( E4 {/ j2 C$ i: I( w6 e% L1 F( J% I dd 刪除游標所在該行。' r' V7 D& B: i8 N' B3 L2 I; O
r 用接於此指令之後的字元取代(replace)游標所在字元。# k3 C3 X0 g' P6 | `
如: ra 將游標所在字元以 a 取代之。
/ n2 p" i4 P+ b R 進入取代狀態,直到《ESC》為止。6 }2 @. O$ [9 a( T6 S2 L
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。+ B- R; M2 V5 d& k( n" R+ w* B5 {6 C
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。/ f$ {6 N: [0 j( M/ ]
$ g! }! u& r6 _* X9 P( ~% F2 C
5.搬移與複製
& d6 K+ {2 m6 p4 M 利用delete 及 put 指令可完成資料搬移之目的。
+ ^. x8 ~7 f) p7 i3 `, } 利用yank 及 put 指令可完成資料複製之目的。
* E0 C5 { _! O8 Z8 B yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
0 w# O- r2 ^* i 可將緩衝區內的資料複製到螢幕上。* [8 j* ~& |# ?; F5 z2 {3 q# k
例:
! f9 `) @6 f m 搬移一行 ‧在該行執行 dd7 T8 y. a6 ?, ^$ n* [, V$ p
‧游標移至目的地
) }9 l* w* U' V: ^ ‧執行 p, h6 w+ B0 ]/ T7 [2 Y9 q
複製一行 ‧在該行執行 yy6 Q V/ @ f1 G c. r; S7 s
‧游標移至目的地% |, P3 O) d: q n \
‧執行 p
, l6 r2 p' m2 y- _/ B0 F: M/ C( L( \* Z
6.指令重複% {$ ?% {7 {: A2 H3 Q( _/ C) k
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
) r# K/ ~9 [# c 次。! [: a- L7 c3 Z* j& ^+ B+ T: b8 P
例:9 _ |2 ?1 m- K% x: S o. u
刪除10行 ‧10dd& d6 w: M% S9 m9 }
複製10行 ‧10yy7 r0 b6 C1 _+ A. p& l% I# @7 ^6 f
‧游標移至目的地2 }) P( V7 u, g* O K# ^) F( O3 L
‧p! s' ]" ^2 ?1 b3 M) Q, V
指標往下移10行 ‧10j
0 M4 n3 \- l" q$ Q" P" I$ p( ^
7.取消前一動作(Undo)
" i8 g7 G" T. N. d" M* U 即復原執行上一指令前的內容。* f: Z& X0 M) X \4 o
u 恢復最後一個指令之前的結果。
7 k/ C, z4 @9 E U 恢復游標該行之所有改變。2 V- H1 A. S$ e+ T: Y9 U7 o
/ Q8 p! x5 `4 I0 n
8.搜尋" i! ~; E/ y6 k& J& l- j
在vi中可搜尋某一字串,使游標移至該處。. ^5 e$ W! I: \$ N
/字串 往游標之後尋找該字串。
, V9 Z) s( b$ f* _' x; T5 u$ ^ ?字串 往游標之前尋找該字串。
J! s* A) u6 T6 f4 O n 往下繼續尋找下一個相同的字串。2 b* M' P7 _* W
N 往上繼續尋找下一個相同的字串。
& |, H* k+ r% E2 e8 X8 N, b! j5 Q+ {! c% x+ H ~
9.資料的連接
3 B# ^; G5 |. Y u J 句子的連接。將游標所在之下一行連接至游標該行的後面。7 `- a$ `1 |9 \
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
. n, m& S: h9 ^3 F& U (可利用a、i等指令)再按《Enter》即可。 ]' V( {; K- `" G; {
4 w8 s& a; q6 z4 R
10.環境的設定- a% x6 ]. x4 X) @0 e0 u
:setnu 設定資料的行號。* o2 j6 V7 `; \+ M
:setnonu 取消行號設定。
' r( v" K, O3 |0 S :setai 自動內縮。
" E: u. e/ `) g/ O* H :setnoai 取消自動內縮。
. Q% j2 p% f- j 自動內縮(automatic indentation)
5 ]1 J2 ?8 V( V% {0 I1 e; g z 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
0 u8 T' [+ {' F3 S 動內縮的功能,用下例解釋之:8 R, O+ x. _ a( ^" q9 z0 [) [
‧vi test2 q) P0 f6 L O+ y
‧(進入編輯視窗後)+ v7 X0 G; h8 @& A! ]+ b
this is the test for auto indent: \+ w5 ?" R* `/ _$ A. J
《Tab》start indent ← :set ai (設自動內縮)( I( Z9 q$ B+ Y5 y" C" c
《Tab》data
- }% O D# G" L) l+ W" l 《Tab》data3 [# H9 I& Z4 Z2 x$ F
《Tab》data ← :set noai (取消自動內縮)6 I+ {3 b9 @/ j6 [ U
the end of auto indent.
+ k/ P$ k- H* L* B ‧註:<Ctrl><d>可刪除《Tab》字元。: M6 m1 @% i! o" w# L. q3 R1 H
* C7 `2 w! z" i/ h y
11.ex指令: @! l# G7 w8 I9 H
讀寫資料
! x# Y9 x; I. t; H5 B* c) z& q7 S :w 將緩衝區的資料寫入磁碟中。2 Z* g) g, S/ A5 Z, q7 X
:10,20wtest 將第10行至第20行的資料寫入test檔案。( h8 t' }& S5 O. @% ]# B4 G
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。& a/ I; M9 n6 e6 w1 O& n5 ~, X
:rtest 將test檔案的資料讀入編輯緩衝區的最後。
4 I0 e/ `* W8 G& P M; a$ N) }/ G 刪除、複製及搬移1 Q6 b9 ?/ d1 I g5 `8 @
:10,20d 刪除第10行至第20行的資料。 o$ V. M6 }6 ~1 Y$ j, o
:10d 刪除第10行的資料。
2 A: F2 @4 T) \# d4 }9 q% L$ c :%d 刪除整個編輯緩衝區。
. Z! Y6 q* e1 P% F( u :10,20co30 將第10行至第20行的資料複製至第30行之後。5 P/ x9 N$ ~, J+ y ^6 C3 J
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
: D) e( N6 D4 R d( c9 W 字串搜尋與取代
: _+ e# W+ F6 y! x' M s(substitute)指令可搜尋某行列範圍。
" q% f. q, h2 D- V g(global)指令則可搜尋整個編輯緩衝區的資料。
0 [% q7 M4 p0 y# X! Q* Q s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條6 [- [& B4 b$ C: Y3 C
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。 N; G* T! h$ Z- D. h/ d
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
9 m# [6 O& M, P% R6 M* A% V, v. L8 | :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
% C( p+ y/ X; Q" x :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。; _) M+ L, { ?- ?8 ?
5 v$ ^8 \# I4 v7 ~: Q! ?) u' Q( S12.恢復編輯時被中斷的檔案3 p- a, }$ A; }: r
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
7 e1 v& u0 B2 F 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
: o! U1 D! T- n8 i) o. d 的檔案內容。
& {- r0 ^( {* A; l %vi -r filename
0 |8 H. E! I K0 m! s
( @) w1 q0 O+ Y5 @3 |( a5 Q- ]13.編輯多個檔案
$ U* c, i7 r* S# [1 e2 L3 K vi亦提供同時編輯多個檔案的功能,方法如下:
* X9 k; E2 d" _ %vi file1 file2 ..$ E- k# B L1 S* c3 k! W/ E1 F, Y8 F. A
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
* g7 V8 d" Y& |. K+ v, Y 再利用 『:n』載入下一個檔案。% _9 u9 Z5 h3 X* [ C
9 ?5 G a% N/ z9 z0 z3 S參考:" o% @* J" M+ G+ \
9 H9 L% x( h4 d2 [" X% G% Khttp://chunchaichang.blogspot.tw/2010/08/vim-s.html5 \3 Z+ q" G" k( D# V
|