tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 5 W H. j- R9 ^3 u
9 f' u* Y$ I$ D( m. W9 O" Avi指令說明(完整版); s8 X. f/ P; h: e! P
- vi 的操作模式6 ~/ U: J* Z" Y& G9 \! r
# r. |- {2 t, c; \. \ ~' i8 Mvi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式
) ]8 [6 o3 f) Z6 q4 m- x* q
$ U. T0 }4 ^' o# X
如何進入輸入模式5 R9 U, I; l# E; ]
a (append) 由游標之後加入資料。
& x5 @0 F' ]$ M2 F A 由該行之末加入資料。
2 L5 H4 o# X! y4 Y3 l6 }2 o i (insert) 由游標之前加入資料。& f2 C1 o: Z1 a
I 由該行之首加入資料。+ e3 r. j( J& p& v# @' G ~$ m
o (open) 新增一行於該行之下供輸入資料之用。3 \/ z% Z. |! L' M3 `
O 新增一行於該行之上供輸入資料之用。+ M+ ?8 e& v' W, D/ x0 V
如何離開輸入模式- d! Y9 D; v3 e: k3 O
《ESC》 結束輸入模式。3 h7 Y' F0 H9 ?- o/ w+ e4 [5 F
- 指令模式
$ X: H! y0 Y- t$ m0 V! Y
0 W! m' A2 Q! h q$ m
1.游標之移動
3 g; F: S" @# R1 J" f8 l. G h 向左移一個字元。+ Y9 [4 T E& H& c+ g$ |4 X
j 向上移一個字元。
( i/ e3 Q, y8 s1 T1 E+ N2 G k 向下移一個字元。
. |5 ~& q- D% l) \: L7 N l 向右移一個字元。0 A) Z( k) l0 I7 X& G
0 移至該行之首/ [' P& j/ N& L% j# [8 T
$ 移至該行之末。3 m9 W. g$ X" R- i
^ 移至該行的第一個字元處。5 g0 V5 B( b- t, T E2 q- g
H 移至視窗的第一列。9 w3 r# P/ a8 `& x" }0 x& R
M 移至視窗的中間那列。) r9 ^* G( h3 r- G7 s
L 移至視窗的最後一列。! ?4 U% m6 E1 D' g& O: W
G 移至該檔案的最後一列。4 o3 p7 D) z' Y% {9 d" u6 h4 M
+ 移至下一列的第一個字元處。
* ]$ m; }+ Z3 E" { - 移至上一列的第一個字元處。
0 v! q$ l, f5 O- G$ J" y ( 移至該句之首。 (註一)- d8 f0 p/ w2 J. H( K' F
) 移至該句之末。$ K6 u0 R+ i5 G% k0 d; l
{ 移至該段落之首。 (註二)
' R9 q. G' b# L6 K- S3 o } 移至該段落之末。
- {7 I1 j% B- s+ @. k2 `2 m% S; h nG 移至該檔案的第 n 列。
4 ?5 c; T1 {) A n+ 移至游標所在位置之後的第 n 列。
# q8 e# }- q7 i; ~$ n! [ i3 U n- 移至游標所在位置之前的第 n 列。( U, p" y3 A4 ?. Q0 j
<Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
" ^ C8 Q, A- Z$ J% b 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。/ n$ l# T! o& Y: U0 T
註二:段落(paragraph)在vi中是指以空白行隔開的文字。
8 e0 r: d* }, A/ l+ s; u; u. f/ {2 p% A1 a
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
3 _( `- h* C4 S <Ctrl><b> 視窗往上捲一頁。
; m0 k. E' a: Z; @ <Ctrl><d> 視窗往下捲半頁。% o4 V' @/ `) K$ N3 v) ?, T: D, ~
<Ctrl><u> 視窗往上捲半頁。* e9 k: f$ C5 G: N+ M- Z% ~
<Ctrl><e> 視窗往下捲一行。
9 T5 }8 f5 u7 x( Y <Ctrl><y> 視窗往上捲一行。
' u ]0 j* k0 ~5 `* _1 h7 B" B/ n
3.刪除、複製及修改指令介紹 (此單元較少使用)
4 q% x5 T; C2 b+ T d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
0 _4 J: P! V' B% |# ~ Operator + Scope = command0 a: I3 \& q, I8 g4 [! a( H0 j
(運算子) (範圍)
: g, b s" u! f0 C# L: H 運算子:
; F/ C8 b& J% V" J* L* y7 B d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
! \: k2 j; l% e% M1 _& r y 將資料(字組、行列、句子或段落)複製到緩衝區。
z2 X- b. {" i T p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
) G4 M q+ {$ I 料放置於游標所在位置之行列下。3 d6 o" R5 M. {# C
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
8 l# T3 D8 I& H% s7 p% T0 }$ d& [ 子等之資料,並插入新鍵資料。, g* Z8 G( o3 Y1 f% u0 ~
範圍:
% m6 Q% B, X/ Y2 }& j7 l* x- h% h9 w e 由游標所在位置至該字串的最後一個字元。0 y, B u! Q2 R( O# z+ w
w 由游標所在位置至下一個字串的第一個字元。
9 e' ~2 G; {+ z$ B( v0 v9 X b 由游標所在位置至前一個字串的第一個字元。
0 t& |4 L& b7 m9 {" k( y $ 由游標所在位置至該行的最後一個字元。- A; p) j6 ?1 V
0 由游標所在位置至該行的第一個字元。
9 e M. Y, F ]& A1 X" Q( y" `+ A ) 由游標所在位置至下一個句子的第一個字元。
0 O2 T2 j; r- X) K. V! a5 M8 X4 @ ( 由游標所在位置至該句子的第一個字元。
/ z) |3 W4 A6 Y7 P# T2 ` { 由游標所在位置至該段落的最後一個字元。
7 F9 T. @. A/ W } 由游標所在位置至該段落的第一個字元。
8 D8 `# j5 T5 J4 e! P 整行動作$ i u8 ]' E4 h' k' Y
dd 刪除整行。
, D7 M% r# X% x+ o6 u D 以行為單位,刪除游標後之所有字元。+ k/ R1 X! `$ T/ g4 S
cc 修改整行的內容。
. I3 n \/ t& p! w0 J$ t yy yank整行,使游標所在該行複製到記憶體緩衝區。
2 \% M6 d: ~9 l( D
4 y% n1 D6 L8 q' \% j4.刪除與修改
: O5 m. x2 M R x 刪除游標所在該字元。( w3 [/ M' u& _0 O0 z9 B8 w/ W7 [
X 刪除游標所在之前一字元。
1 K, C) v2 b1 C( @. g9 A dd 刪除游標所在該行。
, _* p' y& e% \' q+ O$ d' c r 用接於此指令之後的字元取代(replace)游標所在字元。% l: b6 }6 a6 U& T \
如: ra 將游標所在字元以 a 取代之。
2 \3 ?! k9 l! R& d" v, Q R 進入取代狀態,直到《ESC》為止。
8 e0 {& H! Y/ c s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
2 r: Q/ y% y4 P7 s5 I S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。0 b4 S7 H% z4 d* }, G X
2 w, p8 D* M& F" I8 }1 |( h
5.搬移與複製* w/ g1 @0 N U$ M* z+ ]
利用delete 及 put 指令可完成資料搬移之目的。
* h5 |" e3 Z1 E; M* [4 K i 利用yank 及 put 指令可完成資料複製之目的。
; \/ F5 T0 @3 s0 L7 L yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令: _ w9 N& e# v. _! y
可將緩衝區內的資料複製到螢幕上。
% ^9 e3 L& l) l5 N; e4 P 例:
. H9 F6 U% @9 d' }5 i 搬移一行 ‧在該行執行 dd- e# j7 @3 e4 ^4 N+ @1 w& M
‧游標移至目的地% u- V6 u4 ?' w1 G( ^9 q: l% ?
‧執行 p
; y6 ^7 [6 s- W 複製一行 ‧在該行執行 yy
5 |7 \ p1 x! i1 u, b5 J8 ]4 M/ Q" G; D ‧游標移至目的地
" ^1 |0 ]5 n( @6 P& A ‧執行 p
9 r$ c+ L% o! x2 C& z% j
' E& q2 Z, ^) J& g6.指令重複0 n- n0 n! {/ _* }0 ~) M0 z
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
! z6 F* S8 V4 y7 F. Z! j 次。
. x5 i9 p; E$ ~% x 例:
. b# b, |( t* ~+ w 刪除10行 ‧10dd
8 x# d# `" d) Q 複製10行 ‧10yy
6 j) F6 P5 s0 _ ‧游標移至目的地
3 w- h3 O' p, Z8 z ‧p
' w& l/ F: T7 g5 @3 Y8 u 指標往下移10行 ‧10j& l: b: c3 t2 K r4 p
* Y' `: {3 Z# ^9 D* M G7.取消前一動作(Undo)
; e$ T7 d$ q; {) |2 a 即復原執行上一指令前的內容。
1 N) P8 m4 t0 j: a u 恢復最後一個指令之前的結果。
4 ?. \( i, y+ \5 G, o U 恢復游標該行之所有改變。0 T! r B. S3 G* ?9 s$ ]
6 g) m# Y( L. i. A o$ @' V8.搜尋- y: c; c; Y: w
在vi中可搜尋某一字串,使游標移至該處。
4 s: |$ F0 o9 h. j+ h /字串 往游標之後尋找該字串。# n' z% ~) H3 c7 A# n7 m/ K! m( v
?字串 往游標之前尋找該字串。
/ t+ s+ i+ t1 q! l3 d p6 B n 往下繼續尋找下一個相同的字串。
4 ^/ ]& Y' I+ K N 往上繼續尋找下一個相同的字串。. N' f6 q8 I' q8 w# O, ]( \
+ b; o3 {( D% o; N& b) e. @
9.資料的連接 v6 @, ?: y `2 X( P
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
X2 g7 E4 B# d$ F& Z 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式+ b' R1 D+ c7 ^+ m5 S& t5 b# z
(可利用a、i等指令)再按《Enter》即可。- [! U4 c. ^) ?. c( A
- V7 C8 i% D' {4 s l# V7 l
10.環境的設定
9 L* S p- w) Y9 D :setnu 設定資料的行號。
. B9 }1 y- b' f# e( u# t' _) m8 H. E+ M :setnonu 取消行號設定。
4 k' T' ~" U6 {) v8 G7 R7 v% y :setai 自動內縮。: E' |( T# A7 F/ w* G( }9 Q, f
:setnoai 取消自動內縮。4 p- P5 P$ X4 p$ \
自動內縮(automatic indentation)
$ B; ?0 p7 | A 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自
/ z; a- D& k0 I* u- b 動內縮的功能,用下例解釋之:: b# M" K7 }# t( ?
‧vi test( L* L/ }2 L1 J) X+ @+ b
‧(進入編輯視窗後)4 m6 J- q. _ Z9 w
this is the test for auto indent
g$ ^; z7 [& s5 i6 f. a I 《Tab》start indent ← :set ai (設自動內縮)
+ y/ | D, J& \$ d6 w+ J! t 《Tab》data
4 {& s- j& @( L3 s$ w 《Tab》data
" R; h, n8 m W Z( p 《Tab》data ← :set noai (取消自動內縮); `* o5 C- R8 Z M2 \( I# K, `3 _
the end of auto indent.2 R5 @' ?8 z X8 C
‧註:<Ctrl><d>可刪除《Tab》字元。0 _# n. T2 N7 S+ {5 E' q1 j" m
_+ X3 r( Q& R9 O4 L6 f6 i+ C11.ex指令
2 V V) m- l7 a; S: M: {+ i 讀寫資料# o8 W6 T/ X- c9 g7 E1 v
:w 將緩衝區的資料寫入磁碟中。' M0 [9 u" ^6 o. L; j3 w4 Q. |
:10,20wtest 將第10行至第20行的資料寫入test檔案。- ~ l0 C. ^- S) C6 G
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。
- o) M! |. T# p Q4 r6 Y+ s) y; ~ :rtest 將test檔案的資料讀入編輯緩衝區的最後。
9 x, |* i' Y8 r( h, w 刪除、複製及搬移
: L0 \" z; |9 w' B' r :10,20d 刪除第10行至第20行的資料。 M) M1 I1 E }0 r C# u7 L+ q
:10d 刪除第10行的資料。
. B" ^# W4 \; t :%d 刪除整個編輯緩衝區。1 G3 c, Y" ~+ s' y! k. ?5 R8 c
:10,20co30 將第10行至第20行的資料複製至第30行之後。( ~" D. H5 I0 |3 d% M9 ^$ \$ g) Z6 F
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。
+ I* t3 C& B* t 字串搜尋與取代
+ a0 D6 U0 S$ l5 \* \/ A' [ s(substitute)指令可搜尋某行列範圍。4 z# c/ Y/ v, W5 O/ y
g(global)指令則可搜尋整個編輯緩衝區的資料。1 z( U/ H0 R9 E4 T' e
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條. s9 R8 f! C( e
件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
7 G" L- {& `% h- o. R :1,$s/old/new/g 將檔案中所有的『old』改成『new』。
# H. M! U9 c9 ~& M# V$ V: P" F :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。
$ ?! ^% ?- e7 Q :%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。$ B7 g. u6 w2 ~; L% s
, S) \6 T$ h0 e
12.恢復編輯時被中斷的檔案
% @; T9 s9 [0 h. d 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未/ ~( q3 }+ u: J$ I
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
; v9 @; O6 l6 q- {/ _* G 的檔案內容。
+ E+ G3 C I, X' A8 p1 G U %vi -r filename1 H! H" K8 @. ~0 T+ o1 g/ f
$ S- o7 ]0 n( K13.編輯多個檔案
! H9 [* g/ Y( {3 \5 F g4 ~4 B vi亦提供同時編輯多個檔案的功能,方法如下:
+ o' c; m& M1 a/ K# a+ i" N %vi file1 file2 ..* e* y4 A% Y3 M" T
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後+ K5 d+ k/ n% v& {% i
再利用 『:n』載入下一個檔案。# S. P# ?; u q( j" p$ m4 T3 |9 B
5 t8 {# Z- t( B: J- @% P* x
參考:
) E1 X" p% X. o& S- m$ h
1 M+ \5 S: f" u. l/ c- T% B+ Fhttp://chunchaichang.blogspot.tw/2010/08/vim-s.html
# C6 n% r8 @7 ?' ]9 X; y0 p |