52AV手機A片王|52AV.ONE
標題: Linux下的文字編輯器-vi詳細說明 [打印本頁]
作者: IT_man 時間: 2014-11-18 08:47
標題: Linux下的文字編輯器-vi詳細說明
本帖最後由 IT_man 於 2017-5-6 23:16 編輯 3 z8 ]# `* L+ j( Y1 b
7 Z: a7 w% I: _4 |1 u: ^' {
vi指令說明(完整版)
$ V- n+ T) \0 }- vi 的操作模式* }. z* M2 G5 D7 i; p
3 v6 l# J" C' Z
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。
- 輸入模式
; Y" S, K- B" E4 B7 ?
+ Y$ \4 u8 R" u. a 如何進入輸入模式6 K, d% z9 i2 e# A& Y* L
a (append) 由游標之後加入資料。( i8 e: `0 O+ p- F8 z+ k
A 由該行之末加入資料。
) m% Q3 z0 ?! x0 R2 }# x i (insert) 由游標之前加入資料。& m3 d' Q7 O$ _: q5 _! n
I 由該行之首加入資料。
! P- P6 k8 Z d% j2 V) R: k o (open) 新增一行於該行之下供輸入資料之用。4 X9 |6 i/ T& R' @& H5 G; x
O 新增一行於該行之上供輸入資料之用。! B( o$ n8 Z) ~: h" r; S
如何離開輸入模式
. M# F9 r% a: M8 Y 《ESC》 結束輸入模式。$ G% B, W b# k" b
- 指令模式; b* W, u6 D% A+ ` b3 I
. K5 l) L% f) Y* R1 b, q& `
1.游標之移動
8 J' r. t6 }1 H: A5 F! G% m h 向左移一個字元。
% a. a5 {. q4 Y! \2 _0 _4 L j 向上移一個字元。
c" z1 Y5 ?: w: x$ D/ `8 o k 向下移一個字元。
) s. j/ I2 U# ~: m l 向右移一個字元。
4 `' u% l' ]" \; R: q q. h 0 移至該行之首
' s0 \3 L$ V( O& a& A $ 移至該行之末。
# j8 J# o9 b8 B& S/ U1 g% X ^ ^ 移至該行的第一個字元處。* e% j& @' \, ^& V9 S
H 移至視窗的第一列。
7 n* h# B9 Q* _, D M 移至視窗的中間那列。/ J8 P; w W4 @
L 移至視窗的最後一列。
# L& i5 |: H" k1 H G 移至該檔案的最後一列。
+ ]5 y$ t+ J5 Z% K+ m# C9 t + 移至下一列的第一個字元處。, G* P' S3 N7 g |: k$ x ?
- 移至上一列的第一個字元處。
# L9 M+ H8 ^8 T- W1 V ( 移至該句之首。 (註一)( n- A( ]5 X( I& R( K H$ j6 N
) 移至該句之末。 w) d8 h1 \ p
{ 移至該段落之首。 (註二)
0 q8 M( J0 @7 m. {& ^& r6 @+ r } 移至該段落之末。
3 \+ I+ M6 v0 O7 C" V nG 移至該檔案的第 n 列。: t1 S& e4 v( n
n+ 移至游標所在位置之後的第 n 列。
. j& h6 H. C& c1 g n- 移至游標所在位置之前的第 n 列。
# G# d ~: G9 X( n: [ <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
9 ]9 n1 X6 u, r, `+ ~- c' E- z5 Z 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
/ Y* j9 j' x* K: {* i B: [ 註二:段落(paragraph)在vi中是指以空白行隔開的文字。0 d) Y8 e) V5 J4 M' `( p# c
' y+ b/ s8 r& A/ u2 g* I
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
: |" D: V" j) \- @' | <Ctrl><b> 視窗往上捲一頁。- |5 m9 }0 K3 c8 C
<Ctrl><d> 視窗往下捲半頁。! M5 B9 z. z R5 @* p
<Ctrl><u> 視窗往上捲半頁。/ a# s+ }7 M; M4 \! t ]5 X
<Ctrl><e> 視窗往下捲一行。
) s8 P. j1 @& r$ ?: K <Ctrl><y> 視窗往上捲一行。
1 s7 M, q- A, I; I$ _) n1 k1 a% ~9 {7 h; q" O8 X1 K5 j
3.刪除、複製及修改指令介紹 (此單元較少使用)
& E, E* b& D5 |+ t d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:# {4 @; S) A' i: J: u @& X
Operator + Scope = command$ u, W/ h+ q: m
(運算子) (範圍)
5 ^8 c6 ^/ ^9 Q0 o) W* P6 @$ {! d' W 運算子:
- o8 B0 H% C& Q+ i1 A( {8 ] d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
( a, l; N/ c: P" o- I; g9 X& a y 將資料(字組、行列、句子或段落)複製到緩衝區。
, \( P2 x) u9 k p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資
0 J1 X$ [8 e/ W, P4 n 料放置於游標所在位置之行列下。7 r0 y% C d: [
c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
0 g" L/ o0 u. o4 h: B1 x/ {" @ 子等之資料,並插入新鍵資料。
" Z& W( v4 {/ @0 y' a) n9 t5 ] 範圍:' |) Q' P" k/ s6 z! H( y
e 由游標所在位置至該字串的最後一個字元。
g4 @1 e1 a( s$ w$ ^ w 由游標所在位置至下一個字串的第一個字元。
* q9 a# o. P4 S2 ~. n ~ b 由游標所在位置至前一個字串的第一個字元。3 E4 m2 [4 p& e+ r
$ 由游標所在位置至該行的最後一個字元。" b W/ ~* O0 {& M' i
0 由游標所在位置至該行的第一個字元。
2 m1 }* {" y! ?: t. z( V0 [7 H ) 由游標所在位置至下一個句子的第一個字元。" m8 _8 @9 r! [/ q, N$ o
( 由游標所在位置至該句子的第一個字元。
" f" _- m3 _8 z) d { 由游標所在位置至該段落的最後一個字元。( J/ {4 N1 n5 W* o/ S' @9 J( Y
} 由游標所在位置至該段落的第一個字元。
- w! X; Q" v3 X' E# M/ G: L$ D+ R 整行動作2 v6 W, a( f8 E6 R7 P2 n
dd 刪除整行。
- _( j! Z5 i: @6 ~ D 以行為單位,刪除游標後之所有字元。! {. ~2 _' }4 z( i% L5 y& H" ]+ N
cc 修改整行的內容。
) E, Z6 {( J2 R( P& `# k7 ]9 X yy yank整行,使游標所在該行複製到記憶體緩衝區。
; s' w$ ^1 O- a2 N+ w) ]. L& {5 A6 K5 U( h j* ^# s4 y
4.刪除與修改
2 W6 M0 T- G. k3 E* ^ x 刪除游標所在該字元。
- K% _3 f: \# G# Y. q% y2 ~ X 刪除游標所在之前一字元。9 G) c( Q4 I( [$ i7 s
dd 刪除游標所在該行。
* Y3 |2 @9 E3 N# a7 I! R, m' U r 用接於此指令之後的字元取代(replace)游標所在字元。9 h5 `1 G0 J' r% f6 r3 V1 D D
如: ra 將游標所在字元以 a 取代之。
1 O1 I5 K, ?3 F* }6 m R 進入取代狀態,直到《ESC》為止。
7 P" H# b5 J3 _2 b s 刪除游標所在之字元,並進入輸入模式直到《ESC》。6 X4 }9 i1 j8 s7 ~9 y/ Q6 ~( T& U3 `
S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。: K% W5 s! ]* k4 s8 H1 @
! i. x3 y. ?, q8 E: B6 d
5.搬移與複製7 v5 s* [1 S* C
利用delete 及 put 指令可完成資料搬移之目的。/ w2 e: I, W- H) U* y
利用yank 及 put 指令可完成資料複製之目的。
% S5 D' ?8 r2 d, D' X5 {& \ yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令4 t1 g" J: L( B& t& x+ E
可將緩衝區內的資料複製到螢幕上。
0 k% N" m8 p0 R. Y) S 例:& _( O/ i- U9 F5 Y) w3 C( _
搬移一行 ‧在該行執行 dd. z, `% y8 k2 a. V/ n9 }
‧游標移至目的地0 f( h1 i9 [& P' [( O1 Y5 e
‧執行 p/ \7 l! K1 R/ o: t2 X
複製一行 ‧在該行執行 yy
5 t* O6 ^" P$ y0 N/ |! {! j3 ? ‧游標移至目的地
' H( y0 Z1 J! u) n6 @ ‧執行 p7 g/ L2 G+ I" @& ~2 T
4 Z! F- T4 d9 |' ^! w `8 J+ r6.指令重複
9 u: ~/ s4 m9 P4 j, }# X) l 在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n1 [( }) x6 c. g) e( W$ G
次。 z* q0 f( T, y/ [# I S( Q! p
例:+ j/ [6 t; q' H1 A. Y8 X0 Q4 w2 d
刪除10行 ‧10dd! I, n* |5 e" j. A: N+ z$ s' p3 i
複製10行 ‧10yy
- C1 B2 F( p" F ‧游標移至目的地$ z$ x% `- i$ ?3 N8 o4 R
‧p$ S8 Z8 O3 |. E! n: ~. e
指標往下移10行 ‧10j
h0 H( O. r4 F- m! B7 s9 |
, {" g# h. M+ X x7.取消前一動作(Undo)4 { c& D" a# K- y; p1 [
即復原執行上一指令前的內容。9 j, G: n; H& C' Q! }+ r
u 恢復最後一個指令之前的結果。
9 c/ m9 y l9 j/ J" E U 恢復游標該行之所有改變。
* v- k u! j. v: a! O0 c
* q2 C$ t8 ^3 Q4 r. Q8.搜尋
. P" }' ^. K$ [$ x 在vi中可搜尋某一字串,使游標移至該處。+ O: f& v" M( d! g
/字串 往游標之後尋找該字串。 j1 {8 l$ f) S5 Y' t
?字串 往游標之前尋找該字串。
% ]; r, n( m% V n 往下繼續尋找下一個相同的字串。% O6 j% F5 O' A% o
N 往上繼續尋找下一個相同的字串。
3 {$ t* z \$ c" q+ |1 T' b& ?
; ~) _ d) f- t" w, C L9.資料的連接! q4 c# f* b$ H
J 句子的連接。將游標所在之下一行連接至游標該行的後面。
) }. |* B9 `: k, Y 若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式
2 G5 m2 [6 \; d+ g (可利用a、i等指令)再按《Enter》即可。
$ M5 f" U, C. D+ ~7 B D2 A6 T4 v- h E% e4 v6 d* |
10.環境的設定
% z" n$ L$ L4 t' w7 h :setnu 設定資料的行號。
3 ~) M: d( ^- d7 b- T! J :setnonu 取消行號設定。# u& r$ J& W" R L
:setai 自動內縮。
( t# o* S6 Z# X+ U% ]$ _ :setnoai 取消自動內縮。
4 v& D) ^4 s0 S! ] 自動內縮(automatic indentation)
' W2 [! S n0 H8 ]" J* H9 l 在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自- U: |% Y0 L. g( @; U3 _6 N
動內縮的功能,用下例解釋之:1 D* @& B3 K& E# \# |( A
‧vi test s. Q6 ?0 Q8 E/ Q. |
‧(進入編輯視窗後)
- ^" K" o* d* @ this is the test for auto indent( n5 B( S1 L2 y* A* s- _' w6 W
《Tab》start indent ← :set ai (設自動內縮)2 M8 y ~# O) r2 B7 o
《Tab》data# u! [+ U1 e5 b- m% \
《Tab》data, T& d) h V4 X) `4 ]
《Tab》data ← :set noai (取消自動內縮)
, Z4 ]) f8 T: K l; D/ G0 F the end of auto indent.
4 O9 [ C, L/ w1 ]9 |1 X) ?5 \ ‧註:<Ctrl><d>可刪除《Tab》字元。# t5 Q8 l; Y- o% W: l6 W: |
; X) I3 y2 a. |9 h# H! R
11.ex指令- _0 A1 x+ H0 t5 M$ R
讀寫資料
# L- H( J* C. ]# m6 S1 k5 V. c' o2 U :w 將緩衝區的資料寫入磁碟中。# b: b: b2 N! ^0 K8 c
:10,20wtest 將第10行至第20行的資料寫入test檔案。1 ]! M! {! T" |$ c$ H; d/ U
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。
# I5 e( s1 j o9 X4 b4 j :rtest 將test檔案的資料讀入編輯緩衝區的最後。
8 H }, Z' |1 Y$ |4 ~! k 刪除、複製及搬移
% \, n: r/ H' X; t7 Q :10,20d 刪除第10行至第20行的資料。
* [. e. T* s v :10d 刪除第10行的資料。 A0 W$ N2 U( d* X. F2 X% O5 Z
:%d 刪除整個編輯緩衝區。
4 Z4 j/ i1 l: ~* L :10,20co30 將第10行至第20行的資料複製至第30行之後。
6 T5 b2 t' M" T j& ?$ ^ :10,20mo30 將第10行至第20行的資料搬移至第30行之後。
2 b/ h4 }" |5 B; e 字串搜尋與取代$ _: h2 P- m- [6 `
s(substitute)指令可搜尋某行列範圍。
9 r$ s# ^, n+ I8 T# U$ Y g(global)指令則可搜尋整個編輯緩衝區的資料。9 L, c( O/ \$ }/ r3 M
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
+ }# @/ O' u6 D, Q, S! n5 R5 W 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。
. L9 _# b9 z+ U( N :1,$s/old/new/g 將檔案中所有的『old』改成『new』。' l1 w, Y* x4 b; H
:10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。+ E( F: `2 `* d& D
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。
1 ]1 |) y0 N- W- l0 E+ Y) k
& U$ q9 {! v8 g12.恢復編輯時被中斷的檔案
1 j& }/ H2 G0 p6 c) M) b/ A9 M1 l 在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未( i3 o- b- @0 q) ]: [# l2 A7 @
被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前# [' K/ c" n& g; Y; D
的檔案內容。
" s$ P/ \5 M0 L% A o %vi -r filename8 J& ~ W4 s% B3 E
, F) S3 y" a+ ^1 g; C' s13.編輯多個檔案" Q; U% u" e" G- e
vi亦提供同時編輯多個檔案的功能,方法如下: a& Z* U( [& q. n" B1 e3 W
%vi file1 file2 ..
: x' {, b! }( W5 {6 ~ 當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後: x) V4 n, I V1 ]2 O
再利用 『:n』載入下一個檔案。
; Q% T2 O9 C+ n+ O" l3 C0 M0 ]* ?) D1 G
參考:# z3 q# M, l: K# o, j5 E1 }
, x6 k6 X2 B9 H* o( G+ m$ q
http://chunchaichang.blogspot.tw/2010/08/vim-s.html+ s0 W9 ^6 d1 |8 k/ y6 Z7 \
| 歡迎光臨 52AV手機A片王|52AV.ONE (https://www.52av.one/) |
Powered by Discuz! X3.2 |