vi/vim高级命令集粹(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=====

= 这一步很关键,是典型的递归调用,重复完成以上步骤

例四、在文件中置入行号

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzwzxg.html