tid=95& 本帖最後由 IT_man 於 2017-5-6 23:16 編輯 9 ~2 B9 U& P% S, X2 L
; @% J+ H" h. w ?
vi指令說明(完整版)
& F! c; z3 `1 q2 ?1 c8 c- vi 的操作模式
6 Z" b0 ^# g7 {, y
* m$ H0 ]& ?5 V7 z" A/ \5 K7 T
vi 提供兩種操作模式:輸入模式(insert mode)和指令模式(command mode)。當使用者進入 vi 後,內定即處在指令模式下,此刻鍵入之任何字元皆 被視為指令。在此模式下可進行刪除、修改等動作。若要輸入資料,則需進入輸入模式。 - 輸入模式/ F5 q% R* D6 X& L9 y# T/ l
b- j) Q1 w7 t4 `5 k* J( I+ [ 如何進入輸入模式
6 `- e7 F# k3 q/ m3 z$ }6 M a (append) 由游標之後加入資料。( ^7 p0 H& N3 O" {0 N
A 由該行之末加入資料。
, l5 `9 _2 p5 o7 r# k i (insert) 由游標之前加入資料。
# L0 Z# g* c' g5 x9 K4 S1 } I 由該行之首加入資料。! y' O! v5 \; w3 a! y5 [3 c; [3 d
o (open) 新增一行於該行之下供輸入資料之用。
( h) l! h3 a$ C4 W" {. z0 x) x O 新增一行於該行之上供輸入資料之用。
% J( N, E) O* z& O 如何離開輸入模式
. j; D+ U; g- Q) a3 y( R- ? 《ESC》 結束輸入模式。
7 ]9 s% O: R0 G0 C! T# t3 \9 m
7 I2 \7 {2 H: h: W! m# f$ \2 C1.游標之移動
1 Q" @5 U9 B* n4 C0 P& h6 k2 `0 `' D h 向左移一個字元。+ ?, `2 M! j; `/ l4 x/ R! u N, |
j 向上移一個字元。( M8 \( z5 S# ]( Z' y+ t0 ]
k 向下移一個字元。
; |* {* ~6 v+ p/ ]: X/ |5 q- Y l 向右移一個字元。" Y4 F+ X8 G1 i8 Q7 n9 v
0 移至該行之首* }4 n1 J) w5 Q9 m# Q: W$ ]
$ 移至該行之末。% w" n( v1 c# v5 H' B) ?
^ 移至該行的第一個字元處。5 y. n7 ]+ M% |( D( n
H 移至視窗的第一列。1 h0 J, `! [4 O0 f% Q
M 移至視窗的中間那列。4 T9 [& ^; ?3 S3 B9 l
L 移至視窗的最後一列。
3 ^. w b" m0 W* c/ J9 L$ { G 移至該檔案的最後一列。
3 E2 P$ R% ^8 b2 B( h + 移至下一列的第一個字元處。) P$ Q2 e: w3 \5 ~6 n
- 移至上一列的第一個字元處。4 q" z# R* [0 l* l7 @! p0 ]! B
( 移至該句之首。 (註一)* H/ h( n: k6 C J5 G
) 移至該句之末。) m+ O% P: o& t+ m
{ 移至該段落之首。 (註二)
1 b3 H+ q- X/ x7 T0 B# V+ x* W' \ } 移至該段落之末。
4 v% h9 l: I3 S* h/ V nG 移至該檔案的第 n 列。" @: X, ?9 a6 `! a# y$ [+ R
n+ 移至游標所在位置之後的第 n 列。
, D# } g+ F3 R2 q n- 移至游標所在位置之前的第 n 列。
) U W- N1 X4 F# f s5 F: }! ? <Ctrl><g> 會顯示該行之行號、檔案名稱、檔案中最末行之行號、游標所在行號佔總行號之百分比。
7 r& e' h# _/ M' q 註一:句子(sentence)在vi中是指以『!』、『.』或『?』結束的一串字。
" d- E% R$ g+ e' x 註二:段落(paragraph)在vi中是指以空白行隔開的文字。
: J8 j- a$ T0 m7 b8 r1 t2 V" J4 e& I2 C; ]( O" x) K3 b3 @
2.視窗的移動 <Ctrl><f> 視窗往下捲一頁。
( Q; f1 T' _& Q, F3 R/ x5 r <Ctrl><b> 視窗往上捲一頁。
0 G& y* T8 r. i$ E- h p <Ctrl><d> 視窗往下捲半頁。
9 K; h+ ^; y* k9 a <Ctrl><u> 視窗往上捲半頁。
/ K- C8 q1 {9 g8 r; b$ B <Ctrl><e> 視窗往下捲一行。/ t2 v" s; H( a* g
<Ctrl><y> 視窗往上捲一行。6 _ G1 Y; C4 t' i' G
* U0 w! L+ h; k/ P8 Z3.刪除、複製及修改指令介紹 (此單元較少使用)2 @- M7 r* J) M$ i' _ |6 ~- [
d(delete)、c(change)和y(yank)這一類的指令在 vi 中的指令格式為:7 X. M J9 ]3 r# S+ g" K
Operator + Scope = command, `. W) Z+ {+ K, b
(運算子) (範圍), m; T; Y6 ]/ G* H4 h$ z# k' B
運算子:5 w1 j- I7 C3 i* c# j
d 刪除指令。刪除資料,但會將刪除資料複製到記憶體緩衝區。
8 F: t5 `2 E' s5 U y 將資料(字組、行列、句子或段落)複製到緩衝區。
! b3 A! d+ f3 z' e" g5 \ p 放置(put)指令,與 d 和 y 配和使用。可將最後delete或yank的資; G* }" C9 R; U$ N# G* h
料放置於游標所在位置之行列下。
0 z) K( ]0 F. A5 C" O& x0 a+ p: ~ c 修改(change)指令,類似delete與insert的組和。刪除一個字組、句
2 o. r: G/ W+ o( r# T6 e 子等之資料,並插入新鍵資料。
* y# Q5 y4 p/ X- J: |5 ? 範圍:
8 o' ^% `" Q Q& h2 R7 C( ]1 C) b! F- C e 由游標所在位置至該字串的最後一個字元。
" a$ ~- s0 X( e6 C% Z; s( v3 B w 由游標所在位置至下一個字串的第一個字元。
" t2 N) A1 o2 d6 S1 ?' \$ [8 ~" i b 由游標所在位置至前一個字串的第一個字元。
( Q; Q2 V3 u0 ^/ g4 I $ 由游標所在位置至該行的最後一個字元。) H$ I9 |: b) g/ H+ u6 D
0 由游標所在位置至該行的第一個字元。" G! q9 n: t% {* J
) 由游標所在位置至下一個句子的第一個字元。
$ Q$ j; y, R# j4 J2 E3 [1 I ( 由游標所在位置至該句子的第一個字元。1 J1 y K, ~$ `
{ 由游標所在位置至該段落的最後一個字元。
; f) W. n" V" G" H- x } 由游標所在位置至該段落的第一個字元。
3 g e( x# O/ K& U% c* c 整行動作* z, @+ ~% V2 d# j0 d
dd 刪除整行。/ |9 Z* @! H6 A' J, l
D 以行為單位,刪除游標後之所有字元。* ^6 ~7 ?% |+ U8 \! @
cc 修改整行的內容。
+ s. g9 O6 b! O yy yank整行,使游標所在該行複製到記憶體緩衝區。) J9 U5 J0 X f" _( M3 [
' O0 r c3 l! R& U# z" ^4.刪除與修改
2 L$ ?: E* U* [) ~3 m; j. v4 V) R x 刪除游標所在該字元。; e& \& Q g/ n
X 刪除游標所在之前一字元。
0 U1 X# g. ~, ^. e2 [, o* D dd 刪除游標所在該行。
( c0 p9 S6 l* Z% M: R+ u r 用接於此指令之後的字元取代(replace)游標所在字元。
; c) R' r8 e4 @# g3 G9 @ 如: ra 將游標所在字元以 a 取代之。
& h5 K' l2 `, P! ^& o' u. z- K R 進入取代狀態,直到《ESC》為止。+ `) E: C; o [% @0 K0 q3 I
s 刪除游標所在之字元,並進入輸入模式直到《ESC》。
: \* f- \8 z v+ J& H& T/ E3 i S 刪除游標所在之該行資料,並進入輸入模式直到《ESC》。0 ]3 d8 R$ k! P! ^9 u
; i) s& Y# [+ x& ^% r5.搬移與複製; B W- T; c5 M
利用delete 及 put 指令可完成資料搬移之目的。: Y4 H% ~8 y" q8 R
利用yank 及 put 指令可完成資料複製之目的。* z! k' M+ c; b8 X5 A
yank 和delete 可將指定的資料複製到記憶體緩衝區,而藉由 put 指令# Z3 V; K7 u, ]! E8 E
可將緩衝區內的資料複製到螢幕上。
! W2 t+ \5 K; A2 h& I; O% } 例:0 x4 }- G; v4 w: I Y
搬移一行 ‧在該行執行 dd8 W- P+ X0 j- i
‧游標移至目的地
* b# F E+ Y) l+ \ ‧執行 p% n$ p! Y1 J8 }5 E3 b4 }. v6 m
複製一行 ‧在該行執行 yy' V$ R) X# [! z+ W8 g2 R
‧游標移至目的地
( P+ s% V' h1 i u0 p ‧執行 p3 _1 g7 v# b* V! W2 S2 r" X
2 J2 c- D9 j# v* C6 X( ?
6.指令重複) i; p/ C* N1 m2 s
在指令模式中,可在指令前面加入一數字 n,則此指令動作會重複執行 n2 B& O3 n, b/ I/ `
次。
* ]9 P! K4 i3 t3 a, Y) P$ P 例:
2 J- C5 x; V: G" } L7 h& y, k 刪除10行 ‧10dd
# i4 S# D& B$ u; f) i 複製10行 ‧10yy* l) b N( T) a" K' e
‧游標移至目的地
0 O+ J" S/ H. X2 b ‧p0 N ]% \. N/ | q3 [! T& F$ O# d
指標往下移10行 ‧10j
# V/ p3 }$ \/ N# }
6 M1 m$ t6 t- _) p X: I; C7.取消前一動作(Undo)9 R" h, o0 Y E; L+ t% s* T
即復原執行上一指令前的內容。0 ^7 K; J* }* p4 S/ N& n+ L+ G
u 恢復最後一個指令之前的結果。 |/ b m2 C$ b! X8 x3 m
U 恢復游標該行之所有改變。; C' n) c7 J" R$ K
% c) d2 k" c% t* ]% u V
8.搜尋. x% ]+ F0 Y/ y
在vi中可搜尋某一字串,使游標移至該處。
1 x! s# i& F0 P, X. [ /字串 往游標之後尋找該字串。6 Y. G1 S* A6 o; c- ]& F% U: M- a
?字串 往游標之前尋找該字串。
) u8 W/ r! M# A6 N) A1 Q n 往下繼續尋找下一個相同的字串。+ R" y; a7 i k% ]& U; E
N 往上繼續尋找下一個相同的字串。5 ~! c! G2 o+ g: E6 ^- R
" T2 J' c- R+ j
9.資料的連接 [: O- s7 h* T! @8 w
J 句子的連接。將游標所在之下一行連接至游標該行的後面。& b( h, i* x0 n; X! e
若某行資料太長亦可將其分成兩行,只要將游標移至分開點,進入輸入模式, i7 @% _5 b X
(可利用a、i等指令)再按《Enter》即可。
- w: D* P( m9 F @6 z1 ?# \, w6 K# ]1 E
10.環境的設定/ [. a. x% R: H6 i* a# b
:setnu 設定資料的行號。
N, n) j) v6 w5 B$ w& a. n :setnonu 取消行號設定。, C, m3 d g# i" E/ S6 j" s
:setai 自動內縮。( }( t5 v, K9 d( {$ u& N8 C* T
:setnoai 取消自動內縮。' \. b. f' _. C" u3 `* I
自動內縮(automatic indentation)" \# a- T) k% |, w9 i' @
在編輯文件或程式時,有時會遇到需要內縮的狀況,『:set ai』即提供自: C" |! i$ R* T, d
動內縮的功能,用下例解釋之:% L4 @8 A3 O: b' q. T, w' s: x3 l
‧vi test
5 I0 {! `' k; T. L# c1 L ‧(進入編輯視窗後)
, B' H4 l. |: x4 s6 Y- U this is the test for auto indent
4 l7 V$ m/ H7 d 《Tab》start indent ← :set ai (設自動內縮)" R* z- W- K2 j' J
《Tab》data
5 m6 `. n I% W: n# B7 n+ B2 A. ^ 《Tab》data
' q2 P7 t3 ~. C( r4 d 《Tab》data ← :set noai (取消自動內縮), o+ y+ \; r! B' C
the end of auto indent. f* h L! `" Z( |' W
‧註:<Ctrl><d>可刪除《Tab》字元。
' g+ b; s; c. s- ~ E+ Z9 c5 J( `7 \ y2 H4 t! O
11.ex指令
. K7 [# V6 H) t4 f/ c# F+ n* r 讀寫資料# \, u, V& e- G, Q, i
:w 將緩衝區的資料寫入磁碟中。, p r* U) i% }% r" h
:10,20wtest 將第10行至第20行的資料寫入test檔案。 E, k3 Y9 l! i+ E% W) d# b8 u
:10,20w>>test 將第10行至第20行的資料加在test檔案之後。
$ B2 \0 \/ u6 M2 u$ ?/ s& { :rtest 將test檔案的資料讀入編輯緩衝區的最後。
: M7 I# k' \2 p. m& T6 K 刪除、複製及搬移
- I4 M! F" c) k. }2 ?) @ :10,20d 刪除第10行至第20行的資料。
2 h9 K2 c. k" Y7 E* E :10d 刪除第10行的資料。6 @7 D8 N4 M7 Y( p. }# ^7 H
:%d 刪除整個編輯緩衝區。
2 B- [; k" f# m, i" ` :10,20co30 將第10行至第20行的資料複製至第30行之後。8 W, N K! x6 h
:10,20mo30 將第10行至第20行的資料搬移至第30行之後。& Q$ C( ^" J: g V) p
字串搜尋與取代4 t! {* M3 {/ g
s(substitute)指令可搜尋某行列範圍。
' { J; }* V: N0 n3 p, @ g(global)指令則可搜尋整個編輯緩衝區的資料。+ D" \8 i) h% B5 U8 |6 D
s指令以第一個滿足該條件的字串為其取代的對象,若該行有數個滿足該條
3 Z8 h$ N3 N, n* |. K7 ^ 件的字串,也僅能取代第一個,若想取代所有的字串則需加上g參數。' k, |8 Z& ]4 b/ \$ u
:1,$s/old/new/g 將檔案中所有的『old』改成『new』。
, c, Q! Z6 F! v3 Y. a4 H% c3 | :10,20s/^/ / 將第10行至第20行資料的最前面插入5個空白。$ x4 m4 _* F& {6 g' i b- Y3 z
:%s/old/new/g 將編輯緩衝區中所有的『old』改成『new』。& u) W4 w; ?) O! x# T
a: h* D) X2 h. T0 g4 s( j12.恢復編輯時被中斷的檔案$ W: ~( Z) ^; ?* L; F+ x0 z/ k4 _- K$ Q* I
在編輯過程中,若系統當掉或連線中斷,而緩衝區的資料並還未
2 V0 i1 ~3 r- c5 G/ M1 Q8 @: P3 A 被寫回磁碟時,當再度回到系統,執行下列指令即可回復中斷前
0 \+ U6 a; y5 m3 { 的檔案內容。4 z# D5 {. e: }" A
%vi -r filename
" I6 }; }, ]3 @7 T/ h* G3 \& l5 M( v5 r z
13.編輯多個檔案" E7 T X9 d" l3 g
vi亦提供同時編輯多個檔案的功能,方法如下:& R6 ], c- F. j
%vi file1 file2 ..5 g$ ~, H7 g* B8 ~% h/ A$ {
當第一個檔案編修完成後,可利用『:w』將該緩衝區存檔,而後
( M- F4 k+ F0 L9 p3 h# P 再利用 『:n』載入下一個檔案。
& h' W7 R& }7 f: U8 X$ l( { N$ k7 X: M+ Z
參考:
' D: Z0 b- ?' k9 H) h4 a' W8 C: A$ ~6 D9 N, u! j
http://chunchaichang.blogspot.tw/2010/08/vim-s.html
1 n$ H+ K9 I; W/ v( N2 u) B |