VI進階命令集錦及VIM應用執行個體 1.交換兩個字元位置 xp 2.上下兩行調換 ddp 3.把檔案內容反轉 :g/^/m0/ (未通過) 4.上下兩行合并 J 5.刪除所有行 dG 6.從當前位置刪除到行尾 d$ 7.從當前位置複製到行尾 y$ 如果要粘貼到其他地方 p 就可以了Bash支援大量鍵盤快捷操作進行命令列導航和編輯。快速鍵Ctrl-A可將游標移動到命令列行首,而Ctrl-E可將游標移動到命令列行尾。Ctrl-W快速鍵可以快速刪除游標前的字元,而Ctrl-K可以立即刪除游標後的字元。使用Ctrl-Y取消刪除操作。由於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 '/015' >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表示鍵盤上的斷行符號鍵,並非^和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 迴圈執行,直到檔案結束 "------------------------------------------ 有關Regex的使用 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]*/)//u/3/2/u/1/ :%s/$/ xxxxxx/ :%s//([0-9]/{6}/)/([0-9]/{6}/)/([0-9]/{3}/) /(xxxxxx/)//1/2/3 /2/ :%s//(../)/(../)/(../)$/19/1///2///3 :%s/$/ xxxxxx/ :%s//([0-9]/{14}[13579]/)/(.*/)/(xxxxxx/)//1/2male / :%s//([0-9]/{14}[02468]/)/(.*/)/(xxxxxx/)//1/2female/ :$ :s/.*/&^M----------------------------------------------- :g/female/.m$ 在這個指令碼中,使用了大量的Regex,這裡僅對涉及到的Regex做一簡要介紹。有關Regex的內容相當多,本文不可能佔用大量篇幅敘述,請大家諒解。 % 位址範圍符號,代表檔案中的所有行,作用等同於位址範圍 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]匹配所有的英文字元。 /( /) /(和/)之間出現的內容可以由/num來替代。 /1/2/3 替代/(和/)之間出現的內容。 /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]*/)//u/3/2/u/1/ 將檔案中每行出現的僱員姓名互換,並將首字母大寫。 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/)//1/2/3 /2/ 將xxxxxx替換成出生年月日。 Fei.Zhang 430759701022003 701022 Chan.Diao 651302801225012 801225 Yu.Guan 342869680413001 680413 Shi.Xi 120638780214006 780214 Bei.Liu 210324650708001 650708 ⑹:%s//(../)/(../)/(../)$/19/1///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/)//1/2male / 社會安全號碼碼末位是奇數的,將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/)//1/2female/ 社會安全號碼碼末位是偶數的,將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的資料,請參考 http://www.vim.org 註:本文使用 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 命令常見問題集 http://www.linuxsir.com/bbs/showthread.php?s=&threadid=23957 附錄C:命令列下線上教程: 運行vimtutor即可學習! |