VI高階命令集錦及VIM應用例項(轉)

post0發表於2007-08-11
VI高階命令集錦及VIM應用例項(轉)[@more@]

VI高階命令集錦及VIM應用例項

1.交換兩個字元位置

xp

2.上下兩行調換

ddp

3.把檔案內容反轉

:g/^/m0

4.上下兩行合併

J

5.刪除所有行

dG

6.從當前位置刪除到行尾

d$

7.從當前位置複製到行尾

y$ 如果要貼上到其他地方 p 就可以了

由於vi 是建立在 EX 上的 所以 當鍵入 : 時就來到了 EX 命令狀態

8.

:ab string strings

例如 ":ab usa United States of America" ,

當你在文見裡插入 usa 時

United States of America 就蹦出來了

9.

:map keys new_seq

定義你當前 鍵盤命令

10.

:set [all]

vi or ex 的編輯狀態

如 顯示每行 :set nu

11.

在命令狀態下,nyy表示複製從游標行起的下n行內容,p表示paste,可剛複製的內容貼上在游標處的下面。

12.

單個字元替換用r,覆蓋多個字元用R,用多個字元替換一個字元用s,整行替換用S

13.

:%s/old_word/new_word/g

這個指令是於在整個檔案中替換特定字串

14.游標控制

k:上移 nk 上移n行

j:下移 nj 下移n行

將游標移到第n行,按下 mk

將游標移到第m行,按下 "ay'k

即將第n到m的行存到a暫存器,以此類推,b,c........暫存器等

這樣就可以將你常用的需要複用的內容貼上到不同的暫存器中以備用

想貼上到某處,直接將游標移到某地,按下 'ap 即可,以此類推,b,c........暫存器等

在當前螢幕中

H 跳到第一行

M 跳到中間一行

L 跳到最後一行

15.

表8-2 刪除命令

刪除命令操作

d l 刪除當前字元(與x命令功能相同)

d 0 刪除到某一行的開始位置

d ^ 刪除到某一行的第一個字元位置(不包括空格或TA B字元)

d w 刪除到某個單詞的結尾位置

d 3 w 刪除到第三個單詞的結尾位置

d b 刪除到某個單詞的開始位置

d W 刪除到某個以空格作為分隔符的單詞的結尾位置

d B 刪除到某個以空格作為分隔符的單詞的開始位置

d 7 B 刪除到前面7個以空格作為分隔符的單詞的開始位置

d) 刪除到某個語句的結尾位置

d 4) 刪除到第四個語句的結尾位置

d( 刪除到某個語句的開始位置

d } 刪除到某個段落的結尾位置

d { 刪除到某個段落的開始位置

d 7 { 刪除到當前段落起始位置之前的第7個段落位置

d d 刪除當前行

d /t e x t 刪除從文字中出現" t e x t"中所指定字樣的位置,一直向前直到下一個該字樣所出現的

位置(但不包括該字樣)之間的內容

d fc 刪除從文字中出現字元"c"的位置,一直向前直到下一個該字元所出現的位置(包括

該字元)之間的內容

d tc 刪除當前行直到下一個字元" c"所出現位置之間的內容

D 刪除到某一行的結尾

d $ 刪除到某一行的結尾

5 d d 刪除從當前行所開始的5行內容

d L 刪除直到螢幕上最後一行的內容

d H 刪除直到螢幕上第一行的內容

d G 刪除直到工作快取區結尾的內容

d 1 G 刪除直到工作快取區開始的內容

修改命令操作

c l 更改當前字元

c w 修改到某個單詞的結尾位置

c 3 w 修改到第三個單詞的結尾位置

c b 修改到某個單詞的開始位置

c W 修改到某個以空格作為分隔符的單詞的結尾位置

c B 修改到某個以空格作為分隔符的單詞的開始位置

c 7 B 修改到前面7個以空格作為分隔符的單詞的開始位置

c 0 修改到某行的結尾位置

c) 修改到某個語句的結尾位置

c 4) 修改到第四個語句的結尾位置

c( 修改到某個語句的開始位置

c } 修改到某個段落的結尾位置

