ex 指令語法
若要從 vi 中使用 ex 指令,使用方法如下:
:[address] command [options]
一開頭的 : 表示是個 ex 指令。每打入一個字,就會顯示在狀態欄中。按下 ENTER 後就會開始執行該指令。address 表示的是要把 command 用在其所表示的行號或是行的範圍。options 和 address 會在後面說明。Ex 指令在指令解說中有詳細說明。
要跳出 ex 可用下列指令:
:x 儲存修改過的部份然後跳出。
:q! 不儲存任何東西直接跳出。
:vi 跳出後進入 vi 編輯器。
選項(Options)
! 改變指令的預設動作。
count 指定該指令所要重複執行的次數。與 vi 指令不同的是,不可將 count 置於指令之前,因為那樣是指定作用行號的用法。如 d3 表示重複三次刪除的動作,而 3d 表示將第三行刪除。
file 指令所作用的檔案。% 表示目前的檔名,# 表示前一個檔案的名稱。
------------------------------------------------------------
行號(Addresses)
若不指定行號,則指令用於目前所在的行。若要指定一個範圍,語法如下:
x,y
x 表示開頭的行號,y 為結尾的行號。暫存區中 x 必須存在於 y 之前。x 和 y 可以是數字也可以是特殊符號。若不用 "," 而用 ";",則將目前行號定為 x 之值。1,$ 表整個檔案中的每一行,% 的意義也相同。
------------------------------------------------------------
行號特殊符號
1,$ 檔案中的每一行。
% 同上。
x,y 第 x 行到第 y 行。
x;y 同上,但將目前行號設定為 x。
0 檔頭。
. 目前行。
n 第 n 行(檔案中的絕對行號)。
$ 最後一行。
x-n 第 x 行前 n 行。
x+n 第 x 行後 n 行。
-[n] 目前行的前一行或是前 n 行。
+[n] 目前行的後一行或是後 n 行。
'x 以 x 為標記的行。
'' 下一個標記。
/pattern/ 往後跳到有 pattern 的行。
?pattern? 往前跳到有 pattern 的行。
有關 pattern 請見第六章
指令解說
ex 指令在使用時可以用縮寫。列表中的指令明稱欄是指令全名,語法中用的是縮寫版。指
令範例均假設在 vi 中使用,所以都加上 ":"。
--------------------------------------
ab [string text]
將 text 定義為 string 縮寫。若不指定 string 和 text,則列出所有的縮寫。
範例:
注意,在 ^V 後按 ENTER 會出現 ^M。
<<<<<< code >>>>>>>>>
--------------------------------------
[address]a [!]
text
.
將 text 接在指定的 address 後面,若不指定 address,則接在目前行後。"!" 會影響自動縮排的效果,若使用時 autoindent 開啟,加上 ! 會關掉自動縮排。
--------------------------------------
ar
印出檔名參數(即要編輯的檔案名稱)。目前的參數以 [] 括起來。
--------------------------------------
[address] c[!]
text
.
將指定的行以 text 取代。! 會開關自動縮排功能。
--------------------------------------
[address] co destination
將 address 指定的行內容複製到 destination 指定的行去。t 指令有相同的效果。
範例:
:1, 10 co 50
--------------------------------------
[address] d [buffer]
將 address 所指定的行刪除。若指定 buffer,則將刪除的行存入或是接在 buffer 的文字後。
範例:
:/Part I/,/Part II/-1d 將 Part II 之前的行都刪除。
:/main/+d 將 main 下一行刪除。
:.,$/d 自目前行以後全部刪除。
--------------------------------------
e[!] [+n] [file]
開始編輯 file。若加上 !,則略去目前檔案所做過的任何修改。若不指定 file,則將目前檔案複製一份然後編輯。+n 參數可以指定從第 n 行開始編輯。
範例:
:e file
:e#
:e!
--------------------------------------
f [filename]
將目前檔名改為 filename。此時這個檔案會視為 " 未編輯 "。若不指定檔名,則印出目前狀態。
範例:
:f %.new
--------------------------------------
[address]g[!]/pattern/[commands]
尋找含有 pattern 的行並對這些行執行 commands,或是指定 address 中的行號來執行 commands。若無 commands,則列出符合條件的行。若使用 !,則將 commands 作用在 " 不符合"pattern 或 address 的行。
範例:
:g/Unix/p
:g/Name:/s/tom/Tom/
--------------------------------------
[address] i[!]
text
.
將 text 插在 address 前一行中,或是不指定 address 時插入目前行中。! 可用來開關自動縮排。
--------------------------------------
[address]j[!] [count]
將指定 address 範圍內的文字放入同一行。而空白的部份會調整為:句號後有兩個空白,而 ) 後無空白,而其他狀況下單一空白。! 號可以關閉空白字元的調整。
範例:
:1,5j! 將第一到第五行合併,並且保留原有的空白字元,不作任何調整
--------------------------------------
[address] k char
將指定的行標記為 char。可用 'x 跳到指定的標記去。
--------------------------------------
[address] l [count]
列印指定的行。tab 會顯示為 ^I,而行尾以 $ 顯示。l 的作用和 :set list 相同,但一次僅影響該次指令執行的行。
--------------------------------------
map[!] [char commands]
將一系列的 commands 定義為鍵盤巨集,而以 char 為其名稱。char 可以是單一字元或是 #n 來代表功能鍵。! 是用來定義輸入模式的巨集。若不加參數,則列出目前的巨集。
範例:
:map K dwwP 調換兩個單字。
:map q :w^M:n^M 寫入目前檔案並切換至下一個檔案。
:map! + ^[bi(^[ea) 將前一個字加上括號。
--------------------------------------
[address] ma char
將指定的行標記為 char。可用 'x 跳到指定的標記去。和 k 相同。
--------------------------------------
[address] m destination
將 address 指定的行搬到 destination 指定的行號去
範例:
:.,/Note/m /END/ 將文字移到含 END 的行後。
--------------------------------------
n[!] [[+command] filelist]
編輯下一個由指令行參數指定的檔案。用 args 可列出這些檔案。若指定 filelist,則將目前檔案列表由 filelist 代替,並編輯第一個檔案。若有 command 參數,則在開啟第一個檔案後執行 command。
範例:
:n chap* 開始編輯所有chap開頭的檔案
--------------------------------------
[address] nu [count]
將 address 所指定的行印出,行號使用的是暫存區行號。# 也有同樣的作用。count 表示要列出的行數。
--------------------------------------
[address] o [/pattern/]
啟動 vi 的開啟模式,開始的行號由 address 指定或是尋找含 pattern 的行。用 Q 指令來進入或跳出開啟模式。開啟模式下可使用一般的 vi 指令,但一次只能用一行。常用在慢速連線上。
--------------------------------------
pre
將目前的暫存區做緊急存檔。
--------------------------------------
[address] p [count]
將 address 指定的行印出。count 用來指定要印出幾行。P 也有一樣的功能。
範例:
:100;+5p 印出第 100 行與其後 5 行
--------------------------------------
[address] pu [char]
將已刪除或是移除(yank)的行內容從 char 暫存區中取回,並置於 address 後一行。若不指定 char,則恢復上一次刪除的內容。
--------------------------------------
q[!]
結束目前的編輯階段。若加上 !,則從上次存檔後的任何修改都予以略去。若此次編輯階段有些檔案並未編輯過,則用 q! 或是按兩次 q 來跳出。
--------------------------------------
[address] r file
從 file 中把文字讀入並置於 address 行下。若無 file 參數,則為目前檔案。
範例:
:0r $HOME/data 將檔案讀入置於目前檔案之開頭。
--------------------------------------
[address] r !command
將 UNIX 指令 command 的輸出讀入並置於 address 行後。
範例:
:$r !cal 將檔尾接上一個日曆。
--------------------------------------
rec [file]
從系統備份中取回 file 檔案。
--------------------------------------
rew[!]
將指令行參數 " 跳回 " 第一個並開始編輯第一個檔案。加上 ! 的話會略過目前檔案未存檔的修改。
--------------------------------------
se parameter1 parameter2 ...
將指定的選項改為 parameter1 之值,若不加任何參數,則列出修改過的選項。若是布林值的選項,可指定為 option 或是 nooption。其它的選項則以 option=value 的方式予以指定。指定 all 可列出所有設定。
範例:
:set nows wm=10
:set all
--------------------------------------
sh
啟動一個新的 shell。shell 結束後回到編輯器。
--------------------------------------
so file
從 file 中讀取內容並執行其 ex 指令。
範例:
:so $HOME/.exrc
--------------------------------------
[address] s [/pattern/replacement/][options][count]
將指定行中每個 pattern 都以 replacement 代替。若不指定 pattern 和 replacement,則重複上一次的替代動作。count 指定從 address 開始要替代多少行。見第六章的使用例。
Options
c 每個替代動作執行前先確認。
g 將每行中的每個 pattern 都予以替代。
p 印出替代動作的最後一行。
範例:
:1, 10s/yes/no/g 對前 10 行進行替代。
:%s/[Hh]ello/Hi/gc 替代前確認。
:s/Fortran/\U&/ 3 將後面三行中的 Fortran 轉為全大寫。
--------------------------------------
[address] t destination
將 address 指定的行內容複製到 destination 指定的行去。t 是 copy 的別名。
範例:
:%t$ 將檔案複製後加到最後去。
--------------------------------------
[address] ta tag
將編輯的檔案切換到含有 tag 的檔案去。
範例:
先執行 ctags,然後切換到有 myfunction 的檔案去:
:!ctags *.c
:tag myfunction
--------------------------------------
una word
將 word 從縮寫表中移除。
--------------------------------------
u
將前一個編輯指令的動作取消。
--------------------------------------
unm[!] char
將 char 從鍵盤巨集中移除。加上 ! 則移除輸入模式的巨集。
--------------------------------------
[address] v/pattern/[commands]
在所有不含 pattern 的行上執行 commands。若不指定 commands,則列出這些行。v 和 g! 相同。
範例:
:v/#include/d 除了 #include 的幾行外全部刪除。
--------------------------------------
ve
印出目前編輯器的版本與最後更新日期。
--------------------------------------
[address] vi [type][count]
將 address 所指定的行以 vi 來編輯。可用 Q 跳出。type 可以是 -、^ 或。(見 z 指令) count 指定的是一開始的視窗大小。
--------------------------------------
vi [+n] file
將 file 檔案以 vi 開始編輯,可用 n 指定從第 n 行開始。
--------------------------------------
[address]w[!][[>>] file]
將 address 指定的行寫入到 file 中,或是無 address 時將整個暫存區都寫入。若無 file 參數,則將暫存區存入目前檔名中。若使用 >>file,則將暫存區內容附加於現有檔案之尾。!可強迫存入,取代目前的檔案內容。
--------------------------------------
[address] w !command
將 address 指定的行寫到 command 指令中。
範例:
:1, 10w name_list 將前 10 行寫入 name_list
:50w >> name_list 將第 50 行附到 name_list 之後
--------------------------------------
wq[!]
寫入檔案後跳出。! 會強迫存入檔案,取代目前現有的檔案。
--------------------------------------
x
若檔案在上次寫入後曾修改過,則存檔後跳出。
--------------------------------------
[address] ya [char][count]
將 address 指定的幾行 " 拿 " 到 char 指定的暫存區中。若不指定暫存區,則放入一般暫存區中。count 指定要 " 拿 " 的行數,從 address 開始算。
範例:
:101,200 ya a
--------------------------------------
[address] z [type] [count]
印出一個文字視窗,address 所指定的行置於最頂端。count 指定印出的行數。
Type
+ 將指定行置於頂端(預設值)。
- 將指定行置於底端。
. 將指定行置於中央。
^ 印出前一個文字視窗。
= 將指定行置於中央並指定為目前行。
--------------------------------------
[address] !command
啟動一個 shell 然後執行 UNIX 指令 command。若指定 address,則該指定之內容則變成 command 的輸入,而 command 的輸出則取代剛才當做輸入的文字。
範例:
:!ls 列出目前目錄中的檔案。
:l1,20!sort -f 將目前檔案中的第 11 到 20 行作排序。
--------------------------------------
[address]=
印出符合 address 的下一行行號(因為 address 可以是一個範圍)。若不指定 address,則列出最後一行的行號。
--------------------------------------
[address]<[count]
or
[address]>[count]
將所指定的行向左或向右移。向左移時,僅左移空白字元和 tab。count 表示從 address 開始算要移幾行。
--------------------------------------
address
印出 address 所指定的行。
--------------------------------------
RETURN
印出下一行。
--------------------------------------
[address] & [options] [count]
重複上一個替代指令(s)。count 指定從 address 算起要替代幾行。
範例:
:s/Overdue/Paid/ 在目前行進行一次替代動作
:g/Status/& 在所有有 Status 的行中重複上面的替代動作
--------------------------------------
[address]~[count]
將上一個 常規表示式 用上一次替代指令中的 replacement pattern 代替。
2010年1月20日 星期三
Ex 編輯器
訂閱:
張貼留言 (Atom)
推到 Twitter!
推到 Plurk!
推到 Facebook!
沒有留言:
張貼留言