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

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

作者: IT_man    時間: 2014-11-18 08:47
標題: Linux下的文字編輯器-vi詳細說明
本帖最後由 IT_man 於 2017-5-6 23:16 編輯 1 f- a8 N6 u% T2 m2 G

; v7 p% p9 O+ R, w7 O+ Vvi指令說明(完整版)
9 P" P+ t) n* D( o" K3 H

! f3 e- C$ `3 j* N/ F

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


' s3 d; D- k- C, H3 ^* M, T
       如何進入輸入模式
: L( D3 k5 X2 @: P* R8 ~                a (append)    由游標之後加入資料。
7 t  U' m: t2 Q& C0 ~9 d0 Y: ^0 F                A                   由該行之末加入資料。$ l; [3 J7 X: t# _8 A6 I: f3 S4 R
                i (insert)        由游標之前加入資料。. C* C" U$ N* B5 V6 w4 Z  C8 I* D
                I                   由該行之首加入資料。
7 f6 M, s" D( c6 w) _; _4 b, X! r. T2 _3 k( Z                o (open)       新增一行於該行之下供輸入資料之用。, \% f+ g' [, ~$ S3 q# q$ w; \  [
                O                  新增一行於該行之上供輸入資料之用。
, N. e8 L2 B, P       如何離開輸入模式/ V. W+ O: y9 q) i: }
             《ESC》          結束輸入模式。( C' \0 P0 W0 f


# P9 R; P" a# y7 k& A$ c- o1.游標之移動
# i9 Y5 h: i! L3 y# Q  u" J              h       向左移一個字元。2 B) \# M: p  \
              j       向上移一個字元。
' i/ Z% X; V+ h- Q3 K0 P- e( ]: g) v) Q              k       向下移一個字元。
6 Q4 D8 n  |0 `5 K! p+ P              l       向右移一個字元。/ |  N9 F! M9 }( Q1 \- F
              0       移至該行之首
' \- w/ y2 e" Z& b- A0 N8 }1 e, n              $       移至該行之末。
1 t; {- g- j& d: S: u              ^       移至該行的第一個字元處。' [* X2 {' `. g* @2 T
              H       移至視窗的第一列。
, k8 l- [* e  n; J              M       移至視窗的中間那列。0 o" K3 r6 t/ ^
              L       移至視窗的最後一列。
8 g& ]4 h& p0 y# ]$ j7 q. Q             G       移至該檔案的最後一列。
2 w2 B5 f2 O; H/ \2 @( {             +       移至下一列的第一個字元處。% c1 w( Q. x& T
             -       移至上一列的第一個字元處。
: T! W/ [/ o% z) ~9 d2 j             (       移至該句之首。 (註一)
+ l" B" Y, C4 w5 k             )       移至該句之末。
6 `# q2 ]1 \& t5 P             {       移至該段落之首。 (註二)
/ ~, a+ u! r2 i3 H) Y             }       移至該段落之末。
$ r; z$ \" }3 P. B             nG      移至該檔案的第 n 列。- t5 H( _# p4 G1 u  b  U( N5 n
             n+      移至游標所在位置之後的第 n 列。
  m7 S  f6 c( Q' p) g& z  j             n-      移至游標所在位置之前的第 n 列。$ `- r; H5 H7 ^
            <Ctrl><g>       會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
9 N2 W7 t1 G) B) \; R8 H* t% T            註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
1 G7 g$ {; `, a' Q- L            註二:段落(paragraph)在vi中是指以空白行隔開的文字。1 o9 Q* p0 m6 s. u# X

% z1 c. w8 t2 ^& X$ Y2.視窗的移動       <Ctrl><f>       視窗往下捲一頁。# Q+ T1 q- D5 R  r8 u6 Y
           <Ctrl><b>       視窗往上捲一頁。
, b' p" C5 q$ c5 F- I) n2 E           <Ctrl><d>       視窗往下捲半頁。
7 {. P" ^1 d+ s, n' B/ P           <Ctrl><u>       視窗往上捲半頁。; k0 c( D9 ], y# Y
           <Ctrl><e>       視窗往下捲一行。
+ U% }1 ^* ?& l( ^0 B, j           <Ctrl><y>       視窗往上捲一行。
5 f. C+ w; p* O* c# u- I  i) m
2 _9 N6 w$ X  y- B. M7 Q3.刪除、複製及修改指令介紹 (此單元較少使用)
: h  e0 N: s" |' U5 x       d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:
  |4 P) |6 |% ^1 f. _/ G4 M+ U- n) E7 w       Operator + Scope = command2 g3 y) O9 [* i, V6 R
       (運算子)   (範圍)
: P# a. M2 q3 W       運算子:- q! b- |, t. G) t7 m6 a6 M
       d       刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。6 q8 J* q$ D7 Z( }# l9 j- z- p" n
       y       將資料(字組、行列、句子或段落)複製到緩衝區。
4 R! w& ^9 f# x( Q       p       放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資/ q& M9 a( m7 z+ ^; V  O" K0 W9 s) j
                料放置於游標所在位置之行列下。
' b- ?# _: v7 o2 j       c       修改(change)指令,類似delete與insert的組和。刪除一個字組、句" \3 J! F" D, d; l* f4 W6 ?$ t
                子等之資料,並插入新鍵資料。: Q; f4 k1 ^2 M
       範圍:7 o9 ^3 B  [1 u+ O+ l
       e       由游標所在位置至該字串的最後一個字元。+ |$ ^) `; u2 B: p' j, j3 \2 Z
       w       由游標所在位置至下一個字串的第一個字元。
# b% g  U# N! p7 H* j- b       b       由游標所在位置至前一個字串的第一個字元。
0 y+ I$ n; ~) S* D' c2 @       $       由游標所在位置至該行的最後一個字元。: N0 d: P# D, Q6 |  O0 ^
       0       由游標所在位置至該行的第一個字元。( x! v5 U& Y/ T- ^1 x
       )       由游標所在位置至下一個句子的第一個字元。- E6 _" q9 W9 f. i1 W0 e. k8 q& D
       (       由游標所在位置至該句子的第一個字元。
# x3 C6 I) ?  K+ g2 \       {       由游標所在位置至該段落的最後一個字元。- \6 \# o7 h& P+ w# m" w: m6 K' l
       }       由游標所在位置至該段落的第一個字元。
