tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯
# Z0 f" L9 V5 \; V7 {9 E
# U' ]; t+ B% h6 kvi指令說明(完整版)
* F; P; D! F( m1 {- vi 的操作模式' ~$ Q6 p4 b: h- n, l/ t) w
0 n% b! X# p5 Z# t$ `' \vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
& {2 N1 K& Z1 v" ^5 r2 e, c
/ ~' I2 A m* g" s2 ~# h/ O 如何進入輸入模式
% i* q V- B$ m7 E. a7 ? a (append) 由游標之後加入資料。
7 Q, K5 `/ m3 |9 C+ K5 k A 由該行之末加入資料。
, j2 t+ f8 s" O5 ^/ x8 C i (insert) 由游標之前加入資料。; G* U/ H3 u# j0 L$ o
I 由該行之首加入資料。
2 m( d7 Y3 p# e& { o (open) 新增一行於該行之下供輸入資料之用。. ?" i9 a3 H. l# t
O 新增一行於該行之上供輸入資料之用。+ S& o, T: {) |+ o1 U
如何離開輸入模式. a D, `3 K& d* }4 O& S
《ESC》 結束輸入模式。2 F4 O) X7 r7 v D' E& v. @
- 指令模式* K" }3 S3 K' ]+ u- e$ U
3 L6 P a1 F" ?5 e7 t6 R r, k, M1.游標之移動( X' p/ r4 T y" G% W! f
h 向左移一個字元。
/ p# |/ k0 c& l% a6 k j 向上移一個字元。8 [& s; p5 B" n0 T
k 向下移一個字元。
$ z# l# [- ~2 F K d l 向右移一個字元。
( i2 W; T7 L; ~! J 0 移至該行之首8 L1 ?- Q1 N$ k* r! @* {7 T2 L! ?. k/ K
$ 移至該行之末。
& n/ F k: d! S# j, R1 h, \! w ^ 移至該行的第一個字元處。
+ a( k; q; a: n+ P7 I& v H 移至視窗的第一列。% n* W( Z3 n4 l, I' a7 B
M 移至視窗的中間那列。0 l, G, h6 X0 n& s
L 移至視窗的最後一列。# Q' u; ?3 e4 t/ b; }6 ^. f4 J1 d
G 移至該檔案的最後一列。
1 c X' l9 n: L5 c) V& I S+ U L2 H + 移至下一列的第一個字元處。
! H; _' F6 W* A+ \4 Q C9 v - 移至上一列的第一個字元處。0 Z, [" ?4 q: z" ?! R6 N) p
( 移至該句之首。 (註一)
# Q$ N% \5 P( ^7 c- D( [ ) 移至該句之末。+ Q5 q: P/ a3 |7 X: P
{ 移至該段落之首。 (註二)
5 z/ \' F& Q0 I7 g5 x0 g } 移至該段落之末。4 {: J/ G J' }+ W
nG 移至該檔案的第 n 列。
. n% X4 V+ f+ Y5 ^7 Z* a7 | n+ 移至游標所在位置之後的第 n 列。9 G* r/ y7 D4 T+ }6 G9 `
n- 移至游標所在位置之前的第 n 列。+ J3 h2 e( v; h; ]( ?
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
$ W5 [* {9 }6 |: S' _& w- H& c 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。' N" ]' g4 }* F6 t1 x
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
6 t4 K7 e- G" z) q( J8 L
$ J2 o/ \8 R. a3 o* L V2 f: l2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
( D" D' L5 S& w8 I _1 u. D+ W <Ctrl><b> 視窗往上捲一頁。
; z+ n+ [, S6 L7 j' t) n <Ctrl><d> 視窗往下捲半頁。% |# ]) E- r) z
<Ctrl><u> 視窗往上捲半頁。
1 h/ T. N" ^0 Z# [4 x4 b' g+ | <Ctrl><e> 視窗往下捲一行。
; T6 E2 M) s, t# i. R, |1 v <Ctrl><y> 視窗往上捲一行。
( K' h$ { ? t$ i$ c# t$ @7 R% J
! @! k1 T, c/ u6 c! x3.刪除、複製及修改指令介紹 (此單元較少使用)
% H1 p. D* ]0 \; A" ?1 S d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:# K2 U4 Z& Z: ?
Operator + Scope = command9 E/ N A$ z! P( f; l1 D) \
(運算子) (範圍)
) d, w2 w0 I k7 t- X 運算子:) _9 e. s4 Y% B
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。6 q b& H# y: x
y 將資料(字組、行列、句子或段落)複製到緩衝區。! [$ n+ P) O7 C
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資5 j0 |8 G/ Q% W+ ]) X+ {% O2 S
料放置於游標所在位置之行列下。- g& _( A$ j' q8 p
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
/ Y0 Z! `; [( T( W1 u4 p 子等之資料,並插入新鍵資料。" W" @- `0 ~; O' b' y5 u3 n
範圍:" `0 |" ~' _. _2 B9 {
e 由游標所在位置至該字串的最後一個字元。
- W1 ^4 v, w: a5 J7 _ w 由游標所在位置至下一個字串的第一個字元。2 C4 \: P5 w- \* c
b 由游標所在位置至前一個字串的第一個字元。( J% C( T% v$ f* s! A
$ 由游標所在位置至該行的最後一個字元。
' c. E. t# O6 b6 m 0 由游標所在位置至該行的第一個字元。1 ~$ t# `+ M$ F2 ?
) 由游標所在位置至下一個句子的第一個字元。
( T0 c" P, R+ v# T4 Q9 L6 ?5 K& p$ Z ( 由游標所在位置至該句子的第一個字元。3 l. X: K: i0 n; ~4 Q
{ 由游標所在位置至該段落的最後一個字元。! _% r! E H6 M, z" m x
} 由游標所在位置至該段落的第一個字元。1 {; ^9 K' j8 a/ z, {
整行動作4 r# f4 P( W" [5 _% W) n5 W3 W2 B
dd 刪除整行。# l. o# P: ~( G/ A i# L W
D 以行為單位,刪除游標後之所有字元。9 i1 \# F8 k. T% ~! w
cc 修改整行的內容。
/ H6 V% }1 b4 N) E9 P, l" O% l, ^) L yy yank整行,使游標所在該行複製到記憶體緩衝區。5 Y! |# b! Z% ]9 h' x: w/ k
* \$ U7 W5 s- I4 N
4.刪除與修改& o8 B: S' \3 H4 d8 S
x 刪除游標所在該字元。
& L4 W( ^+ K! f3 h3 Q X 刪除游標所在之前一字元。
9 D/ @, G3 s" h2 ^ dd 刪除游標所在該行。
/ z! B5 R1 _& ]# C+ F: G r 用接於此指令之後的字元取代(replace)游標所在字元。
6 N' x9 f3 H" ~8 h+ B 如: ra 將游標所在字元以 a 取代之。
( Y. a) R" f6 d& L0 ^- c R 進入取代狀態,直到《ESC》為止。
1 i; `' j% l$ m/ Z, j/ T" U) \9 X s 刪除游標所在之字元,並進入輸入模式直到《ESC》。7 y( o. j+ o0 ~# _2 T
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。1 Z) |" Z9 _1 j' Y- W* |3 u
+ u* Q. Z, j- C7 Q5 _( R
5.搬移與複製$ g* h: k z( Y) g3 d
利用delete 及 put 指令可完成資料搬移之目的。- ?* l% L0 j; @6 {( }
利用yank 及 put 指令可完成資料複製之目的。
1 \4 r5 n N( n yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令+ u6 c' m; X, S8 I; L
可將緩衝區內的資料複製到螢幕上。2 A$ r4 P: @% A+ L) P% o
例:; a& `0 w$ F, H
搬移一行 ‧在該行執行 dd6 u6 j! r+ Y `* o
‧游標移至目的地
^' c* a. k; S: ` ‧執行 p; @% b. e" b+ \
複製一行 ‧在該行執行 yy b. F1 o- |# K
‧游標移至目的地
2 Y' K' U# U `7 ^4 z ‧執行 p4 r6 h9 O7 {. @( U5 |; }6 N4 e
5 s+ _6 b$ Y4 V' p, i3 S6.指令重複" r2 Y4 p0 }- R9 Q: k b4 D
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
1 P$ p9 O" }4 z: Y+ b# _ 次。7 Z0 z4 r' o' r3 w
例:" i& R0 y8 T: y+ t9 N
刪除10行 ‧10dd8 i6 Y9 P, J0 z
複製10行 ‧10yy$ h* `; r. F0 W& W6 y1 B7 Q1 u
‧游標移至目的地" y$ N. ?3 g$ a6 W/ J, D0 c! @
‧p
/ ~0 i$ a% j3 O 指標往下移10行 ‧10j
( k& H: H- N# ]. k6 g
& F% |# r4 x) T* m7.取消前一動作(Undo)) `% c! D$ P4 D, h0 b
即復原執行上一指令前的內容。/ {0 F) `& x- @2 K
u 恢復最後一個指令之前的結果。
3 F, O9 C* b, w& [& f& z* o U 恢復游標該行之所有改變。+ }7 A* T3 b" b7 Q4 H' H; e9 r( N
, p8 \% Y( r2 q
8.搜尋. [7 ^. c3 k: u3 E0 A
在vi中可搜尋某一字串,使游標移至該處。
* d+ z2 ] L# V( |: l U /字串 往游標之後尋找該字串。
+ R2 {1 [5 a2 A- ]# \0 \0 T ?字串 往游標之前尋找該字串。1 @/ T. G- e& k+ J* z! p) K& N
n 往下繼續尋找下一個相同的字串。) @0 u% ?- Q/ F" I+ D
N 往上繼續尋找下一個相同的字串。
5 K. x! ^# Q' ?( v+ o
# X4 `; k& p( ^# ~9.資料的連接! }3 E; D" V4 L/ W1 g# A F; t
J 句子的連接。將游標所在之下一行連接至游標該行的後面。5 }6 P& e, j& U% e6 G' H
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式4 t5 X3 b. i' T/ E* M X9 Q
(可利用a、i等指令)再按《Enter》即可。! m+ y* r+ Y6 o$ Z* F
" @5 j, P$ V$ o! ^% D
10.環境的設定( q, M C7 W$ N# q# |. U1 W3 v& d. I
:setnu 設定資料的行號。
0 \' m* _ k# h1 U$ L' Z :setnonu 取消行號設定。
: g/ ?5 [5 S% |$ p8 K :setai 自動內縮。$ w# F! X# l5 p$ n$ U& h4 T* }8 j
:setnoai 取消自動內縮。
. F# c9 }& W# F: L- ~) U/ q: J. s 自動內縮(automatic indentation)8 i1 |, h+ P) b: s+ W5 P1 {
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自0 r3 b3 y) N+ w! a$ y9 A
動內縮的功能,用下例解釋之:
* u6 n/ u8 d6 M. @' g- d, k; A ‧vi test
) c6 j7 q1 f1 w, B5 o- j ‧(進入編輯視窗後)+ V5 x1 g) L5 j/ U4 B6 N5 q9 @
this is the test for auto indent
- y! _/ ~) _4 v M' }+ n" G5 w% h 《Tab》start indent ← :set ai (設自動內縮)
6 N4 B! ?" w/ P8 p9 Y, g 《Tab》data
2 {6 i6 Y# N; ?- p 《Tab》data9 R- S1 e0 y; o) j( m0 |8 F
《Tab》data ← :set noai (取消自動內縮)
3 a% L" N7 W; e) [ the end of auto indent.( q$ S5 l6 r$ K# f/ s" e% W) Z
‧註:<Ctrl><d>可刪除《Tab》字元。, k1 S! O" | o) L! j' X
% a4 ?* n: t0 b3 q2 f11.ex指令3 A o N+ w- U
讀寫資料
0 k$ \/ ]* K: W :w 將緩衝區的資料寫入磁碟中。
. E0 E8 u3 {8 ]/ Z+ Y8 t5 b4 o :10,20wtest 將第10行至第20行的資料寫入test檔案。
9 h! s9 n! I& u3 |! T :10,20w>>test 將第10行至第20行的資料加在test檔案之後。4 s; X/ s& ^; c2 l
:rtest 將test檔案的資料讀入編輯緩衝區的最後。9 }. L! u* s5 K1 C8 @$ b: @
刪除、複製及搬移: ~5 @) Y2 B2 B2 [& H
:10,20d 刪除第10行至第20行的資料。
7 W9 E, v; ~- w n* }9 { :10d 刪除第10行的資料。
" g1 c- r! H/ \$ J6 C7 k :%d 刪除整個編輯緩衝區。: ~2 K. E( V4 s/ s( [3 U
:10,20co30 將第10行至第20行的資料複製至第30行之後。& V8 i; ~( x% W, Z+ x# {
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
6 K3 _6 P3 v w# m& l9 h0 f( s8 J 字串搜尋與取代
2 C3 E4 L# w; ^$ I s(substitute)指令可搜尋某行列範圍。0 i% \: U/ b. O$ |& ~! ]$ \, t; S
g(global)指令則可搜尋整個編輯緩衝區的資料。% u2 n/ r* |8 t& g# g' Q
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條: q) B3 S& J" ~* m B5 \; |4 V
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。$ ~2 y7 f9 F; ~% s( Q2 x( l* ?5 d
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。4 x) a* E$ s8 s! n/ b7 r- K3 E9 P
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。, E8 a: ]/ h0 V4 C( w" Y, D/ ^4 Z/ z
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。7 Y) A- t/ G3 q+ J
, M& I7 V4 d* t/ I0 `: K. T6 e0 U B' U12.恢復編輯時被中斷的檔案; K5 Y4 G- w+ |/ T1 W% ]
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
1 {: n8 H7 R$ I3 U6 t% N4 Q0 S 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
; q5 W' T$ X" R+ o3 U: f/ B' l 的檔案內容。
' e4 w) N6 ~4 H& j2 Z %vi -r filename
@$ u9 x4 r5 Q, \
5 `; R: d6 j. L2 l- q+ i1 w13.編輯多個檔案, D* |7 g- c# ?: B
vi亦提供同時編輯多個檔案的功能,方法如下:
1 W1 f1 f& C( } %vi file1 file2 ..
/ f$ U8 a) o3 O- U/ V1 s2 M8 S; u 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
5 a# n" D. q! ^* [ 再利用 『:n』載入下一個檔案。( _ v# ]8 d8 r1 ^
' D$ ^) {. J# A' Q7 |3 p& v
參考:
9 o3 |# b0 _4 ^% I' X3 T9 d$ y
3 U, ^9 S. \8 [$ o& F5 _- M; G5 vhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html
1 C! N6 I, n: ^( {$ k! E |