2010年1月19日 星期二

Vi 編輯器!!!

這個就重要了!!請務必.....背起來


指令行語法

以下三種形式的指令都可用來啟動 vi

vi file
vi +n file
vi +/pattern file

file 來指定要編輯的檔案,或是加上 n 指定編輯第 n 行,或是尋找符合 pattern 的該行來編輯。若無 file 參數,則 vi 會開一個新的暫存區。關於 vi 的指令列參數詳見第二章。

--------------------------------------------------------------------

指令模式

開啟檔案後,程式就處於命令模式,從命令模式下可以切換至不同模式:

. 進入插入模式
. 執行編輯指令
. 將游標移到別處
. 執行 ex 指令
. 啟動 shell
. 存檔或是直接跳出現在編輯的檔案


--------------------------------------------------------------------

插入模式

插入模式下,可以將文字插入檔案中。按 ESCAPE 鍵就可跳出插入模式,回到命令模式。下列指令可以啟動插入模式:

a              在游標後插入文字。
A              在行尾插入文字。
c              開始更動的動作。
C              更動至行尾。
i              在游標前插入。
I              在行首插入。
o              在目前行下插入一行。
O              在目前行上插入一行。
R              開始覆寫模式。
s              取代一個字元。
S              取代一整行。


vi 指令語法

vi 指令的一般形式如下:

[n] operator[m] object

基本的編輯動作(operator)如下:

c              開始更動。
d              開始刪除。
y              開始複製。

若要動作的目標就是目前所在的行,則 operator object 相同: ccddyy。不然,operator 則做為游標移動指令或是「樣式比對」指令的 objectn m 指定的是動作的次數,或是 object 的數目,也就是動作的對象的數目。若 mn 都有指定,則總效果為 m n


object 可以是下列任何文字區塊

word              字元的集合,其尾端接的是標點符號或是空白。若該單字的第一個字母大寫,則稱為 Capitalized object,其尾僅可接空白。
sentence              word 的集合,其尾端接著「.」、「?」或 「!」加上兩個空白。
paragraph              前兩者的集合,與下個段落之間隔一行空白,或是由 para= 所指定的段落巨集所造成者
section              到下一個由 sect= 指定的標題之前的所有段落文字。


範例:

2cw              更動接下來的兩個單字
d}              將目前到下一段之前的文字都刪除
5yy              複製下面五行
y]]              將下一節(section)之前的文字都予以複製。



--------------------------------------------------------------------
p8-4


狀態列指令

大部份的指令輸入時都不會顯示在螢幕上。不過最下面的狀態欄會顯示下列指令:

/              向後搜尋某一個 pattern
?              向前搜尋某一個 pattern
:              執行 ex 指令。
!              執行 UNIX 指令,而此指令的輸入為暫存區中的 object,而執行完將其輸出取代該object

要在狀態列中執行的指令必需在後面加上 RETURN 鍵。另外,錯誤訊息和 Ctrl-G 指令的輸出也會一併顯示於此。




游標移動指令

在指令前加上數字可指定該指令重複幾次。移動指令也可以當做 object 使用。

字元

hjkl              左右上下。
SPACEBAR              向右。


文字