2 P- A! R" v8 j4 W. P) O! m       整行動作
9 k. ]( ^' R5 \7 \  V( D       dd      刪除整行。) a0 n' B% Z# }) s2 {: }: a
       D       以行為單位,刪除游標後之所有字元。
; Y2 Z9 N( `  A2 o: b2 z       cc      修改整行的內容。
7 |$ z! V/ T/ w       yy      yank整行,使游標所在該行複製到記憶體緩衝區。
7 E& X* t5 W) |
+ C& f3 C4 j( V1 V" r4.刪除與修改
; E! k% E% l6 z- J3 Q* K6 N( l( w       x       刪除游標所在該字元。
, Y. o3 ]: D- |4 G, H# n       X       刪除游標所在之前一字元。3 w: q' K& \9 P  @( }6 g) @) K
       dd      刪除游標所在該行。: M" X" k# [  }' Q& ^/ S
       r       用接於此指令之後的字元取代(replace)游標所在字元。
( y  m: @  a: T$ {  {                如: ra 將游標所在字元以 a 取代之。
/ |* L; A! I1 {" ~  O, f: {       R       進入取代狀態,直到《ESC》為止。( v- f7 k" b+ b2 U5 p
       s       刪除游標所在之字元,並進入輸入模式直到《ESC》。( V2 l( I) e; T) \  G  G
       S       刪除游標所在之該行資料,並進入輸入模式直到《ESC》。7 r, v2 x) @; J8 T+ r

$ h. _) c! v5 R+ n5.搬移與複製
& z& N; P3 ~7 ?8 t& d& q       利用delete 及 put 指令可完成資料搬移之目的。; ^1 g. J' t3 s
       利用yank 及 put 指令可完成資料複製之目的。
+ d  Q$ q' U+ m1 x% A- a8 l       yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令' r# F) j' q2 ]# x4 |7 ?* W6 B/ S
       可將緩衝區內的資料複製到螢幕上。" V* E5 e" `# y# g# z; F0 z( X, z
       例:
& G5 H" ^( L9 p" J       搬移一行        ‧在該行執行 dd3 t+ Q( T( \5 x5 \# [
                        ‧游標移至目的地4 \3 m5 ^% t, F( [$ ^4 k4 M6 i
                        ‧執行 p" x) e. B( y3 {2 ~# r9 [
       複製一行        ‧在該行執行 yy' d& j) ]/ l$ {" h$ T+ y1 e/ R5 n
                        ‧游標移至目的地
; [# Y4 g  y! _8 C  [; A                        ‧執行 p
5 k( g( F( `1 B! Q, u9 L2 c+ m$ [% b: a3 T% v5 j4 O
6.指令重複
2 J) R4 y) W8 R# O$ P: r/ ?) H       在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n
" ?9 {: O2 _8 W" ^  O0 e" \       次。
% E# f$ n5 o8 ^7 t4 M% N8 S6 a       例:8 t- x4 l9 A1 d( J& i4 \  V' a* }
       刪除10行                ‧10dd4 S5 v6 ]6 A: Q3 I5 p
       複製10行                ‧10yy
0 q- R7 |) M( Y0 Q8 y; k& T: z                                ‧游標移至目的地
! r& n3 p( ?1 l8 j                                ‧p
7 E5 b" h  x' S9 d" q       指標往下移10行 ‧10j, l) N3 r. A4 e( a" w0 ]

# g9 }1 R7 x' Y2 f7.取消前一動作(Undo)( |, e  W# L$ q) @: f4 P3 R
       即復原執行上一指令前的內容。
0 @7 ]$ P! m2 g9 `& L/ k4 L       u       恢復最後一個指令之前的結果。
9 o( }6 a, s( L$ [2 J       U       恢復游標該行之所有改變。+ @: z1 u* [( h! U1 G5 O; o$ m

) m& i/ i4 v% b: o8.搜尋
0 Q; A+ f: W2 Z& H+ f) n- L! p       在vi中可搜尋某一字串,使游標移至該處。
2 m9 [2 N7 e. x2 }       /字串           往游標之後尋找該字串。
3 a. ?6 ?/ Q$ A* ?$ j       ?字串           往游標之前尋找該字串。
: u1 Z3 m& U5 [       n               往下繼續尋找下一個相同的字串。
# j6 W1 j, A" h0 `; ]+ K       N               往上繼續尋找下一個相同的字串。. T5 _# d+ A8 g" T- C
& I- q" |: C6 O; c0 p* A- O3 |
9.資料的連接/ Q+ F  K' z0 j. R
       J       句子的連接。將游標所在之下一行連接至游標該行的後面。. i  |- \3 E4 i6 K, `
       若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
3 m, V0 I, v/ I% x: a$ ]       (可利用a、i等指令)再按《Enter》即可。3 a2 p5 k5 u6 n% K: ~( \
8 n. \0 \8 Z4 A0 W9 ^8 D  k6 _
10.環境的設定5 k9 K  ?  R% c6 e. x6 K1 _' a
       :setnu                設定資料的行號。
6 y$ t1 }- c7 _       :setnonu              取消行號設定。
9 @  V2 I3 ~! v       :setai                自動內縮。5 @) L) A4 o' x+ f
       :setnoai              取消自動內縮。* U) N! `* Q4 b/ b+ C0 z1 F8 T
       自動內縮(automatic indentation)
: f( U' C5 J9 ?: f9 W" N  C       在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自; @3 H& |5 C+ ?2 s0 f3 g, @
       動內縮的功能,用下例解釋之:
/ P. `: O" O) s4 F       ‧vi test
& i& F% J: T; w4 h: i# f0 j/ L       ‧(進入編輯視窗後)' L5 p; @# z7 n' R8 g
         this is the test for auto indent
- |% j1 |! j9 U* D         《Tab》start indent           ← :set ai (設自動內縮)
! ^/ O4 d9 h% k, B3 P         《Tab》data, F( s& }# W# ?8 I
         《Tab》data  O+ @+ {; c  v  o2 A0 g4 T. |3 {
         《Tab》data                   ← :set noai (取消自動內縮)
7 e( N- I/ m! K8 b  I' b" m       the end of auto indent.3 a$ Y$ `, C- m
       ‧註:<Ctrl><d>可刪除《Tab》字元。
& y" U; u* h* C' N5 v/ `
! P6 I( H; ?  w& }7 t3 P11.ex指令
( J; q" m; L, Y3 ?; R/ O: V8 T8 Z& W       讀寫資料
' t( c) k' X! H& e       :w                     將緩衝區的資料寫入磁碟中。
' J: A0 `6 \( \' L; y2 p! A, x9 f       :10,20wtest   將第10行至第20行的資料寫入test檔案。0 }% i5 h! A1 P9 [" ?1 C1 d
       :10,20w>>test  將第10行至第20行的資料加在test檔案之後。
8 k- m5 J9 H7 m, ]4 S1 W  M       :rtest                將test檔案的資料讀入編輯緩衝區的最後。
( Q1 S) Y, q- U; r) |8 Q# x       刪除、複製及搬移' o6 r0 }6 l% ]2 i; [1 p1 F
       :10,20d                刪除第10行至第20行的資料。0 q) P3 `0 N) v4 W! ]
       :10d                   刪除第10行的資料。, X  y% f. d& |+ I5 N/ d
       :%d                    刪除整個編輯緩衝區。
1 M" J- Y2 F( l/ D3 I; ]: [       :10,20co30             將第10行至第20行的資料複製至第30行之後。
! g8 I) R! _& p! y" G' i       :10,20mo30             將第10行至第20行的資料搬移至第30行之後。
1 h6 ~+ j' \! T2 W' J' z       字串搜尋與取代- C& b! L: T! m6 @% T
       s(substitute)指令可搜尋某行列範圍。
$ w) z: d; L" q: g3 b( f       g(global)指令則可搜尋整個編輯緩衝區的資料。, D* c1 e8 X3 ]7 L5 ^, L# D/ r- k
       s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
9 u8 o' x$ `) ~5 W6 I2 U& W       件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。3 G9 o! ?6 X. s  L' r# P" Q* H
       :1,$s/old/new/g                將檔案中所有的『old』改成『new』。
+ G: _' H- f, [; ^: s/ A       :10,20s/^/   /        將第10行至第20行資料的最前面插入5個空白。& b! x% `; k. B9 N
       :%s/old/new/g          將編輯緩衝區中所有的『old』改成『new』。
0 m+ K9 ~3 F1 U4 _, u
$ w) @9 C7 ?, W12.恢復編輯時被中斷的檔案, E1 m3 A9 T9 ^# q/ g
       在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
! }! E) T. Q3 l& N) \7 S       被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前# i* n" g% S8 a+ J+ x! c
       的檔案內容。% n, E: A' ]6 i
       %vi -r filename
' f) o4 S, I1 ]  C+ R: b9 O: x* G* C
13.編輯多個檔案
' R! Z' ?5 y" o  J/ E! b       vi亦提供同時編輯多個檔案的功能,方法如下:! U  D( V+ o& W1 ^* r' ]- ^
       %vi file1 file2 ..( t# l5 k& @" E
       當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後" M. b6 L% X( q- p
       再利用 『:n』載入下一個檔案。6 L; J' P5 {& F. T5 j

# k  Q3 B4 f& Y; E; E( ~( w參考:
! o9 S, Z/ }& K. K5 Y! V) s- s- Z1 F3 ^1 f
http://chunchaichang.blogspot.tw/2010/08/vim-s.html
6 P$ ^. P8 A, S, ^9 E8 t( X  c




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