tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 , Y# t5 ?9 O9 Z' e* p
' P2 Z% }& V4 _2 L Yvi指令說明(完整版)
9 j9 L# H7 Q0 C! Z- vi 的操作模式: Z! ]) w/ b! S; t1 o
1 R/ `' ^2 ?, L/ R/ Uvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式2 B: n, |( b2 Z! q+ l% S
! p* b2 G! {# g; X
如何進入輸入模式) s! a! k' G6 ~3 u: v* ^
a (append) 由游標之後加入資料。% Q* ]' i* y- c3 n0 [ F f& M2 M
A 由該行之末加入資料。
; K' |1 `$ U: I i (insert) 由游標之前加入資料。
# K" {& t. u |, k! _) ]/ O [ I 由該行之首加入資料。3 V# } A* @8 I, _+ \
o (open) 新增一行於該行之下供輸入資料之用。
9 ~/ j' A1 A& C' c0 K; l O 新增一行於該行之上供輸入資料之用。+ ~- Q u; u K# \2 m8 E' q
如何離開輸入模式
2 b9 P2 Y& @1 n 《ESC》 結束輸入模式。
& g( O' h/ X8 _- s1 G3 o- 指令模式, A( B* R0 _& M% Y+ a
6 y7 [+ O% c+ e6 _1.游標之移動1 ^2 ?8 m7 o7 B1 q9 N( Z- T4 S
h 向左移一個字元。
( W6 {# J: U1 n6 D* V# ]- a j 向上移一個字元。2 Z) a5 U; O+ [- n- O3 ]3 h
k 向下移一個字元。
) [2 q8 D, H) U' u8 J l 向右移一個字元。1 a: ]" Q% R/ `2 }3 y7 Y
0 移至該行之首: x2 S, ^+ p8 {9 [. y$ O9 Q2 A
$ 移至該行之末。! e% F4 C* e3 X2 A9 c+ ?
^ 移至該行的第一個字元處。
7 U7 r) P: Z E1 d* ~, k H 移至視窗的第一列。" F4 ?; C& C! u8 P( c" o) y
M 移至視窗的中間那列。. n" S( E! m9 o- Q" a$ [$ t! m9 {
L 移至視窗的最後一列。
$ V9 z+ E0 Q7 D: I* L* X G 移至該檔案的最後一列。0 ^& t' `0 E! Y5 i- z8 I. N
+ 移至下一列的第一個字元處。- q; d6 g0 n5 {- l
- 移至上一列的第一個字元處。' d! k2 N, x3 ]& K
( 移至該句之首。 (註一)
- q6 Z1 E0 O$ k x9 R ) 移至該句之末。/ K. C7 N) Q: b
{ 移至該段落之首。 (註二)4 b) ?4 C7 h0 D1 _6 b- R
} 移至該段落之末。" v2 ?; }0 x1 l5 M: c& a
nG 移至該檔案的第 n 列。
3 ]/ ?* H) t+ { E' h3 N3 p n+ 移至游標所在位置之後的第 n 列。
' H, |: t* B3 U n- 移至游標所在位置之前的第 n 列。6 l' `9 U. ~/ ~
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。3 |' b& P+ U6 r9 P( L9 }
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
5 ^7 [# B4 u$ _" \( f 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
~( q- Q4 @3 ~! O! d8 t' e% \0 g- q
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。& U4 E) [' Z8 c0 T4 ^
<Ctrl><b> 視窗往上捲一頁。* ]0 j3 V0 m# W: ^4 t/ M
<Ctrl><d> 視窗往下捲半頁。
% u% u' Z! P2 \/ O! ]2 ] <Ctrl><u> 視窗往上捲半頁。' v$ r# ^% Z8 p, M
<Ctrl><e> 視窗往下捲一行。! v b+ X. M" G0 u4 S$ g
<Ctrl><y> 視窗往上捲一行。6 N$ a( Y& _% [" ^$ q" |
/ U$ U1 `/ }7 d* [4 |3.刪除、複製及修改指令介紹 (此單元較少使用)1 x1 d. t( J/ b) r T5 H
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:9 a& F0 p- N5 E7 C
Operator + Scope = command
8 w2 O- A, R$ V2 v (運算子) (範圍)
# D& b# ` V6 _/ [% d: W) h! M 運算子:+ b0 _0 O1 [% u# T) y' R+ F
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
6 p) l0 O1 J/ g$ F: p# w y 將資料(字組、行列、句子或段落)複製到緩衝區。
9 P" N" ?( Q# y p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
* K$ B' \. W2 @/ \. y; o 料放置於游標所在位置之行列下。
& ?/ f, U7 e7 }9 }& w9 {# \8 @/ T c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句2 F+ ?! x3 c- f# c- X; D3 |
子等之資料,並插入新鍵資料。 M$ y# L5 A6 v# q& |( z
範圍:# j8 l3 y) b' Z, z8 U9 x0 U* j
e 由游標所在位置至該字串的最後一個字元。% D: I. s) F! M
w 由游標所在位置至下一個字串的第一個字元。
; c, `# h& j/ K b 由游標所在位置至前一個字串的第一個字元。3 G& Z* M: y* H- C
$ 由游標所在位置至該行的最後一個字元。
' u) ~, T$ L; W3 c: g 0 由游標所在位置至該行的第一個字元。0 x n9 q$ N: `- C: d- G
) 由游標所在位置至下一個句子的第一個字元。# x, ]4 Y9 U! ?- j9 g2 r2 M
( 由游標所在位置至該句子的第一個字元。' [7 e% f' f3 K2 y7 {# n
{ 由游標所在位置至該段落的最後一個字元。
$ u" s. C5 V: P2 _) T) v) z } 由游標所在位置至該段落的第一個字元。
1 e9 P( t3 C, w3 x/ s 整行動作
2 N% R. {1 i0 d dd 刪除整行。7 Y' n- U% N+ Z4 L( A* }# u+ F L& I- v
D 以行為單位,刪除游標後之所有字元。
5 ]% M h6 Y% z! X3 W* {7 ~2 J cc 修改整行的內容。$ H7 D d% N5 H' z+ m3 ^7 B
yy yank整行,使游標所在該行複製到記憶體緩衝區。 {7 J. H4 R8 d* q
8 M* K% f; m: q1 U6 Q& h5 D( Y6 k- q
4.刪除與修改. \3 F* T3 h6 }
x 刪除游標所在該字元。2 }, g$ b P {- q7 `/ P* v3 E2 b. J
X 刪除游標所在之前一字元。
* g) c' u- i& [ dd 刪除游標所在該行。 Y% A' z1 C+ A" o
r 用接於此指令之後的字元取代(replace)游標所在字元。
2 V8 U. d- W' Q& y, [ 如: ra 將游標所在字元以 a 取代之。
# B8 L1 @! b# l/ v+ R R 進入取代狀態,直到《ESC》為止。0 Z8 _1 V! {$ c7 H0 w
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
1 h8 ?8 Z) v1 X% ^# T1 X7 V S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
* I& \; k% g5 K- d6 R D" [- e! Y5 @* j. R% t
5.搬移與複製1 N9 X5 V$ Z. M: X$ n
利用delete 及 put 指令可完成資料搬移之目的。
& J8 A: s' p$ H6 e$ ~3 I- g 利用yank 及 put 指令可完成資料複製之目的。
; r2 W3 j& b+ x0 Q yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
- {( \/ {3 d, ?6 l6 o2 l$ | 可將緩衝區內的資料複製到螢幕上。
5 K- H% ?. |3 E! v2 u7 C: H 例:
8 t* t) z" j# M1 d 搬移一行 ‧在該行執行 dd$ s2 A0 F) @$ p) Z/ b, ~7 n, U: P
‧游標移至目的地2 b$ f( i6 B2 Z6 J. T
‧執行 p
) n3 ?5 V6 D8 { 複製一行 ‧在該行執行 yy" F6 Y/ m& p6 U2 w ^# A \
‧游標移至目的地+ z$ }3 V! a- C% O2 u
‧執行 p
6 M0 [$ s0 ]" Y! w" r
) w/ l6 U+ ?; a8 A# V* [" Q/ L+ T, z6.指令重複
& K& M( Q/ g: k1 b 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n" d) _' X. ^/ O7 h6 [! W4 x
次。/ y4 h1 d2 k1 T" p7 y n5 x. s
例:
$ v2 R& d+ m7 @# b2 C 刪除10行 ‧10dd- r$ k! @1 ^, Z9 Q2 O! _
複製10行 ‧10yy% @; g/ v7 `) |& N
‧游標移至目的地
, M4 A2 l6 ^+ b9 M ‧p U% g( R* V% O! B M& T0 L* _
指標往下移10行 ‧10j
+ [) }4 O3 u4 a4 y8 r; j- v% w4 X- J. c/ r) B
7.取消前一動作(Undo)3 q8 K. K6 Z3 o9 M; }) B
即復原執行上一指令前的內容。1 T, y( }4 ]4 L/ H
u 恢復最後一個指令之前的結果。
& X: |0 X6 b( U1 G0 b U 恢復游標該行之所有改變。8 p- {' C+ e0 y$ `& A0 E( H" y5 V4 H
4 c1 b- V6 D5 W. i0 [; A- g% ^
8.搜尋, g9 t3 v' b8 K, T
在vi中可搜尋某一字串,使游標移至該處。2 O1 j; M1 t" _3 d
/字串 往游標之後尋找該字串。) e+ O8 O/ s& A
?字串 往游標之前尋找該字串。; F; Y; H0 S- j% P# P
n 往下繼續尋找下一個相同的字串。9 p& T# v" P# r( {6 V8 z
N 往上繼續尋找下一個相同的字串。
}3 z% r) S! t
3 S# v, \9 i4 H8 b& M0 C \0 m# F9.資料的連接: ~: w' y0 U+ N4 G" c* u q
J 句子的連接。將游標所在之下一行連接至游標該行的後面。; j/ l7 S/ e: b8 m6 Q
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式+ G7 @+ `3 E8 X
(可利用a、i等指令)再按《Enter》即可。5 A7 `. u8 R& s9 I& j$ T8 `9 ?
/ `1 P6 S# \2 x
10.環境的設定
! B+ I& K5 ^. X$ l9 T/ n4 Y9 c :setnu 設定資料的行號。
9 f1 z+ T7 i& d5 x$ r8 C :setnonu 取消行號設定。# d' X, ]% u; N0 u
:setai 自動內縮。0 J- N; {" O1 l4 C; @6 ^3 A8 C
:setnoai 取消自動內縮。3 [; P, \# a& J( d* p( O5 X
自動內縮(automatic indentation)
- k: ]% [6 M9 t( O" v4 r 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
# Q) U6 i4 S# l* D+ r 動內縮的功能,用下例解釋之:
0 ^" J0 C0 E6 ^6 ^* {- ] ‧vi test
5 j8 X4 ~0 \. @2 l ‧(進入編輯視窗後)
5 {3 ]* J! P1 x" q2 Y/ j this is the test for auto indent- O$ h) v! M: @) d& V
《Tab》start indent ← :set ai (設自動內縮): y4 J& b: b+ X
《Tab》data/ Q5 @; O& z) M' s0 E$ w( \ A+ t
《Tab》data* z) U' {3 D C, f, k$ T$ [
《Tab》data ← :set noai (取消自動內縮)
. W# w) H' [) m( y* F- Z8 y+ _6 T the end of auto indent.8 r/ H" W9 D5 H" @
‧註:<Ctrl><d>可刪除《Tab》字元。3 O/ w& B! G9 p |
& \; q, u$ W) B7 O9 v
11.ex指令
, p" ]( q0 n. M8 Y2 X' Y8 l/ R 讀寫資料
3 N( \' G9 V0 d* O6 @' c3 L :w 將緩衝區的資料寫入磁碟中。
7 ]6 |* `1 f" Q :10,20wtest 將第10行至第20行的資料寫入test檔案。
& l( x! D4 l7 Z( V# n :10,20w>>test 將第10行至第20行的資料加在test檔案之後。: E* C; w& E; f3 o9 ~2 p
:rtest 將test檔案的資料讀入編輯緩衝區的最後。# l% t4 e7 R" E: w c, A# n' ?
刪除、複製及搬移$ b) f" y0 A! n
:10,20d 刪除第10行至第20行的資料。0 p# }1 P. d4 ?+ x x
:10d 刪除第10行的資料。, D3 b) m' S) g# t1 R9 K
:%d 刪除整個編輯緩衝區。) J: t/ v; i# E
:10,20co30 將第10行至第20行的資料複製至第30行之後。
& k1 _! k2 i3 @& s :10,20mo30 將第10行至第20行的資料搬移至第30行之後。3 \( t; y- p* N: k% D8 g7 x, K
字串搜尋與取代: v" v% a( M+ y& z1 |8 y* h: ^4 m
s(substitute)指令可搜尋某行列範圍。
! q) O$ h: n' @' n1 R1 |8 j g(global)指令則可搜尋整個編輯緩衝區的資料。
7 H+ C9 j! R: J. H& d4 u s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條5 T( [: P9 C3 V5 l2 `/ I: C5 J
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
w: q1 C, u% Z! v" ^ :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
" [. U ?! Z, b9 Q; N6 l :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。9 e: ^7 r) h7 Y; C+ J2 F
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
! z) X8 d0 X- {( {; ]- a+ G* h
; P0 w3 s" X- A( _" f* k: J0 {; [, ~12.恢復編輯時被中斷的檔案( W+ W1 O, Z$ u
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
3 z( O' ]3 A1 b( q 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
& r$ N1 G7 I$ E$ @6 D4 L 的檔案內容。
/ e0 y/ N1 u& M5 E$ G! I8 Y %vi -r filename- e4 O6 D n' k+ c2 X- t/ W" k
' @9 I7 m4 n7 d! `2 H9 U13.編輯多個檔案0 ~- o. }; S: E X; g" I) }" g; ]
vi亦提供同時編輯多個檔案的功能,方法如下:
3 q$ R( g# M/ N$ N- j %vi file1 file2 ..
- H$ e2 \" |5 v, o! p9 E 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後' r6 L9 l/ O6 _ y; z
再利用 『:n』載入下一個檔案。0 a/ X& i z% N: J0 @+ d; E7 t
# t, h1 n5 X! \! ?, e參考:
1 r G! j& o# m3 T. k' Z5 b& ]/ L# t0 F; M" p7 m
http://chunchaichang.blogspot.tw/2010/08/vim-s.html
4 g" N1 C- \5 [9 T7 s6 b |