wWbB              以單字為單位前後移動。
eE                            到單字尾。
)(                            下一行行首 / 本行行首。
}{                            下一段段首 / 本段段首。
]][[                            下一節(section)首 / 本節首。




0$                            本行行首 / 行尾。
^                            本行第一個非空白的字元。
+-                            下一行第一個字元 / 上一行第一個字元。
RETURN                            下一行第一個字元。
n|                            本行第 n 列。
H                            畫面上第一行。
M                            畫面上中間行。
L                            畫面上最底行。
nH                            第一行後 n 行。
nL                            最底行前 n 行。



畫面

Ctrl-FCtrl-B              向下 / 向上一個畫面。
Ctrl-DCtrl-U              向下 / 向上半個畫面。
Ctrl-ECtrl-Y              向下 / 向上一行。
z RETURN              將游標所在之行顯示於畫面第一行。
z .                            將游標所在之行顯示於畫面中央。
z -                            將游標所在之行顯示於畫面最底一行。
Ctrl-LCtrl-R              重繪畫面(不捲頁) 。



搜尋

/text                            向後尋找 text
n                            重複上次的搜尋動作。
N                            反向重複上次的搜尋動作。
/                            重複向後搜尋動作。
?                            重複向前搜尋動作。

?text                            向前尋找 text
/text/+n              text 之後的第 n 行。
?text?-n              text 之前的第 n 行。
%                            尋找對應於目前 ()[] {} 的另一半括號。
fx                            從開頭尋找到本行的 x
Fx                            從結尾尋找到本行的 x
tx                            從開頭尋找到本行的 x 之前。
Tx                            從結尾尋找到本行的 x 之後。
,                            將上次 fFt T 的方向調轉。
;                            重複 fFt T 搜尋。



行號

Ctrl-G                            顯示目前行號。
nG                            到第 n 行。
G                            到檔案最後一行。
:n                            到第 n 行。



位置標記

mx                            將目前位置標為 x
`x                            將游標移到 x 標記處。
'x                            將游標移到 x 標記行的開頭。
``                            回到前一個標記處(或是搜尋之前的位置) 。
''                            同上,但回到行首。


-------------------------------------------------------------------

p8-6


編輯指令

cd y 是基本的編輯指令。

加入新文字

a              在游標後插入文字。
A              在行尾插入文字。
i              在游標前插入。
I              在行首插入。
o              在目前行下插入一行。
O              在目前行上插入一行。
ESC              結束插入模式。
Ctrl-J              向下移一行。
RETURN              向下移一行。
Ctrl-I              加入 tab
Ctrl-T              移到下一個 tab 的設定距離。
BACKSPACE              向前移一個字元。
Ctrl-H              向前移一個字元。
Ctrl-U              刪除目前行。
Ctrl-V              引用下一個字元。
Ctrl-W              向前移動一個單字。

最後四個是由 stty 設定,不同終端機可能不同。




更動與刪除文字

cw              更動單字。
cc              更動行。
C              從游標目前位置更動至行尾。
dd              刪除目前行。
ndd              刪除 n 行。
D              將游標到行尾全部刪除。
dw              刪除單字。
d}              從游標所在刪除至下一段。
d^              從游標所在刪除至行首。
d/pat              刪除至發現 pat 為止。
dn              刪除至下一個 pat
dfa              於本行刪除至 a(包括 a) 。
dta              於本行刪除至 a(不包括 a) 。
dL              刪除至畫面最底行。
dG              刪除至檔尾。
p              將上次刪除的文字插入於游標之後。
P              將上次刪除的文字插入於游標之前。
rx              將字元由 x 取代。
Rtext 將游標所在者由 text 取代。
s              取代一字元。
4s              取代四個字元。
S              取代一整行。
u              恢復上一個動作。
U              恢復本行。
x              將游標所在字元刪除。
X              將游標前一字元刪除。
5X              將游標前五字元刪除。
.              重複上一動作。
~              大小寫相反。



複製與移動

Y              將目前行複製到暫存區中。
yy              複製目前行。
"xyy              將目前行抓取到暫存區 x 中。
"xd              刪除並放入暫存區中。
"Xd              刪除並加到暫存區 x 之尾。
"xp              取出暫存區 x 的內容。
y]]              複製範圍至下一節(section)開頭之前。
ye              複製範圍至單字尾。




存檔與結束 vi

寫入檔案的意思也就是說將檔案的更動存起來並更改檔案的日期時間。

ZZ              跳出 vi,若檔案有更動才存檔。
:x              ZZ
:wq              寫入檔案後跳出。
:w              寫入檔案。
:w file              將檔案寫入 file 中。
:n1, n2w file              將第 n1 行到第 n2 行寫入 file
:n1, n2w >>file              將第 n1 行到第 n2 行接在已存在的檔案 file 之後。
:w!              強制寫入檔案。
:w! file              強制覆寫 file
:w %.new              將目前的 file 檔名加上 new 後儲存。
:q              結束此檔。
:q!              不存入更動的部份,直接跳出。
Q              跳出 vi 並啟動 ex
:vi              Q 指令後跳回 vi
:e file2              不離開 vi 而編輯 file2
:n              編輯下一個檔案。
:e!              將目前檔案恢復至上次存檔之狀態。
:e#              編輯另一個檔案。
%              目前的檔名。
#              另一個檔名。



一次編輯多個檔案

:e file                            編輯 file,目前檔案變成「另一」檔。
:e!                                          將目前檔案恢復至上次存檔之狀態。
:e + file              file 檔尾開始編輯。
:e +n file              file 的第 n 行開始編輯。
:e #                            回到另一個檔案最後離開的位置。             
:ta tag                            編輯 tag 的位置。
:n                                          編輯下一個檔案。
:n!                                          強制到下個檔案。
:n files              指定新的一群 files
Ctrl-G              顯示目前檔名與行號。
:args              顯示所有載入的檔案。
:rew              顯示所有檔案列表開頭。



p8-8

UNIX 互動

:r file                                                        file 讀入並置於游標後。
:r !command                                          command 的輸出置於本行之下。
:nr !command                            同上,但置於第 n 行之下(第一行編號為 0) 。
:!command                                          執行 command 然後回到 vi
!object command                            object 當做 command 的輸入,並將 object command 的輸出取代。
:n1,n2! command               將第 n1 到第 n2 行當做 command 的輸入,並將 object command 的輸出取代。
n!!command                            n 行當做 command 的輸入,並將 object command 的輸出取代。
!!                                                        重複上一個系統指令。
:sh                                                        啟動子 shell,用 EOF 回到 vi
Ctrl-Z                                          暫停編輯器,用 fg 回到 vi(有些版本不支援此功能)。
:so file                            file 讀入指令並執行。




巨集

:ab in out              in 當做是 out 的縮寫。
:unab in              in 的縮寫意義移除。
:ab                                          列出縮寫。
:map c sequence              c 當做 sequence 指令串的別名。
:unmap c              取消 c 的別名。
:map                            列出所有當做別名的字元。
:map! c sequence              c 當做輸入模式 sequence 的別名。
:unmap! c              取消輸入模式別名(可能需要用 Ctrl-V 來引用該字元) 。
:map!                            列出輸入模式別名字元。

下列字元並不用於指令模式,可用來定義成使用者自訂指令:

字元:              g K q V v
Control 鍵:              ^A ^K ^O ^T ^W ^X
符號:              _ * \ =

(若設定成 Lisp 模式,則vi會使用 = 符號)




其他指令

J              合併兩行。
:j!              合併兩行,保留原有的空白。
<<              將此行向左移一個 shift 長度(預設為 8 個空白) 。
>>              將此行向右移一個 shift 長度(預設為 8 個空白) 。
>}              向右移至段落尾。
<%              向左移至相對應的 () [] 或是 {}。游標必需在括號上。



p8-9

按鍵列表


a              在游標後插入文字。
A              在行尾插入文字。
^A              未使用             

b              回到行的最前面
B              回到行的最前面,忽略標點符號
^B              向上一個畫面

c              開始更動的動作。
C              更動至行尾。
^C  在指令模式中未使用;用來結束插入模式

d              開始刪除。
D              將游標到行尾全部刪除。
^D              向下 / 向上半個畫面。

e              到單字尾。
E              到單字尾,忽略標點符號。
^E              在視窗的底部再顯示一行

f              找出目前這一行上緊跟在f之後的字元:往後
F              找出目前這一行上緊跟在F之後的字元:往前
^F              向下捲動一個畫面

g              為使用
G              到某一行或是檔案的結尾
^G              在狀態列上印出與檔案相關的資訊

h              向左移動
H              畫面上第一行。
^H              向左移動;在插入模式中是Backspace

i              在游標前插入。
I              在行首插入。
^I              指令模式中未使用;在插入模式中其功能相當於TAB

j              向下移動
J              將兩行連接起來
^J              向下移動;在插入模式中其功能是向下移動一行

k              向上移動
K              未使用
^K              未使用

l              向右移動
L              畫面上最底行             
^L              重繪畫面

m              將目前位置標為 x
M              畫面上中間行
^M              積架返回

n              重複上一個搜尋指令
N              重複上一個搜尋指令,但是以相反的方向
^N              向下移動


o              在目前行下插入一行。
O              在目前行上插入一行。
^O              未使用

p              將上次刪除的文字插入於游標之後。
P              將上次刪除的文字插入於游標之前。
^P              向上移動

r              將游標目前所在的字元換成緊跟在r之後的字元
R              開始覆寫模式。
^R              重繪畫面

s              取代一個字元。
S              取代一整行。
^S              未使用(在某些終端機上的功能是停止資料流動)

t               將游標往後移到緊跟在t之後的字元之前。
T              將游標網錢移到緊跟在t之後的字元之後。
^T              在指令模式中未使用,在插入模式中用來設定是否要自動縮排(autoindent

u              恢復上次所做的改變
U              恢復游標所在的那一行行的內容,忽略所有的改變
^U              將螢幕向上捲動半個畫面

v              未使用
V              未使用
^V              在指令模式中未使用:在插入模式中,其功能是用來將下一個字元括起來(quote

w              移動到下一個字的開頭
W              移動到下一個字的開頭,忽略標點符號
^W              在指令模式中未使用;再插入模式中是用來移動到字的開都。

x              刪除游標所在位置的字元
X              刪除游標之前的字元
^X              未使用

y              拷貝
Y              將目前行拷貝起來
^Y              在視窗的上面再顯示一行

z               將游標所在的那一行重新顯示在畫面的「適當」位置上,z之後必須接:
RETURN              將游標所在之行顯示於畫面第一行。
              .                            將游標所在之行顯示於畫面中央。
              -                            將游標所在之行顯示於畫面最底一行。
             
ZZ              離開編輯器,並且儲存所做的改變
^Z              暫停vi編輯器(只有在具有job控制的系統上才會發揮作用)




設定 vi

本節要點如下:

:set 指令
set 的選項
.exrc 範例


-------------------------------------------------------------------

:set 指令

:set 指令可用來設定編輯器內的環境。可在 vi 編輯器內執行或是放入。exrc 中。若放入 .exrc 則不可加上 :

:set x              將選項 x 打開。
:set nox              關閉選項 x
:set x=val              將選項 x 設定為 value
:set              顯示更改過的選項。
:set all              顯示所有選項。
:set x?              顯示選項 x 的值。


-------------------------------------------------------------------

set 的選項

下表列出 set 所設定的選項。第一欄包括縮寫,若加上 =,則表示選項可接受設定值。第二欄為其預設值,第三欄則為其說明。




<<<<<排版注意: 不翻第一第二欄 ,just codes,第三欄一個一個接著寫 ,用 -- 分開 >>>>>>

選項               預設               說明

插入模式下,將每行的縮排設定為和上一行或下一行一樣,與 shiftwidth 一同使用。
--
每次指令後顯示所修改的部份。(全文取代或是顯示上一次取代時用)
--
使用 :n 開另一檔案或是用 :! 執行 UNIX 指令之前,若檔案有所更動會自動儲存目前檔案。
--
除了 tab,換行和換頁以外,在輸入模式下忽略一切特殊符號。
--
指定 ex 儲存暫存區的目錄,該目錄的寫入權限必需打開
--
取代指令採類似 ed 的功能
--
有錯誤時發出聲音
--
可執行不在使用者目錄內的.exrc
--
定義終端機 tab 鍵的界限
--
搜尋時不管大小寫
--
設定縮排為 lisp 模式。()[][[]] 則設定為在 lisp 中有意義。
--
tab 顯示為 ^I; 於每行行尾印出 $ 符號。(list 指令可看出行尾符號是 tab 還是 space
--
萬用字元 .* [] pattern 中有意義
--
進行編輯時,允許系統訊息顯示在終端機上
--
編輯時於畫面左方顯示行號
--
可從 ex 進入開啟模式
--
一次印出多行時取消每行後的換行符號,在 dumb 終端機上顯示時可加速顯示速度。
--
定義 { 或是 } 移動時的段落邊界字元。值中的每對字元代表的是 nroff/troff 用來開始一個新段落用的巨集名稱。
--
使用 Q 指令後顯示 ex : 提示符號
--
除非在寫入指令(如 ZZw autowrite)後加上 !,否則不可寫入。
--
一有更動馬上重繪畫面。預設值取決於終端機種類和連線的速率。若速率慢加上使用 dumb 終端機時,最好用 noredraw。刪除的行表為 @,而插入的文字在按了 ESC 後才會顯示為插入,否則顯示為覆寫到後面的文字上。
--


p8-13


允許巢狀別名
--
每更動超過某一定的行數後,就顯示一個訊息。比如 6dd 顯示 "6 lines deleted"
--
每次捲動多少畫面
--
定義 [[ ]] 移動時的節(section)邊界字元。值中每對字元都是 nroff/troff 所使用的開始新節的巨集。
--
用於 :! :sh 指令的 shell 路徑。預設值由 SHELL 變數中取得,不同的系統可能會有不同的值。
--
使用 autoindent 選項時,本選項所指定的即為反向 tab^D)的長度。
--
vi 中 ,若打入 ) 或是 },則游標會快速移動到相應的 ( { 上,然後再移回來。若無相對應的括號,則發出錯誤聲。程式設計常用。
--
插入模式中,在下方顯示目前的模式。如 "Open mode""Append Mode" 等等。
--
插入時不重繪畫面,預設值取決於連線速度與終端機種類
--
定義編輯時一個 tab 的長度。印表機仍使用 8 個空白。
--
定義一個 tag 中的有效字元數。定為 0 的話,則整個 tag 都要檢查,也就是每個字元皆有效。
--
定義含有 tag 之檔案的路徑(見 UNIX 指令 ctags)。預設尋找目前目錄下的 tags /usr/lib/tagbs
--
設定終端機形式。
--
顯示較短的錯誤訊息。
--
一秒後鍵盤對應失去效用。
--
設定終端機形式。
--


p8-14

顯示訊息,"No write since last change"
--
在畫面上顯示的行數,值取決於終端機和連線速率。
--
定義右邊線,若大於 0,超過長度的行就會自動加上換行符號變成兩行。
--
搜尋到尾時會從頭再繼續,反向亦然。
--
可儲存到任何檔案中。
--

沒有留言:

張貼留言

推到 Twitter!
推到 Plurk!
推到 Facebook!