52AV手機A片王|52AV.ONE

標題: Linux下的文字編輯器-vi詳細說明 [打印本頁]

作者: IT_man    時間: 2014-11-18 08:47
標題: Linux下的文字編輯器-vi詳細說明
本帖最後由 IT_man 於 2017-5-6 23:16 編輯
/ `7 U5 L0 k, C9 I, f* C5 K! c' B+ [% @5 b
vi指令說明(完整版)
& h+ R. R1 y- S9 C/ _

' {+ Z6 N3 W! O" K+ Q+ D

vi 提供兩種操作模式:輸入模式(insert mode)指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。



. }" @& p3 F8 z) u7 t       如何進入輸入模式' n& U9 V. w+ R* A, c9 D9 m
                a (append)    由游標之後加入資料。9 ?' H. ]' x" s( ~" s  E7 |! s3 G6 |
                A                   由該行之末加入資料。; l) b1 J5 {$ c5 q, F
                i (insert)        由游標之前加入資料。
6 R. q. m; H. g& D4 s( A; @5 x6 c                I                   由該行之首加入資料。# S8 I! Q- Q. |& K6 u! l
                o (open)       新增一行於該行之下供輸入資料之用。
+ \  @5 L3 ~+ q1 g                O                  新增一行於該行之上供輸入資料之用。6 \" X3 T( |* \+ `# a& o
       如何離開輸入模式
5 u/ O7 n$ w/ s7 i: Z) z& B7 g4 K+ x             《ESC》          結束輸入模式。3 t& v% c7 r6 W$ z

  O0 C0 D$ ?; X# W! D" }9 N
1.游標之移動& ~' c# d8 }. y2 G4 q$ P
              h       向左移一個字元。
9 X) n9 H& T, G+ w  Q/ H3 E              j       向上移一個字元。7 X9 J/ ~1 w4 M# ^4 e" ~( W
              k       向下移一個字元。
