tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 : e5 u8 Q! V1 Y. [) n& ?
1 k; ]( Y1 @: D8 g v. k
vi指令說明(完整版)
2 K: _0 S B6 u6 f: P ` - K7 `6 k9 |' x7 h$ {0 ^7 @- ?/ Y1 Y
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
/ e% J- {2 w# n; v) r+ D
5 U$ H, t0 {% e2 ]3 m 如何進入輸入模式
( L# a. e9 }$ u1 K/ k1 w# s a (append) 由游標之後加入資料。
9 ?! i+ t# n- u2 ]6 M A 由該行之末加入資料。
8 q8 g1 Y% _) K i (insert) 由游標之前加入資料。; r2 \) L0 Y7 M+ _7 c3 G4 u. |2 g
I 由該行之首加入資料。5 G# ^9 p. C6 d* A, N
o (open) 新增一行於該行之下供輸入資料之用。
0 ^! x4 l7 r# p O 新增一行於該行之上供輸入資料之用。
$ D- I' e) q( }( r2 z6 r 如何離開輸入模式
! ], Z' ~! B3 e$ f 《ESC》 結束輸入模式。
Y, k- J% U* J; M8 F: _- 指令模式
/ X Q$ ?/ C I' n' V6 C( u1 s* z( q1 D4 a
H! f5 L. B0 u+ J, q
1.游標之移動' ?! k' C+ w4 m: S$ |
h 向左移一個字元。3 Q4 j3 P' g0 N
j 向上移一個字元。) X& k# T# I: I7 C x- E( o
k 向下移一個字元。3 ^" K$ f3 k3 F( d O3 t1 ^: V- A7 }
l 向右移一個字元。' _/ Z& @0 C j) ]
0 移至該行之首
2 r. m& U, M; B5 G $ 移至該行之末。2 ~% v. O& t" ?8 d$ Y
^ 移至該行的第一個字元處。
& B( p+ C$ s. U/ N H 移至視窗的第一列。
8 H3 I( w3 _/ m# C3 U8 L6 @; a" i M 移至視窗的中間那列。' ?0 A4 [& e" D+ ^
L 移至視窗的最後一列。. i! e$ I2 V# {9 B
G 移至該檔案的最後一列。
: d1 V1 Z& F0 y& P. x9 H! J + 移至下一列的第一個字元處。
$ a. o; T! {8 F3 T$ ~ - 移至上一列的第一個字元處。2 V b* `8 j/ u/ X, h0 m
( 移至該句之首。 (註一)
{# E& U1 }+ W: W& b5 S6 r ) 移至該句之末。- K9 t/ m2 m. }* a" r* y- X9 [
{ 移至該段落之首。 (註二)* i+ a; T; V: o3 Q
} 移至該段落之末。1 o! }1 b. @# t9 g
nG 移至該檔案的第 n 列。
% D5 @. N4 O7 |, U- n- s1 e" |5 [ n+ 移至游標所在位置之後的第 n 列。* v$ t2 V; w* q$ |" a
n- 移至游標所在位置之前的第 n 列。1 m5 |' }$ _: Y
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。! e3 Y1 O% E6 v ?
註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
0 h1 K! `: `- v1 ^ 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
9 g/ w& \6 X1 x9 ^) z3 a& A9 p# }2 {3 C8 g C/ U
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
: X9 T E9 S: N" t# u <Ctrl><b> 視窗往上捲一頁。. z) x8 a/ s% X n/ T1 |
<Ctrl><d> 視窗往下捲半頁。0 K1 ?1 r) q# _) z/ `
<Ctrl><u> 視窗往上捲半頁。
; P! r) H# {5 r$ R <Ctrl><e> 視窗往下捲一行。& n. L! {7 e: z% g9 v
<Ctrl><y> 視窗往上捲一行。. e+ T3 g2 T* B- a
) |- u' M8 X2 E
3.刪除、複製及修改指令介紹 (此單元較少使用)/ P3 }' i6 T& d5 @+ c5 k; F9 V" h
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
* d$ v/ y9 x1 a1 e( k( i& f/ S Operator + Scope = command
& B' `7 X* m* e# o- U: k9 Y$ { (運算子) (範圍)7 s7 ]. z# `' }+ o. f# n- o" Q
運算子:
* b" K# N- q4 j% u, M) | d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。9 R) Z: P! O* M5 G, ]( T7 ]% i6 g
y 將資料(字組、行列、句子或段落)複製到緩衝區。. H- X* Z7 C3 t4 e! Z; n1 f
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資' l4 x6 B' C) F1 k
料放置於游標所在位置之行列下。
9 c/ Y) R5 H: H c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
4 n. k; k* i0 B. v) W0 s; N+ E 子等之資料,並插入新鍵資料。. M7 S, \ w& O/ m) `
範圍:+ G7 W; i; E! ^& h; N
e 由游標所在位置至該字串的最後一個字元。$ |- E8 A2 x% p, y4 H" v- N
w 由游標所在位置至下一個字串的第一個字元。( o: r7 K: ?0 Y) `6 s& d9 K2 V
b 由游標所在位置至前一個字串的第一個字元。
: x N. c8 V `) Z7 Y' V F $ 由游標所在位置至該行的最後一個字元。
- w& [! K7 ?* y9 t7 c5 F( R6 K0 [, B 0 由游標所在位置至該行的第一個字元。
9 U ?6 J6 A( q0 g ) 由游標所在位置至下一個句子的第一個字元。
# G3 E, T# c9 _4 K' f& a( g ( 由游標所在位置至該句子的第一個字元。
. J9 ]2 |% G, v3 w2 a { 由游標所在位置至該段落的最後一個字元。; T% N8 u) V$ T4 h8 @7 G# W
} 由游標所在位置至該段落的第一個字元。
. N" ~0 r+ P' M. X 整行動作3 l' ~* m8 v0 d% h4 t
dd 刪除整行。
% a& u/ B* @9 D; g8 }' _- A t D 以行為單位,刪除游標後之所有字元。0 ?8 V$ w8 l$ w3 u1 X
cc 修改整行的內容。
* y) q; D0 \% x6 S" S5 m yy yank整行,使游標所在該行複製到記憶體緩衝區。
; ?+ p' |6 D$ Y' @. p ]
( [9 v/ F4 E8 Z6 _0 Q4.刪除與修改
3 q& Z) |9 T9 m6 Z x 刪除游標所在該字元。$ a) d& O& J6 z0 i9 I
X 刪除游標所在之前一字元。
+ u" F) [! F0 L- f0 _) _ b' N p& b dd 刪除游標所在該行。
% R; d3 C9 q6 ]2 P- Z0 e r 用接於此指令之後的字元取代(replace)游標所在字元。- Y/ \: z }1 q
如: ra 將游標所在字元以 a 取代之。
) O, M- z0 |: x% ^3 B9 [" F R 進入取代狀態,直到《ESC》為止。
7 \9 x! O, x) {2 g s 刪除游標所在之字元,並進入輸入模式直到《ESC》。1 {) W6 E& t1 ?
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
5 @. C* h/ S. t8 f# q# f8 w+ l
2 P: ^- v7 R) D: d5.搬移與複製, ~) G6 x; L3 f* ~# E
利用delete 及 put 指令可完成資料搬移之目的。
* M( E" N2 r1 z! s 利用yank 及 put 指令可完成資料複製之目的。
/ s# T, o9 s+ b; ?' A yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
$ G1 R) X9 N2 J# [8 G3 ]* w9 p; J 可將緩衝區內的資料複製到螢幕上。' d1 a2 S, t0 Z
例:" s3 t0 j' v8 G2 R
搬移一行 ‧在該行執行 dd
3 B1 B' ^% f/ P+ ? ‧游標移至目的地
* D0 G8 I, y0 z- N ‧執行 p0 Z7 u7 b, l% } I
複製一行 ‧在該行執行 yy
9 y3 Y4 `1 W! @$ Z1 I+ J( z) Q0 \ ‧游標移至目的地
! @! S+ V/ i8 Y+ W6 ^ ‧執行 p& }. | O' o$ U0 p
- Z" A! C0 _0 w4 J6.指令重複
* |3 e1 _* t* q0 d m) ^ 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n7 Y1 B8 h6 u$ j) V3 K# }
次。8 w, t$ S) @6 i |. o8 E/ G3 @
例:
/ n/ F& X' X4 t& E1 ]2 [ 刪除10行 ‧10dd
" J7 b4 T- g% U; N 複製10行 ‧10yy, F1 _2 _5 K) B( m: C# I
‧游標移至目的地
" M" i0 }2 a5 U2 p& s: p ‧p# m& @# m2 ]4 x4 v
指標往下移10行 ‧10j
8 O* U8 h5 b. L5 _3 w8 z- ]; T+ G7 [$ P( m `$ L
7.取消前一動作(Undo)
* k2 D' m( l* C; o, e& h 即復原執行上一指令前的內容。
% n9 X7 x+ `) N4 B. \ u 恢復最後一個指令之前的結果。
. X8 U; U A X5 o- m& R8 C; `6 d. t U 恢復游標該行之所有改變。
& b2 G, U6 r6 C n% o6 ]# I9 D5 r; H; k% c; C
8.搜尋* s* Q) D: `" W& f; S
在vi中可搜尋某一字串,使游標移至該處。6 L) V2 k! k; ~# k( L) U7 v
/字串 往游標之後尋找該字串。% {9 L( Q; J# w- V1 C/ Y
?字串 往游標之前尋找該字串。6 l( S& `- U1 \$ w3 Q8 Z7 F# K
n 往下繼續尋找下一個相同的字串。
2 e, }/ `; u6 j0 k/ p$ P# h* | N 往上繼續尋找下一個相同的字串。
* ^0 ?. V6 h: W& U ]# {6 `
$ S7 S. D& l- }, h* R, y1 |9.資料的連接
+ c3 |+ m9 j* |3 K% A J 句子的連接。將游標所在之下一行連接至游標該行的後面。$ L) ~0 \. J( q/ n
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
/ G3 q0 I7 t, I (可利用a、i等指令)再按《Enter》即可。
$ P; [ V" S$ c4 i$ K0 P# a g' C# O6 s# P) g
10.環境的設定
$ s0 E6 c, V7 x T( C :setnu 設定資料的行號。
5 |# f; R5 b' B9 w4 b9 x :setnonu 取消行號設定。, H/ r; K2 F) A3 b
:setai 自動內縮。% L2 t" U# e; P5 S
:setnoai 取消自動內縮。2 G7 z8 D9 T2 i6 K& N
自動內縮(automatic indentation)! n& K1 e2 m2 T/ p$ p5 X
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
& x. c# s* |1 @& V 動內縮的功能,用下例解釋之:- `+ A5 M" z$ E8 A
‧vi test
5 j% g8 Q% P- W- g) W ‧(進入編輯視窗後)
( S4 P1 Q9 g+ ~& }$ d9 x this is the test for auto indent5 g8 c+ u5 _+ }4 v1 r& C
《Tab》start indent ← :set ai (設自動內縮)
% I1 T2 w- _9 W, W, ` 《Tab》data
6 s9 K8 c( F8 F" Z1 v1 i 《Tab》data
h3 c5 {% {- b* L 《Tab》data ← :set noai (取消自動內縮)/ N9 d& O4 R/ M$ g* x6 E
the end of auto indent.
: A) r7 i# e6 m k1 D ‧註:<Ctrl><d>可刪除《Tab》字元。2 r) u. c, l- u; A! ~
3 P/ ]( L; c8 s% ^) B
11.ex指令" G. {' V2 A* d4 I- ]$ B
讀寫資料
4 T# `5 ~0 r1 `1 M# s& n. R0 l- d5 h :w 將緩衝區的資料寫入磁碟中。 B8 x5 ]' w7 \& O* `* S$ C
:10,20wtest 將第10行至第20行的資料寫入test檔案。) X% P, H+ M, @$ t( H: F
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。
$ P7 [6 p3 A2 ~- Z) Z :rtest 將test檔案的資料讀入編輯緩衝區的最後。
0 o1 x* @2 X' `0 t 刪除、複製及搬移9 u7 c0 E1 l. N+ D2 {
:10,20d 刪除第10行至第20行的資料。0 S" H9 v5 ^1 t, a
:10d 刪除第10行的資料。! [( a# r# v* q8 ~/ y
:%d 刪除整個編輯緩衝區。1 Q) B) |1 U3 }+ S0 m7 j
:10,20co30 將第10行至第20行的資料複製至第30行之後。" Q2 b; m# k4 g/ i6 p0 ~
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
5 T+ U" I- k2 ^& L; n 字串搜尋與取代
/ p( }/ s. e8 }" M s(substitute)指令可搜尋某行列範圍。
' ^% k6 I% ?+ S8 b g(global)指令則可搜尋整個編輯緩衝區的資料。
) `* z( R6 U! [8 B1 l) I% w+ B s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
0 F0 b8 @8 }+ e+ Y2 S 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
P6 g$ N" B# J, L :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
2 O+ F% y- ?2 i3 x5 T" t :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
]* t* w* C/ O! @ :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。" a/ T/ b( Y: V) [$ X+ Y
! h/ p) Q2 x5 j, b* ~9 T# _+ j12.恢復編輯時被中斷的檔案
, K6 S) Y2 c( T# i2 E1 K# l2 h. R 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
}. ~7 b" w% e' L+ |- z: u/ [ A: j4 ] 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前. ?/ D3 E4 q# V* B1 j9 _8 D
的檔案內容。
; P' ~1 K+ E# k7 N %vi -r filename0 i( @0 @# Q7 H2 r
: g8 I) J, a3 R13.編輯多個檔案
2 o8 Y8 B7 M- z" P vi亦提供同時編輯多個檔案的功能,方法如下:
Q4 G! _- l7 e; y5 C0 s( o# K %vi file1 file2 ..& E, ^7 W8 [* z! ~1 }- V
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
% ~2 f& t/ W/ g- ~ 再利用 『:n』載入下一個檔案。
: m; s0 z* k( ~* P z' O4 | r5 W h( b, c
參考:" t$ ^ C; O3 ?% [" f3 ?9 w% K( V* Q
$ @5 J r2 r+ i8 \# v6 N4 I
http://chunchaichang.blogspot.tw/2010/08/vim-s.html/ H9 Z) ]6 ?% C+ i! {/ A, `5 B
|