c { 修改到某個段落的開始位置

c 7 { 修改到當前段落起始位置之前的第7個段落位置

c tc 修改當前行直到下一個字元c所出現位置之間的內容

C 修改到某一行的結尾

c c 修改當前行

5 c c 修改從當前行所開始的5行內容

.重複上一次修改!

表8-4 替換命令

替換命令操作

s 將當前字元替換為一個或多個字元

S 將當前行替換為一個或多個字元

5 s 將從當前字元開始的5個字元替換為一個或多個字元

vi替換使用規則:

:g/s1/s/s2/s3/g

第一個g表示對每一個包括s1的行都進行替換,第二個g表示對每一行包括s1的行所有的s2都用s3替換

s表示替換,s2是要被替換的字串,他可以和s1相同(如果相同的話用//代替),s3是替換字串

16.

fx

往右移動到 x 字元上

Fx

往左移動到 x 字元上

tx

往右移動到 x 字元前

Tx

往左移動到 x 字元後

(注意:以上四個命令中,其中x是鍵入的字元)

;

分號,配合 f 和 t 使用,重複一次

,

逗號,配合 f 和 t 使用,反方向重複一次

17. vi 環境選項 Solaris ksh

noautoindent nomodelines noshowmode

autoprint nonumber noslowopen

noautowrite nonovice tabstop=8

nobeautify nooptimize taglength=0

directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags

noedcompatible prompt tagstack

noerrorbells noreadonly term=vt100

noexrc redraw noterse

flash remap timeout

hardtabs=8 report=5 ttytype=vt100

noignorecase scroll=11 warn

nolisp sections=NHSHH HUuhsh+c window=23

nolist shell=/bin/ksh wrapscan

magic shiftwidth=8 wrapmargin=0

mesg noshowmatch nowriteany

For C-Shell:

setenv EXINIT "set nu"

For Bourne or Korn Shell:

EXINIT="set nu"; export EXINIT

For Korn Shell Only (alternate method):

typeset -x EXINIT="set nu"

在 .profile 裡設定 vi 的環境選項 , 以上均測試過

18.標記文字

  mchar   用字母char標記當前游標的位置

  `char   移至char所標記處

  'char   移至char標記所在行的開頭處

  "     移至當前行上一次所在位置(在游標移動之後)――一個雙引號

  ''    移至當前行上第一次所在位置的行的開頭處(在游標移動之後)――兩個單引號

19.

同時vi多個檔案時,CTRL-SHIFT-6回到上一個檔案,在本次vi的檔案和上次vi的檔案之間切換。

但是我發現一個BUG:在用CTRL-SHIFT-6切換到上一個檔案後,用:args檢視多檔案vi狀態時,

螢幕底部仍然顯示目前vi的是剛才的檔案。

(在HP-UX,Solaris,AIX上透過)

也可以使用:

:e#

進行切換

20.

sco 下VI 要在文字前同樣的字元加用

%s/^/要加的內容/g 要在文字後同樣的字元加

%s/$/要加的內容/g

21.

如何去掉文字中的 ^M 硬回車?不必用binary傳回去再ascii傳回來的方式,用shell或者unix語句實現。

cat filename |tr -d '15' >newfile

不同的unix系統還存在一些其他不同的命令,如:doscp

sed 也可以實現這個功能.

dos2unix filename filename2

反之

unix2dos filename filename2

在vi 中用:$s/^M//g

^是crtl-V crtl-M

22.如何在"unix命令列"下將一個檔案的某字串用另一個串換掉

sed 's/string1/string2/gp' file1 > file2

23.將/etc/hosts下所有的地址都ping 2次

1 #/usr/bin/sh

2 #grad /etc/hosts and ping each address

3 cat /etc/hosts|grep -v '^#' | while read LINE

4 do

5 ADDR=`awk '{print $1}'`

6 for MACHINE in $ADDR

7 do

8 ping $MACHINE -n 2

9 done

10 done

24

到前一個函式[[ ,到下一個函式]] ,括號配對% ,交叉參考Ctrl_] (事先用ctags做索引),回來用e# ` 編輯一個函式:vi -t 函式名 ,編輯加密文字vi -X

25

在插入模式下ctrl+p,自動補齊剩餘單詞,以賴規則:tags,以有的單詞等等

當今世界,文字編輯器種類繁多,大有"亂花漸欲迷人眼"之勢。中國有句古語:手巧不如傢什妙,作為IT業的專業人士,選擇一款優秀的編輯軟體至關重要。筆者認為:LINUX下的VIM※以其強大的功能和無窮的魅力將使您終生受益。

作者:閆石 (iloveibm@163.com)

來自:http://www-900.ibm.com/developerWorks/cn/linux/l-tip-prompt/tip15/index.shtml

由於被廣泛移植,無論是PC機的DOS和WINDOWS,還是RISC/6000的AIX,乃至於IBM的大型機S/390,都能見到VIM的身影。然而,對於初學者,VIM的使用者介面與使用方法非常不符合常規,甚至認為它比較混亂,無所適從。事實上,VIM編輯器是專門為經驗豐富的使用者設計的,它的介面和使用方法提供了更快的速度和更強的功能。對於熟知它的使用者,VIM的許多特性節省了時間和擊鍵次數,並可以完成一些其他編輯器無法完成的功能。

學習的最好方法是實踐,唯有如此,才能真正掌握其中的精髓。文中列舉的例項,都是筆者在實際工作中遇到的,具有一定的代表性,請大家在閱讀的過程中仔細體會。

好了,現在讓我們共同暢遊神奇的VIM的世界!

例一、兩個常用的指令序列

xp 左右交換游標處兩字元的位置。

ddp 上下交換游標處兩行的位置。

例二、重複輸入同一字元

有時,我們可能想多次輸入同一字元,VIM的插入功能可以很好的完成這項工作

命令 80i=^ESC 一次可以輸入80個字元= ,當然,80a=^ESC 也可以完成上述功能。

請注意:此處的^ESC表示鍵盤左上方上的ESC鍵。

例三、將兩個文字資料檔案按行逐條合併,並給出標尺

資料檔案1內容如下:

1-----

2-----

3-----

資料檔案2內容如下:

1=====

2=====

3=====

要求的結果如下:

|--------1---------2---------3---------4---------5

1-----

1=====

|--------1---------2---------3---------4---------5

2-----

2=====

|--------1---------2---------3---------4---------5

3-----

3=====

也許您會說,這還不簡單,無非是反覆複製、貼上,任何一款文字編輯器都能完成上述功能。可是,如果這兩個檔案都很大,每個檔案都成千上萬行,恐怕簡單的複製、貼上就難以勝任了。因此,我們所關心的,是找到一種行之有效的方法,把枯燥乏味的工作留給計算機,我們只需釋出指令。為達到此目的,請按以下步驟執行:

㈠、將兩檔案合併,結果如下

1-----

2-----

3-----

1=====

2=====

3=====

㈡、在兩檔案頭尾相接的地方插入標誌行,用以區分兩個檔案,本文采用的是一整行!字元

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

1=====

2=====

3=====

㈢、在標誌行的下方輸入標尺

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

㈣、執行宏命令指令碼merge_2r.vim,即在VIM編輯器中按如下鍵 :so merge_2r.vim 回車

㈤、按下鍵盤上的=鍵,執行的結果如下

|--------1---------2---------3---------4---------5

1-----

1=====

|--------1---------2---------3---------4---------5

2-----

2=====

|--------1---------2---------3---------4---------5

3-----

3=====

|--------1---------2---------3---------4---------5

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

㈥、將最後三行刪除,即可得到我們需要的結果

|--------1---------2---------3---------4---------5

1-----

1=====

|--------1---------2---------3---------4---------5

2-----

2=====

|--------1---------2---------3---------4---------5

3-----

3=====

怎麼樣,簡單嗎?請大家自己實際嘗試一下。下面,我來詳細講解宏命令指令碼merge_2r.vim 。

該指令碼內容如下:

"--------------------------------------------------------------------

"Macro Function : Merge File1 And File2,Have Ruler in every record

" Date : 2001/12/01

" Author : Yan Shi

"--------------------------------------------------------------------

"1-----

"2----- } Sample File1

"3-----

"!!!!!!!!!!!!!!!!!!!!!!!! Flag Row

"|--------1---------2---------3---------4---------5 Ruler

"1=====

"2===== } Sample File2

"3=====

"--------------------------------------------------------------------

:1

:map = ma/!!!!!^M+:.co 'a-1^M/!!!!!^M2+:.m'a^M+=

前14行每行都以"開始,表明該行是註釋行,實際並不執行,只是方便讀者閱讀,只有最後兩行才是真正的程式碼行。請注意:本例中的^M表示鍵盤上的Enter鍵,並非^和M兩個字元。為了講述清楚,我把命令列分解開,逐一說明。

首先將第一行置為當前行,然後執行map命令,將一大串VIM指令映像給字元=。這一大串VIM指令共分9步執行:

ma 將資料檔案一的第一行標記為a

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

/!!!!!^M 找到標誌行,置為當前行

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

+ 游標下移一行,即把標尺行置為當前行

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

:.co 'a-1^M 把標尺行復制到標記行(資料檔案一的第一行)的上方

|--------1---------2---------3---------4---------5

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

/!!!!!^M 再次找到標誌行,置為當前行

|--------1---------2---------3---------4---------5

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

2+ 游標下移2行,即資料檔案二的第一行置為當前行

|--------1---------2---------3---------4---------5

1-----

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

1=====

2=====

3=====

:.m'a^M 把資料檔案二的第一行移至標記行的下方

|--------1---------2---------3---------4---------5

1-----

1=====

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

2=====

3=====

+ 游標下移一行,即資料檔案一的第二行置為當前行

|--------1---------2---------3---------4---------5

1-----

1=====

2-----

3-----

!!!!!!!!!!!!!!!!!!!!!!!!

|--------1---------2---------3---------4---------5

2=====

3=====

= 這一步很關鍵,是典型的遞迴呼叫,重複完成以上步驟

例四、在檔案中置入行號

工作中,我們有時希望把行號置入檔案中,而VIM提供的功能 :set nu 只能顯示行號,不能編輯或將其置入檔案當中,下面的宏命令指令碼row_num.vim可以完成此項功能。

"------------------------------------------

"Macro Function : Source File Add Row_Num

" Date : 2001/12/01

" Author : Yan Shi

"------------------------------------------

:%s/^/^I/

:$

:let end=line(".")

:1

"------------------------------------------

:let num=1

:while num<=end

:let line=getline(".")

:let temp=substitute(line,$,num,"")

:call setline(".",temp)

:+

:let num=num+1

:endwhile

"------------------------------------------

請注意:本例中的^I表示鍵盤上的TAB鍵,並非^和I兩個字元。下面,我針對該宏命令指令碼逐一講解。

:%s/^/^I/ 每一行的行首新增一個TAB字元

:$ 到檔案的末行

:let end=line(".") 末行的行號 ==〉變數 END,函式line的功能是取得指定行的行號,此處引數"."表示當前行

:1 到檔案的首行

"------------------------------------------

:let num=1 1 ==〉計數器

:while num<=end

:let line=getline(".") 取當前行的內容 ==〉變數 LINE

:let line=substitute(line,$,num,"") 在變數 LINE 的前面置入行號

:call setline(".",line) 將變數 LINE 的內容寫回當前行

:+ 下移一行

:let num=num+1 計數器加一

:endwhile 迴圈執行,直到檔案結束

"------------------------------------------

有關正規表示式的使用

UNIX/LINUX下的很多工具之所以強大、靈活,關鍵是因為有了正則文法和元字元,這也是VIM乃至UNIX/LINUX系統的精華所在。正因為使用靈活,因此掌握起來比較吃力,如果不是真正理解,實際運用中會出現千奇百怪的錯誤。因此,有必要對這部分知識多花些氣力。下面結合具體例項講解。

例五、有一檔案,包含某外企的中國員工的資料,首先是姓名,然後是兩個空格,其次是15位身份證號碼。

zhang.fei 430759701022003

diao.chan 651302801225012

guan.yu 342869680413001

xi.shi 120638780214006

liu.bei 210324650708001

現在,有以下問題需要解決:

按照外國人的習慣,應該是名在前,姓在後。因此,檔案中的姓名欄位需要修改。

姓與名的首字母應該大寫。

根據身份證號碼,還可以判斷出生年月日,將其作為一個新欄位新增。

根據身份證號碼,可以判斷出性別。若為男性,新增male,若為女性,新增female 。

將男女員工分開,男員工在前,女員工在後。

將各欄位資料左對齊

最終結果如下:

Fei.Zhang 430759701022003 1970/10/22 male

Yu.Guan 342869680413001 1968/04/13 male

Bei.Liu 210324650708001 1965/07/08 male

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

Chan.Diao 651302801225012 1980/12/25 female

Shi.Xi 120638780214006 1978/02/14 female

為了完成上述功能,只需執行指令碼employee.vim ,使用方法為 :so employee.vim 回車即可。

指令碼內容如下:

:%s/ / /

:%s/(............)( *)/1/

:%s/([A-Za-z][A-Za-z]*)(.)([A-Za-z][A-Za-z]*)/u32u1/

:%s/$/ xxxxxx/

:%s/([0-9]{6})([0-9]{6})([0-9]{3}) (xxxxxx)/123 2/

:%s/(..)(..)(..)$/191/2/3

:%s/$/ xxxxxx/

:%s/([0-9]{14}[13579])(.*)(xxxxxx)/12male /

:%s/([0-9]{14}[02468])(.*)(xxxxxx)/12female/

:$

:s/.*/&^M-----------------------------------------------

:g/female/.m$

在這個指令碼中,使用了大量的正規表示式,這裡僅對涉及到的正規表示式做一簡要介紹。有關正規表示式的內容相當多,本文不可能佔用大量篇幅敘述,請大家諒解。

% 地址範圍符號,代表檔案中的所有行,作用等同於地址範圍 1,$

. 與任意單字元(換行符除外)匹配,例如 y.s 可以匹配 yas y.s 或 y s 等等。

* 與前一字元的0次或多次出現匹配,例如 y*s 可以匹配 yys yyyyys 或 s 等等。

$ 與行尾匹配。

& 代表模式匹配中出現的字串,例如 s/abc/&def 是把當前行的abc替換成abcdef 。

[] 匹配[]中出現的字元,例如[abc]匹配字元 a,b 或 c ,[a-zA-Z]匹配所有的英文字元。

( ) (和)之間出現的內容可以由 um來替代。

123 替代(和)之間出現的內容。

u 將後續字串的首字母大寫。

{num} 與前一字元的num次出現匹配。

現在,我們對指令碼逐條講解,希望能幫助大家理解正則文法。

⑴:%s/ / /

將檔案中每行出現的2個空格替換為10個空格。

zhang.fei 430759701022003

diao.chan 651302801225012

guan.yu 342869680413001

xi.shi 120638780214006

liu.bei 210324650708001

⑵:%s/(............)( *)/1/

保留行首的12個字元,將其餘的空格刪除,這樣,前兩個欄位就對齊了。

zhang.fei 430759701022003

diao.chan 651302801225012

guan.yu 342869680413001

xi.shi 120638780214006

liu.bei 210324650708001

⑶:%s/([A-Za-z][A-Za-z]*)(.)([A-Za-z][A-Za-z]*)/u32u1/

將檔案中每行出現的僱員姓名互換,並將首字母大寫。

Fei.Zhang 430759701022003

Chan.Diao 651302801225012

Yu.Guan 342869680413001

Shi.Xi 120638780214006

Bei.Liu 210324650708001

⑷:%s/$/ xxxxxx/

在每一行的行尾新增2個空格和6個x

Fei.Zhang 430759701022003 xxxxxx

Chan.Diao 651302801225012 xxxxxx

Yu.Guan 342869680413001 xxxxxx

Shi.Xi 120638780214006 xxxxxx

Bei.Liu 210324650708001 xxxxxx

⑸:%s/([0-9]{6})([0-9]{6})([0-9]{3}) (xxxxxx)/123 2/

將xxxxxx替換成出生年月日。

Fei.Zhang 430759701022003 701022

Chan.Diao 651302801225012 801225

Yu.Guan 342869680413001 680413

Shi.Xi 120638780214006 780214

Bei.Liu 210324650708001 650708

⑹:%s/(..)(..)(..)$/191/2/3

將年月日用/字元分隔,並在年前新增19。

Fei.Zhang 430759701022003 1970/10/22

Chan.Diao 651302801225012 1980/12/25

Yu.Guan 342869680413001 1968/04/13

Shi.Xi 120638780214006 1978/02/14

Bei.Liu 210324650708001 1965/07/08

⑺:%s/$/ xxxxxx/

在每一行的行尾新增2個空格和6個x

Fei.Zhang 430759701022003 1970/10/22 xxxxxx

Chan.Diao 651302801225012 1980/12/25 xxxxxx

Yu.Guan 342869680413001 1968/04/13 xxxxxx

Shi.Xi 120638780214006 1978/02/14 xxxxxx

Bei.Liu 210324650708001 1965/07/08 xxxxxx

⑻:%s/([0-9]{14}[13579])(.*)(xxxxxx)/12male /

身份證號碼末位是奇數的,將xxxxxx替換成male

Fei.Zhang 430759701022003 1970/10/22 male

Chan.Diao 651302801225012 1980/12/25 xxxxxx

Yu.Guan 342869680413001 1968/04/13 male

Shi.Xi 120638780214006 1978/02/14 xxxxxx

Bei.Liu 210324650708001 1965/07/08 male

⑼:%s/([0-9]{14}[02468])(.*)(xxxxxx)/12female/

身份證號碼末位是偶數的,將xxxxxx替換成female

Fei.Zhang 430759701022003 1970/10/22 male

Chan.Diao 651302801225012 1980/12/25 female

Yu.Guan 342869680413001 1968/04/13 male

Shi.Xi 120638780214006 1978/02/14 female

Bei.Liu 210324650708001 1965/07/08 male

⑽:$ 到檔案的最後一行

⑾:s/.*/&^M-----------------------------------------------

在檔案的最末行插入一行 "-" 字元。

Fei.Zhang 430759701022003 1970/10/22 male

Chan.Diao 651302801225012 1980/12/25 female

Yu.Guan 342869680413001 1968/04/13 male

Shi.Xi 120638780214006 1978/02/14 female

Bei.Liu 210324650708001 1965/07/08 male

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

⑿:g/female/.m$

將所有的女員工記錄移至檔案尾。

Fei.Zhang 430759701022003 1970/10/22 male

Yu.Guan 342869680413001 1968/04/13 male

Bei.Liu 210324650708001 1965/07/08 male

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

Chan.Diao 651302801225012 1980/12/25 female

Shi.Xi 120638780214006 1978/02/14 female

筆者目前正在為某外資公司從事大型機(IBM S/390)的軟體開發,一切工作都在TSO環境中進行。為了對編寫的程式進行測試,必須準備測試資料。有過大型機開發經驗的人會知道,透過TSO,輸入字元型資料還可以,如果要輸入16進位制資料,操作起來很麻煩。因為16進位制數是縱向排列的,輸入時既不方便,又很容易錯位。怎麼解決呢?我嘗試了幾種辦法,實際證明,用VIM最方便。

例六、下列資料 1234567890ABCDEF ,將其變成 13579ACE 24680BDF 的形式,這樣,資料就可以很方便的貼上到TSO環境中了。

下面給出宏命令指令碼change_d.vim

"----------------------------------------------------

"Macro Function : Convert Char Arrange Direction

"

" Sample : 40 50 60 ==> 4 5 6

" 0 0 0

" Date : 2001/12/01

" Author : Yan Shi

"----------------------------------------------------

:s/.*/&^M/

:1

:map = malx+$p-`al=

說明如下:

⑴ :s/.*/&^M/ 在資料行下方新增一空行。

⑵ :1 回到檔案的首行的首字元。

⑶ :map = malx+$p-`al= 將一大串VIM命令映像給字元=

① ma 將首字元標記為a

② l 游標右移一個字元

③ x 刪除游標處字元

④ + 移至下一行

⑤ $ 到行尾

⑥ p 將刪除的字元貼上

⑦ - 回至上一行

⑧ `a 返回到標記字元處

⑨ l 游標右移一個字元

⑩ = 遞迴呼叫,重複以上步驟,直到將該行所有的資料處理完。

上面的這幾個例項,展示了VIM強大的文字處理功能,但這遠不能覆蓋其全貌。VIM的命令很多,而且使用靈活,需要狠下一番氣力才能熟練掌握。筆者年齡尚小,經驗還很欠缺,希望本文能夠起到拋磚引玉的作用。由於時間的原因,上述例項僅在DOS和WINDOWS環境下測試,沒有在其他系統下進行進一步的測試,希望各位同行、前輩不吝賜教,謝謝!

※ VIM 意為 VI Improved ,與VI99%向下相容。而且,VIM提供了許多VI不具備的功能,內建了諸多函式,因此,建議有經驗的VI使用者對VIM有所瞭解,您會發現,轉向VIM 是明智之舉。欲查詢有關VIM的資料,請參考

注:本文使用 VIM 6.0 版本

作者簡介

閆石,工程師。您可以透過電子郵件:iloveibm@163.com 或者 yan-shi@sino-com.com 和他聯絡。

附錄A:一個用vi作表單的線上教程

http://www-900.ibm.com/developerWorks/cn/cnedu.nsf/linux-onlinecourse-bytitle/9F896668D7EB5CA948256A710030E157?OpenDocument

附錄B:vi 命令常見問題解答

附錄C:命令列下線上教程:

執行vimtutor即可學習

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/8225414/viewspace-944533/,如需轉載,請註明出處,否則將追究法律責任。

相關文章