* h( b. L! @4 J1 f3 t              l       向右移一個字元。
; [1 N( ^4 ?* V( K( ]% V) S+ J              0       移至該行之首
- v# d  e* ~$ `1 \. G/ J: v              $       移至該行之末。+ T! S& n% ~: x( V- e3 R! a# n( q
              ^       移至該行的第一個字元處。
/ S; I2 r' J/ a              H       移至視窗的第一列。
! W* C7 Y9 ?4 m5 a* \5 }3 q              M       移至視窗的中間那列。! k8 O4 m0 t) l: i& Z1 y% V+ r' _
              L       移至視窗的最後一列。
: k( v3 P+ @9 t             G       移至該檔案的最後一列。
* j1 {6 j( B/ U0 d             +       移至下一列的第一個字元處。& U( e( O* t$ \1 U0 V. r
             -       移至上一列的第一個字元處。* e: Y2 I0 V, D/ p4 O, h: X: ?8 n& M
             (       移至該句之首。 (註一)
5 t& T) `( A9 d9 l& O$ `- S             )       移至該句之末。
! q1 d1 z0 Z# Z6 |& i             {       移至該段落之首。 (註二)8 E1 E% [! ^  h5 a# J
             }       移至該段落之末。; `( `4 g( `% ]6 R& h: T2 a
             nG      移至該檔案的第 n 列。
7 d: U# l0 N6 N% k: V             n+      移至游標所在位置之後的第 n 列。
' C0 f+ |* t* c* R6 p9 [             n-      移至游標所在位置之前的第 n 列。2 U, D% R9 O+ L/ `  b: w* D1 }. @1 ~$ X- w
            <Ctrl><g>       會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
4 V( |6 t) s6 M            註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
0 e) `4 o4 Z# k8 g            註二:段落(paragraph)在vi中是指以空白行隔開的文字。! {0 B3 @8 H3 B' |& ~

, D& u0 X' b6 T% ^/ |5 z% Y- v; r2.視窗的移動       <Ctrl><f>       視窗往下捲一頁。( j9 o9 w8 A! A9 |/ h; H' R& I+ c
           <Ctrl><b>       視窗往上捲一頁。9 y6 [) A) }0 g8 T/ O/ D+ p8 ^
           <Ctrl><d>       視窗往下捲半頁。
7 u) L- l. a3 }           <Ctrl><u>       視窗往上捲半頁。
# p' c/ x6 L# ]9 `! @, n* l5 P: |5 {           <Ctrl><e>       視窗往下捲一行。
) c: X$ F* N! J4 }' l# Z2 }# k           <Ctrl><y>       視窗往上捲一行。
6 X$ a4 g! x3 Q) K
$ t! a/ o4 I( {7 t9 ]9 l( `3.刪除、複製及修改指令介紹 (此單元較少使用)
: ?7 e5 W' u% p6 D       d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
0 p! r$ W. ^; g. n       Operator + Scope = command& Y$ |! F6 D1 T, D
       (運算子)   (範圍)1 T1 D" b2 M4 |' \% {1 V
       運算子:
1 H, }3 ~. J0 A' S3 f       d       刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
. ~8 K/ f8 m% E# P9 C9 J, c       y       將資料(字組、行列、句子或段落)複製到緩衝區。" V/ y, R) |- x& z7 P' [
       p       放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資, i) T3 b; U$ H$ O  l' e4 D, i
                料放置於游標所在位置之行列下。" X! y+ a0 f3 |. y3 W
       c       修改(change)指令,類似delete與insert的組和。刪除一個字組、句
: U7 o1 d/ F! r1 V8 J                子等之資料,並插入新鍵資料。. S4 e. d1 k, P$ z8 S8 q
       範圍:
" {, R( {# ^) q       e       由游標所在位置至該字串的最後一個字元。: x& t  q! {5 R9 j0 P+ {
       w       由游標所在位置至下一個字串的第一個字元。; R) j* u7 L3 _& b2 p: E7 O2 a
       b       由游標所在位置至前一個字串的第一個字元。
! w& @0 [% r6 \7 R) j       $       由游標所在位置至該行的最後一個字元。
+ X- {( @& p1 d7 |0 ^       0       由游標所在位置至該行的第一個字元。
2 c( J8 l1 L6 c+ a, W; l       )       由游標所在位置至下一個句子的第一個字元。
& k% h. w- t) j* {       (       由游標所在位置至該句子的第一個字元。& X, p: A6 L2 X- r& y6 z2 [7 V' c$ G
       {       由游標所在位置至該段落的最後一個字元。
* T# x% \4 \1 B7 {% T& w7 _  H: T  y       }       由游標所在位置至該段落的第一個字元。
. h0 ^9 f. i8 o4 M7 u. l       整行動作6 }/ h% U" v, Q8 L( q2 h( M2 L
       dd      刪除整行。4 ~* E* r6 \4 S( L/ b) r: @7 l: F
       D       以行為單位,刪除游標後之所有字元。" z' l* v. k+ a3 s/ _
       cc      修改整行的內容。' Z7 e2 D" b6 D, Y8 W4 w
       yy      yank整行,使游標所在該行複製到記憶體緩衝區。
% J( G. R- k2 J
' x0 K$ d4 n. D8 R" U7 d) K4.刪除與修改
8 i' I) B. m9 j. b4 s( F8 M       x       刪除游標所在該字元。2 s4 Q( {6 o  h; t% y$ O/ g
       X       刪除游標所在之前一字元。! E1 ?9 |7 K! R0 Z! E; P
       dd      刪除游標所在該行。- J( m5 _- k" G
       r       用接於此指令之後的字元取代(replace)游標所在字元。! c+ H6 q6 K! p% d9 s4 \0 l
                如: ra 將游標所在字元以 a 取代之。" Y* V4 B' G, O8 Q
       R       進入取代狀態,直到《ESC》為止。; `+ s) j2 x1 ?# Y7 E" Z& F3 D
       s       刪除游標所在之字元,並進入輸入模式直到《ESC》。5 w/ w& C, I4 x+ B: k
       S       刪除游標所在之該行資料,並進入輸入模式直到《ESC》。( E; O( O4 F/ V
7 w. k$ @$ `9 W" u' D$ T
5.搬移與複製
, ]" y8 {. _9 A: W0 m       利用delete 及 put 指令可完成資料搬移之目的。  M8 i- l$ i8 q' c
       利用yank 及 put 指令可完成資料複製之目的。
7 @/ B- f/ g% Y( I       yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令. B% U+ X+ b3 n) T
       可將緩衝區內的資料複製到螢幕上。
/ u) S* Z8 Q+ K+ J       例:) X, l! h& \) a# A& b
       搬移一行        ‧在該行執行 dd
+ X5 E; r% X; f4 @, ^$ t' [                        ‧游標移至目的地% ~/ o7 ?, k' e$ S
                        ‧執行 p+ f* P. `/ I5 ]+ M4 p; p1 C
       複製一行        ‧在該行執行 yy
- r5 m9 `$ f5 y2 _; z9 j. ^, D9 _                        ‧游標移至目的地
% g& v; n4 m. O2 t  S                        ‧執行 p# a6 h! j6 \0 v# S8 n

# t" R2 V  R) a3 m+ [6.指令重複
. T8 f! d% T! q: n, B       在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
: _% i0 V" @% {       次。
. P4 P( O$ n2 c# Q% R       例:" @* b) {+ ]8 [  k9 O3 J4 ^
       刪除10行                ‧10dd3 z# u5 R0 i8 g$ @1 ?
       複製10行                ‧10yy7 \: l( L7 p5 ~3 D* i! h; }
                                ‧游標移至目的地
0 T# s+ z8 _$ m8 U( @& T                                ‧p- I" ~+ B8 K$ w3 X! I1 k) k
       指標往下移10行 ‧10j" K* e: D+ `" l
& v9 {) l% u) ~! x' ]
7.取消前一動作(Undo)& t% B9 S$ P% O0 H# J3 ^
       即復原執行上一指令前的內容。% d& s# T+ z" t4 R2 w$ _
       u       恢復最後一個指令之前的結果。
# M3 ^1 _. o: Z; T4 M4 p) o       U       恢復游標該行之所有改變。0 L$ S2 \- f2 T, ^: V
; r3 ?- p) \; x1 K' h- R
8.搜尋% N2 J- F- x& I$ A- N8 j! j
       在vi中可搜尋某一字串,使游標移至該處。
0 p; a5 m7 g% R: \! U6 h% Y5 G6 k       /字串           往游標之後尋找該字串。
( Z) D9 ^6 h0 b/ p: \/ E+ }       ?字串           往游標之前尋找該字串。  q+ f# Z8 {1 l7 y4 f
       n               往下繼續尋找下一個相同的字串。4 A# y9 I! d- t, k  j) c. @' w
       N               往上繼續尋找下一個相同的字串。* c; y' M" T: D7 m4 p& ~

