本帖最後由 IT_man 於 2017-5-6 23:16 編輯 # Z" _3 A2 Y7 A* [
) u8 a6 m; Y; M/ x6 k' c! j1 evi指令說明(完整版)8 a5 ~/ q: l) J- O8 k/ I
- vi 的操作模式$ a3 I! [- D, G& F8 H
, d" g# X ?* o+ F% [vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式! N f+ [ c2 N( s) ^" V# J$ z
* h- ~9 `; M. O5 \: m% i8 b0 R6 l0 r( f5 s" F
如何進入輸入模式" g8 Y) {7 S8 U6 w2 X, l
a (append) 由游標之後加入資料。) B+ o& r8 W0 h( x3 D0 ~+ g' {
A 由該行之末加入資料。7 ]7 D5 M/ B0 y
i (insert) 由游標之前加入資料。6 ?; U0 X8 I# ~0 r
I 由該行之首加入資料。5 G7 T9 C- L: `: j5 P- y. {1 V
o (open) 新增一行於該行之下供輸入資料之用。5 g! Y/ t6 t7 ?6 z
O 新增一行於該行之上供輸入資料之用。- T7 P7 D) W5 q6 o2 L" \* t8 M
如何離開輸入模式4 D6 C! v1 K0 c
《ESC》 結束輸入模式。! m/ X! s- U: C' c+ Z: I, f3 Z7 `! @2 y
- 指令模式5 D9 w( J/ \1 N [0 @( @2 J
9 A9 p) _( V( w4 L2 d
1.游標之移動
9 O5 ?! r6 b3 B$ ^- | h 向左移一個字元。+ b2 M" s& S; H8 O \3 U) W' \
j 向上移一個字元。# c, ~# Q7 i' G+ i
k 向下移一個字元。! Y3 m) A9 T2 x
l 向右移一個字元。
r# [. B' g1 w9 ^$ |/ J G/ F 0 移至該行之首
7 f; q- a+ k; C3 @6 `, j2 V $ 移至該行之末。1 G& H6 j+ E% L3 n# I2 p+ L
^ 移至該行的第一個字元處。, i, i: @8 ~; V
H 移至視窗的第一列。
# o" U$ n/ ?/ h5 T M 移至視窗的中間那列。
& D+ `- Z: @6 q+ V9 p& h L 移至視窗的最後一列。/ @3 _8 h' L( d# ` S& N
G 移至該檔案的最後一列。
7 C# q. q% e: b6 S + 移至下一列的第一個字元處。
6 d; v; P; J9 K1 Q" \# a - 移至上一列的第一個字元處。
( Q8 y) f: l* A5 E( `) U ( 移至該句之首。 (註一)9 M N U( }0 t* r3 t( i0 Z
) 移至該句之末。: c8 v e& B1 u- U j9 q
{ 移至該段落之首。 (註二)8 H2 Y' G' q. |1 Q/ {: P
} 移至該段落之末。
" P: d! e$ o# q9 y& k; N! U5 X) g& w' b nG 移至該檔案的第 n 列。
, `) n4 J. q" W _ n, u n+ 移至游標所在位置之後的第 n 列。8 I- L, Z. W- O! m: N K! {
n- 移至游標所在位置之前的第 n 列。 M8 M% N% B5 w" H8 k- z M
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
; \/ f+ x$ T# \/ { 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。( d& }2 \8 v# f" f }: T
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
8 Y7 t0 W2 J. H4 e/ n, J3 U
; |: y1 j+ n: B0 G- q% Z2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。' D" |* {8 y7 ~# Z$ }0 ?. R) w4 m& Z
<Ctrl><b> 視窗往上捲一頁。
7 y2 T$ u) J6 P" B+ L <Ctrl><d> 視窗往下捲半頁。1 I- c+ S2 c! a
<Ctrl><u> 視窗往上捲半頁。 b5 c5 ]& p0 x( u/ f
<Ctrl><e> 視窗往下捲一行。
c1 B5 y& ^3 R' V <Ctrl><y> 視窗往上捲一行。
9 k% U# w! `, \* t
( `. M# v0 A8 L4 b3.刪除、複製及修改指令介紹 (此單元較少使用) I- F8 ]/ P; R8 X& V" U- o8 b+ k
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:3 b4 T7 @2 W# k0 l2 T% m
Operator + Scope = command
. |1 }# n! A! ~3 Q. c- a# W9 { (運算子) (範圍)
; U4 {8 g2 y( |& Y7 m6 J, s 運算子:
% o8 [$ f( \ d# @ d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
+ }3 x8 l3 ^. | y 將資料(字組、行列、句子或段落)複製到緩衝區。8 {) d3 L. d4 }( P; S" y* Z# W
p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資5 e) @0 G c& f
料放置於游標所在位置之行列下。' k2 l. {. S0 t; m
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句) Q& a6 b% a: K. D
子等之資料,並插入新鍵資料。# M; R) Z; `) V; Z
範圍:
/ Y+ M; X0 F) l, D e 由游標所在位置至該字串的最後一個字元。
4 B; V; Q* c7 z w 由游標所在位置至下一個字串的第一個字元。( h; K5 [; B; W
b 由游標所在位置至前一個字串的第一個字元。0 v" Z5 X1 a v$ O, T. k" s
$ 由游標所在位置至該行的最後一個字元。
1 Z3 H$ I0 g0 w' V& r- m 0 由游標所在位置至該行的第一個字元。+ j6 |2 \: ?/ S& r- K% t" Q
) 由游標所在位置至下一個句子的第一個字元。
) m2 b+ I: a7 |; A, O7 \" G, x ( 由游標所在位置至該句子的第一個字元。
; i' X7 d! a% c0 j3 r+ g { 由游標所在位置至該段落的最後一個字元。
) }8 o; m2 y; o! e% X& |( ? } 由游標所在位置至該段落的第一個字元。
$ x2 t7 h$ F) `5 R9 ~ e 整行動作
P& _9 u1 M1 r8 K5 `9 n dd 刪除整行。
; t/ m/ Z& h0 A, v* y/ H1 y1 ? D 以行為單位,刪除游標後之所有字元。1 ^) I) ~; A/ G: y7 B( C- }
cc 修改整行的內容。
' [+ M/ y0 Y0 I4 ~9 G, @ yy yank整行,使游標所在該行複製到記憶體緩衝區。
) C# V5 `# s+ ^# Q2 M3 k7 k$ J
0 k- p3 y1 Y1 e4.刪除與修改7 U3 j# ^! i. H4 b/ D( T+ I) ^- A
x 刪除游標所在該字元。9 y6 N* c0 e) A! o
X 刪除游標所在之前一字元。
- Q( c) M- q$ k% W3 ~ dd 刪除游標所在該行。
% F7 r: k' f) K0 }3 K9 T, f, D r 用接於此指令之後的字元取代(replace)游標所在字元。
$ o! @) s# S' M* ?" ~ 如: ra 將游標所在字元以 a 取代之。
7 {; O: z. {4 v. V) V R 進入取代狀態,直到《ESC》為止。; i. q( o& S3 c1 u! U
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
T% k" |) C3 s8 z6 V. N S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。
I3 P! l# p( e$ P& K# N
1 G+ A, s; k/ r! M8 s# d( t3 x5.搬移與複製0 M* Y# b. c' ?. R
利用delete 及 put 指令可完成資料搬移之目的。$ V. T2 O- V, Y" ]
利用yank 及 put 指令可完成資料複製之目的。2 |! |# I' T* y8 }' g! ~
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令
" K& K0 z# A+ |. Q 可將緩衝區內的資料複製到螢幕上。
) ?& |( c2 V7 L; |$ b 例:' {. Q( n" O; f/ J% {2 {. @* c. T8 _' d
搬移一行 ‧在該行執行 dd
8 g6 G! s g, R# ?* V. Z) V ‧游標移至目的地
! O3 b3 _. L( l J# ?) v/ f ‧執行 p
8 E$ d& Z% X( X0 V 複製一行 ‧在該行執行 yy
4 `; o+ {- O& ?9 j0 U1 ^9 o5 ` ‧游標移至目的地6 ^. d4 o2 G% e9 b e3 z
‧執行 p
) v( b7 C$ b: B* q2 H2 G! w. D B9 U [* j1 w5 n8 f
6.指令重複! Y& l5 n% p0 P* a2 B' T: q
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
3 U! ~" L# h: L: n( z3 K 次。9 x( o* W2 ?$ C% x$ c& I2 v
例:
v5 W" e! X- Y9 C 刪除10行 ‧10dd
) @1 q- e, @2 h. H' k 複製10行 ‧10yy# x6 u3 `# @6 V7 q* S/ k. J# h
‧游標移至目的地
: s. G2 M2 Q6 d5 k" H. h( e ‧p
/ E; f5 m8 x( ?0 \! W5 S 指標往下移10行 ‧10j7 c1 |3 j/ ?/ ~, }5 b! k
& w- [" s! j# d$ d/ ~; F: |7.取消前一動作(Undo)* C& l ` K. S7 Z
即復原執行上一指令前的內容。
1 t% Q2 \) ]; Y% G. A: y" u u 恢復最後一個指令之前的結果。( k( [. b A0 ~, @; _# O' i
U 恢復游標該行之所有改變。* h) C1 u( O( Y( @
) n8 H4 r! c" l+ N4 K8.搜尋1 `; y1 ~: D F8 b$ f
在vi中可搜尋某一字串,使游標移至該處。: C% I6 S5 |( a [3 \) B3 E
/字串 往游標之後尋找該字串。
! q& s4 c$ ?; M2 H1 Q- _ ?字串 往游標之前尋找該字串。- X) F r9 h, L$ i) T% H
n 往下繼續尋找下一個相同的字串。
5 }; q+ m" K! A. x, C N 往上繼續尋找下一個相同的字串。
3 `9 w% t$ q- i$ n* S2 a$ s6 e- }+ l0 | `5 c+ {
9.資料的連接# v1 M( P1 V2 ]9 `
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
4 L5 _4 x7 q9 Q% H( f 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式$ _. d" f5 b) p
(可利用a、i等指令)再按《Enter》即可。
6 d9 G6 @/ ?7 j0 b0 M
+ e/ i% j4 w' N9 e3 G% n10.環境的設定. w1 F" G4 e% R2 _
:setnu 設定資料的行號。
8 m t6 z& `9 W% [6 c9 E0 \: f :setnonu 取消行號設定。
, D. m9 E. M% W+ R5 c. R. m/ \ :setai 自動內縮。
" A( W- z( H) f5 H* U% e :setnoai 取消自動內縮。
% X6 z; k1 c* t9 H% T, U1 T 自動內縮(automatic indentation), T' [% x! d9 H# p& S8 c8 N/ e
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自8 L% [* @- a. B$ X4 S
動內縮的功能,用下例解釋之:
: |2 f/ ^, X: L6 y9 y2 b$ H ‧vi test# L9 r6 p$ y' z
‧(進入編輯視窗後)
: ~( S* w7 F6 |! o, n this is the test for auto indent; i0 _ F+ D, e2 e# P; Z
《Tab》start indent ← :set ai (設自動內縮)
* R8 v( D, z9 L 《Tab》data% J" x: P6 \6 q
《Tab》data
6 h! O V6 Z" S! h2 E/ b% ]5 m Z 《Tab》data ← :set noai (取消自動內縮)
% ~, p5 M9 k" Y6 _" e+ F0 t the end of auto indent.$ F. e7 F, t1 `7 p- q5 G( e
‧註:<Ctrl><d>可刪除《Tab》字元。: ~# {9 U+ N9 h: d
1 y/ s+ Z% d. W* O
11.ex指令
+ ?' r3 t3 }& L 讀寫資料# f; A* Q4 Q- V9 w( j4 c' q
:w 將緩衝區的資料寫入磁碟中。6 z6 Q3 ^9 _# e/ O' R- P
:10,20wtest 將第10行至第20行的資料寫入test檔案。
* L0 }0 D% [8 e' ]& c; c# }* n# ` :10,20w>>test 將第10行至第20行的資料加在test檔案之後。
4 b1 H% e5 P, w& }. p :rtest 將test檔案的資料讀入編輯緩衝區的最後。5 Q2 `4 a/ H/ J& Z' [0 J% Q l& n& I
刪除、複製及搬移4 X8 |; e: `) @8 k
:10,20d 刪除第10行至第20行的資料。
' k7 `: u1 U3 A6 s :10d 刪除第10行的資料。
: q: E8 d# j7 r5 N# z, m# _ :%d 刪除整個編輯緩衝區。( `$ Q$ \ F4 A
:10,20co30 將第10行至第20行的資料複製至第30行之後。) r( Y, T. A$ M% u# C3 x
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。$ Y; Y9 c% V4 Y0 _% R) N
字串搜尋與取代
. f8 F+ R, b' d s(substitute)指令可搜尋某行列範圍。
2 T, O. u& }. _) u( } g(global)指令則可搜尋整個編輯緩衝區的資料。8 N% { c& v8 ^# V v! Y$ l) ]
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
5 u( V9 H u; n$ ~6 @" c3 I2 A3 Q 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
8 K# V+ Z. X. {7 H :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
+ o$ D1 B9 Y* f* i" O :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。. d+ a9 j- L- {& G, C) G6 M( Z4 `! Y7 b
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。# S8 X& _9 R1 F
; r; B2 P% x' q8 v1 K12.恢復編輯時被中斷的檔案
0 f9 I, `& K. k" E, l 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
& X6 [8 X |: ~ 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
7 ]8 {1 P7 t* E& Q$ S 的檔案內容。( y( j! `1 I1 Y J
%vi -r filename
" u. ^2 n; ?/ a! k; W
& I) k8 s/ P. Q1 k7 [13.編輯多個檔案
3 O- s6 g# R4 f, k: [0 Z: i+ r ` vi亦提供同時編輯多個檔案的功能,方法如下:: K, P( q+ h4 N3 c8 ?. B
%vi file1 file2 ..
1 @# ^9 z$ ^' T, J+ L" w; p4 u 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後' B8 u5 ^6 P9 h
再利用 『:n』載入下一個檔案。
T; N8 [8 b3 G+ T
' v, u5 o. @9 d5 W參考:
9 s3 Q, ^: @- v4 |# s
4 [+ C$ W# B2 n- E) u. Y' V& dhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html. @" n4 s* h, ^7 f) i5 q
|
|