本帖最後由 IT_man 於 2017-5-6 23:16 編輯 5 Q0 A& r. p! T. z
& G+ ?& A' h* e8 G: S
vi指令說明(完整版)
! {# O" `7 _6 w$ U6 K% _7 U" x- vi 的操作模式0 r( S+ x# G8 `) J. o4 P2 c/ e$ H) `
* G' J( _9 s, c! u4 avi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
$ R$ Y- ^$ T5 _$ y: s
" d- D. `; @2 ?
如何進入輸入模式' D; @# s. H E
a (append) 由游標之後加入資料。
5 c* ^0 ^. j" s; F4 J A 由該行之末加入資料。
$ J" A0 V0 K. Z# I i (insert) 由游標之前加入資料。- ?; Z [, \& h& F
I 由該行之首加入資料。
1 I2 M% l. b$ e o (open) 新增一行於該行之下供輸入資料之用。) b, q0 g3 x* h: s/ Z5 J
O 新增一行於該行之上供輸入資料之用。( ~" C# M0 Z. y- ~) U8 y6 f, w
如何離開輸入模式
% A4 `) D3 @$ b) |" O' { 《ESC》 結束輸入模式。0 y8 q3 U/ y- Y" l' X& j( T# L
' r" A4 X+ w8 k# {9 s3 B7 x1.游標之移動4 b' m9 X& m- ^2 ?1 J
h 向左移一個字元。
" N: x& |/ ^, B, {0 \6 h j 向上移一個字元。
( W7 a5 P. y% }3 s k 向下移一個字元。
) X$ `+ G. e5 R8 I( H7 Y l 向右移一個字元。
5 f& R* S0 l% r; W% O 0 移至該行之首& y3 {/ d# U6 Y& j2 |. A/ d6 T
$ 移至該行之末。# W5 U8 k# d$ J& v& ?1 \' V8 K7 Y
^ 移至該行的第一個字元處。
$ z/ N3 Z$ s2 T. k. y( l" C H 移至視窗的第一列。; k7 m W0 @7 }0 L& M3 b
M 移至視窗的中間那列。
0 u& I' G8 O* n/ ~4 B* [ L 移至視窗的最後一列。9 x6 _4 C/ A* _* q3 P
G 移至該檔案的最後一列。" M5 u) K. i6 a& L
+ 移至下一列的第一個字元處。, T8 ~3 ]1 B3 I$ D; `5 t) V
- 移至上一列的第一個字元處。) c5 l6 \7 B( `
( 移至該句之首。 (註一)
8 y. Y8 W4 X1 v" W) _$ a ) 移至該句之末。
2 j- R2 E7 u: \ L/ y( V8 C { 移至該段落之首。 (註二): C; |& Z' ~6 @. x: n
} 移至該段落之末。
3 E {! p+ i- M/ F# E, a$ D5 Q$ l nG 移至該檔案的第 n 列。
8 ?* P) B/ _* g% s2 _6 a; { n+ 移至游標所在位置之後的第 n 列。
R" Y& i b" ~6 h& Q n- 移至游標所在位置之前的第 n 列。* ]) Z) U0 z4 H2 ^" |
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
# w: O& N( \4 T p) r 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
+ u6 z+ M4 a1 J' q0 u 註二:段落(paragraph)在vi中是指以空白行隔開的文字。4 L& ^% M p5 p
3 ~9 b, C3 d- `( y5 d2 n+ U7 ?+ s* P
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
; W" H1 z9 I9 M3 B; G9 Z. W* u/ S <Ctrl><b> 視窗往上捲一頁。
9 T7 p- K; m; @9 x6 w0 N <Ctrl><d> 視窗往下捲半頁。
3 H3 ^4 Q: ^! x: ]4 B- n, \ <Ctrl><u> 視窗往上捲半頁。
3 l$ T7 _2 p! Y+ r <Ctrl><e> 視窗往下捲一行。& N, g. c- N+ [; [6 e
<Ctrl><y> 視窗往上捲一行。( E2 l+ f! V/ q; j
, [6 {6 x$ n: l; K
3.刪除、複製及修改指令介紹 (此單元較少使用)
6 ]8 X6 M* \. E d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
& u2 ?, f6 K: r Operator + Scope = command0 u; w2 d B& E0 g5 d& C
(運算子) (範圍)
) W. L# k* B1 t 運算子:; S) d, T8 J2 j4 ?! E9 K5 o
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
5 c v, X. k/ _, F8 Q, t" O- Q+ P y 將資料(字組、行列、句子或段落)複製到緩衝區。
; ~3 \: m; I7 N: _/ S p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
* J8 p7 s o0 \: ?4 S' n6 h" Z 料放置於游標所在位置之行列下。
+ ~9 k9 `) w& F# C g! ^0 e/ _ c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
, v, Y7 i3 g1 Y1 E. A7 q 子等之資料,並插入新鍵資料。) i) x( d7 ^9 x
範圍:
! Y% n; [5 ^3 T" @ e 由游標所在位置至該字串的最後一個字元。
4 e% n. q0 E' f. p w 由游標所在位置至下一個字串的第一個字元。" G1 \/ l7 ?1 `1 ~4 e
b 由游標所在位置至前一個字串的第一個字元。9 o* }7 |+ P+ B4 _ A7 `9 b
$ 由游標所在位置至該行的最後一個字元。
. r) M$ b' `; a3 j# {4 D) e 0 由游標所在位置至該行的第一個字元。
' s( ~5 U, W* |8 a& }6 \! t ) 由游標所在位置至下一個句子的第一個字元。
! }, |6 S1 R5 u: J9 H' e1 p) m1 z ( 由游標所在位置至該句子的第一個字元。5 ^& \# a) l) ?& }( K5 ?. k
{ 由游標所在位置至該段落的最後一個字元。
4 m% J- u* X5 _* M4 I2 x } 由游標所在位置至該段落的第一個字元。1 V; m% ^% v- K5 V
整行動作
) {; [7 U0 w3 r2 p& G dd 刪除整行。
7 D' c v3 P* R( s+ i D 以行為單位,刪除游標後之所有字元。$ o7 K# g0 O/ h6 T2 F! N
cc 修改整行的內容。
Y& h. J$ ]* F$ ? P) a, c) \1 X* w1 k4 s yy yank整行,使游標所在該行複製到記憶體緩衝區。. f& d3 b; [* w* [1 s) }
# N1 A) ?& _0 I; ]" R2 t% }8 i
4.刪除與修改/ y7 N8 f$ s9 W2 u' d
x 刪除游標所在該字元。
3 c' e$ ~, ]3 k3 D e% d# ~% ^6 u! ` X 刪除游標所在之前一字元。3 w; }% a/ A% m3 f! d8 B$ E
dd 刪除游標所在該行。7 ^, ?9 s& G/ l1 ]* y8 y0 T
r 用接於此指令之後的字元取代(replace)游標所在字元。
' |: Q4 ?3 A' V% C9 k 如: ra 將游標所在字元以 a 取代之。9 E. s7 q: j r4 U
R 進入取代狀態,直到《ESC》為止。- Q6 ~5 |7 K! f& h! v
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。6 [3 k, d, r$ H, ?: O
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
* ~5 }! c2 B0 F( P! E/ @) X* k( T" m0 t8 o) s, Z9 a7 `( ?+ F
5.搬移與複製5 J, O$ }) h5 D
利用delete 及 put 指令可完成資料搬移之目的。
; u! W% `' b& ]$ X 利用yank 及 put 指令可完成資料複製之目的。( ]" I( ]4 ^6 F4 R8 l
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令* A4 s: J! i2 q* `
可將緩衝區內的資料複製到螢幕上。
; a8 ]6 ~9 I$ |9 H 例:
0 O+ H( d8 t+ r, \ 搬移一行 ‧在該行執行 dd0 _+ N f( ~/ {1 K( _- Y$ {
‧游標移至目的地
4 Q, a! c2 v7 ?. G1 `" l$ `& g ‧執行 p
) f! ]: b- R1 W 複製一行 ‧在該行執行 yy
1 N& j7 t% Q, ]% A: |8 d& P& l ‧游標移至目的地
+ ?2 N5 j( m. p: m9 h& I5 M& @ ‧執行 p2 ~; D' Y7 Q4 a0 W1 J/ a( G
6 p) f( Q0 r1 X$ F, l+ m3 R- J4 ]
6.指令重複
$ X( j* l9 O- G! I' X* {3 g1 Y6 l 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
7 a1 r9 p5 [7 r' X 次。
7 r* q9 R3 G; d4 W& T2 j' ?1 j2 Z 例:8 l+ k, f, }% f
刪除10行 ‧10dd
1 D- r7 H/ X# U: D' t# h$ ? 複製10行 ‧10yy, K# M% u. Z+ m, D- G6 n
‧游標移至目的地
, k' f/ Y* K# C( c. U. S ‧p
u* t/ }: u/ c6 t1 J 指標往下移10行 ‧10j
$ k% z ]5 D2 q8 c
7 C( m, j `0 [* ~5 Q7.取消前一動作(Undo). j' F) b U4 p1 J8 Q
即復原執行上一指令前的內容。
2 G# V1 N+ r9 r& J% ] u 恢復最後一個指令之前的結果。: f, G% N2 C1 Y$ e3 u9 U
U 恢復游標該行之所有改變。
s1 v! S. ~1 s/ }6 r* G2 U) d
) a5 g1 F" d, \: ]8.搜尋# _7 r2 Q9 B% X
在vi中可搜尋某一字串,使游標移至該處。6 r- p( g" w/ D
/字串 往游標之後尋找該字串。
9 Z( j- F F, I2 D8 |2 Y7 e) c3 ` ?字串 往游標之前尋找該字串。- J2 F9 ~; N1 g' ^$ I1 Q$ {6 [/ d" [
n 往下繼續尋找下一個相同的字串。
; G: r; H8 m: U) X: r" S- b0 Y8 R N 往上繼續尋找下一個相同的字串。6 e+ D3 K& q9 N9 Y
' Y5 g) I4 f1 D9 ~% w5 L7 p9.資料的連接# o4 k, L& A& f0 S, Q
J 句子的連接。將游標所在之下一行連接至游標該行的後面。0 `2 ` ?8 h- ?# Z! c1 ]
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式$ B6 C- V% L5 M# M x. p) ]
(可利用a、i等指令)再按《Enter》即可。4 n/ q3 q& @ h' k$ i
( v! v* C- G) j# k# i10.環境的設定% P3 D, h- E7 D2 g9 p, C5 B8 _: s
:setnu 設定資料的行號。5 ?% ? S* e/ Z- m6 c- y
:setnonu 取消行號設定。
- g. u- j- a" X4 h :setai 自動內縮。
3 j' p& C& N5 B9 b( T/ w :setnoai 取消自動內縮。6 l! ^" h# T- U$ F/ ^/ ^
自動內縮(automatic indentation)" Q: S: B; D/ x6 ]/ _. _- F( Q
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
5 H, R8 {# H6 X 動內縮的功能,用下例解釋之:
8 @# a% P$ Y+ s# N9 f0 E5 ` ‧vi test4 S) q5 a# L8 p3 k. G
‧(進入編輯視窗後)
+ D! b0 o" Q) ? this is the test for auto indent# y, j5 @8 a, ]6 L
《Tab》start indent ← :set ai (設自動內縮)
2 T) w* H/ C: H8 S7 S 《Tab》data
9 X* @1 k3 i' ?$ f, A* y4 p+ ^( B/ r 《Tab》data
0 d. w! I1 O8 m2 M' ]; B. n" A# T 《Tab》data ← :set noai (取消自動內縮)2 M! Y) `6 r7 v! {0 l
the end of auto indent.7 v6 n7 E* ^9 t: j5 ]( N; K
‧註:<Ctrl><d>可刪除《Tab》字元。
# J8 r* E3 E- S: u) v
8 t2 U! ^$ m- O# s! Y11.ex指令
2 p; d% f) z6 g( A, @' y9 E% | 讀寫資料
0 y" p# ?, V' I# o :w 將緩衝區的資料寫入磁碟中。
. @* x9 w) H* S# M% L :10,20wtest 將第10行至第20行的資料寫入test檔案。
8 B% B4 J# f+ N8 ?9 m7 l :10,20w>>test 將第10行至第20行的資料加在test檔案之後。
9 w* q5 y7 w1 B7 S7 f3 h- y :rtest 將test檔案的資料讀入編輯緩衝區的最後。
0 W" g9 T H4 E4 W! Z2 j* Y/ e 刪除、複製及搬移0 W5 G0 ~7 [' p
:10,20d 刪除第10行至第20行的資料。% B; S: a& J9 Z# Q( U- A* f$ X
:10d 刪除第10行的資料。. z2 U. l# |, s; K6 q& s' J, h& v8 k
:%d 刪除整個編輯緩衝區。0 E: a, _! f1 Z4 h' R# f5 h
:10,20co30 將第10行至第20行的資料複製至第30行之後。0 f* C- v! u6 H( L! l
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
( U# h- v/ ~3 O% T 字串搜尋與取代
+ C2 h" D- p9 o& H5 v4 s0 l1 n4 V6 |. C2 M s(substitute)指令可搜尋某行列範圍。1 q, o1 s. k7 y$ s
g(global)指令則可搜尋整個編輯緩衝區的資料。
# [6 O' L! K' }1 l$ [2 M* Y s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
- S( }' h. Y2 _$ _9 f/ e 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。" @# N; s% v; H6 C
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
+ a, }# k7 ] A5 A& O2 D1 }, S :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
8 Y; s* b# L1 p1 a9 ?4 f9 l :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
# [0 j8 {4 w5 e2 ^' Q/ y
; [' `* W; r* |12.恢復編輯時被中斷的檔案
@) G3 f) X0 R R 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未7 d5 b6 Y9 \/ d9 \
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前7 F' h; e8 l+ L F0 Q7 F" @
的檔案內容。( h, Z: @2 p) ^0 R7 X
%vi -r filename" g! @+ V9 t) N( f
0 X. B& R$ x3 @" K; E! Q3 j
13.編輯多個檔案3 Q( }$ g4 O# q0 r) F2 v2 d
vi亦提供同時編輯多個檔案的功能,方法如下:
' C& w) ?% O4 l3 J# q %vi file1 file2 ..
, X+ W( P8 ^# B+ T* ~5 Y 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
* a( S+ O" h _0 ? 再利用 『:n』載入下一個檔案。
0 t' ~ w$ s3 V9 y' U( ^
- g9 |1 ^- ~. D! ^3 x參考:5 F8 b- e1 Q1 u0 a8 D( ]
& V4 P/ T# L" e; I) [1 L
http://chunchaichang.blogspot.tw/2010/08/vim-s.html7 B3 n& ~4 W- L- `- v
|
|