! ]' }1 t% T, S# `. X( t# ?' j9 c/ }9.資料的連接. v# U- G0 s( P
       J       句子的連接。將游標所在之下一行連接至游標該行的後面。
* v2 y: `7 H. b9 F3 y. ^       若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式' O9 X% g: H. |- \
       (可利用a、i等指令)再按《Enter》即可。
/ q1 {/ g+ G: k$ R) C( l3 ~( c* e0 t" z
10.環境的設定" \3 S( N9 ~) T, M3 C+ b
       :setnu                設定資料的行號。/ u7 ]. w9 B# x
       :setnonu              取消行號設定。; y$ p5 f# E& T
       :setai                自動內縮。
) q3 A% I0 w3 v0 }% o       :setnoai              取消自動內縮。
0 B" ~* q: }2 I) }' z$ G4 Q       自動內縮(automatic indentation); \- r' U2 x9 N, ^: t
       在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自4 C# K. s# ~' L
       動內縮的功能,用下例解釋之:, ^3 i4 N: A3 f- O$ }+ s5 p! V
       ‧vi test! X% D& y$ E; B9 \# S% F0 u
       ‧(進入編輯視窗後)
- L- r  k4 c* b$ K2 ]- M         this is the test for auto indent
7 O7 o$ T% L0 f0 c! o! M         《Tab》start indent           ← :set ai (設自動內縮); S! I8 S/ ]1 j  ?7 q+ {& d/ ^
         《Tab》data! Z9 y9 I' h8 h* e" L  a6 U8 V
         《Tab》data; q8 D& O* D$ ~% Q3 I- R4 a+ @
         《Tab》data                   ← :set noai (取消自動內縮)! Z  j0 F" R, w
       the end of auto indent.
9 [4 k8 v+ v0 [       ‧註:<Ctrl><d>可刪除《Tab》字元。4 p/ n5 O% @* y/ p9 m+ Y2 h
! ~) o( F/ c; ]4 c+ G% H* w
11.ex指令
$ x! a8 N" e( |5 H       讀寫資料
7 K5 l' {4 r6 T2 [5 }# D1 `2 I       :w                     將緩衝區的資料寫入磁碟中。
% N! Q( f' X' u. L/ L       :10,20wtest   將第10行至第20行的資料寫入test檔案。
; a+ [+ g5 Z, e' q: R3 D       :10,20w>>test  將第10行至第20行的資料加在test檔案之後。+ Q7 Y, H/ f* X! g- I/ s* C( Z
       :rtest                將test檔案的資料讀入編輯緩衝區的最後。
& }. N) V: ~% Y/ V# K5 e       刪除、複製及搬移
( O' ]3 K9 R7 m       :10,20d                刪除第10行至第20行的資料。4 S$ W  K5 {( x9 h
       :10d                   刪除第10行的資料。3 I; _, d( I1 r3 r- }5 }) _) w' p
       :%d                    刪除整個編輯緩衝區。! [, D/ h3 u1 c4 _" @! z
       :10,20co30             將第10行至第20行的資料複製至第30行之後。# n3 r5 b  \4 ~& Y8 R. E! T
       :10,20mo30             將第10行至第20行的資料搬移至第30行之後。
% ~5 Y2 R  w  d) Y/ m3 F       字串搜尋與取代
2 Q: X! @: C3 N7 N% Z/ A       s(substitute)指令可搜尋某行列範圍。1 l6 k  l0 n8 A6 H. G
       g(global)指令則可搜尋整個編輯緩衝區的資料。
. J* W* |" r) e1 Z1 h; J" X       s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條# ^9 R" Q0 ~# l0 @* J7 Z
       件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
5 L% d( O7 s( n       :1,$s/old/new/g                將檔案中所有的『old』改成『new』。
4 B' ^5 S: O1 d% L6 j       :10,20s/^/   /        將第10行至第20行資料的最前面插入5個空白。
$ l% `. i( a5 D3 R; p. r. l       :%s/old/new/g          將編輯緩衝區中所有的『old』改成『new』。
: \3 N8 ]' y, k+ p" V
2 l% B& d  L6 q9 x12.恢復編輯時被中斷的檔案
$ e! T& C( Y$ W, q. R9 y; i" V       在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未( f* t  \5 I  t
       被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前  K5 f- Y& Y1 _
       的檔案內容。( Z, S+ ~! Q  c1 l$ Y3 d' g
       %vi -r filename: q1 ~* o$ j8 N. |6 Z( V6 t

/ t! M  Y+ q1 F13.編輯多個檔案) q' T2 q4 d; p7 E: z  V$ I
       vi亦提供同時編輯多個檔案的功能,方法如下:
! D9 \, B& }# K% d/ D! q, I       %vi file1 file2 ..
, _* W' L4 [' d6 L       當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後* F) b1 `( R7 ~4 [8 h) t
       再利用 『:n』載入下一個檔案。% ~$ P, ~. k2 C0 s7 t

- R6 B  s7 L* x0 ~$ `. G( M參考:: V1 z. d; \4 h: Q% ?* R( Y0 u
7 i* l9 n3 m% R6 z$ W0 m$ }- P9 |
http://chunchaichang.blogspot.tw/2010/08/vim-s.html7 X' b3 X9 Y0 {) f$ ^; @& X





歡迎光臨 52AV手機A片王|52AV.ONE (https://www.itech.casa/) Powered by Discuz! X3.2