vim的宏的定义:

宏就是一些命令组织在一起,作为一个单独命令完成一个特定任务。Microsoft Word中对宏定义为:“宏就是能组织到一起作为一独立的命令使用的一系列word命令,它能使日常工作变得更容易”。那么,在Linux的vim下,套用Word中对宏的定义,vim中的宏就是:“宏就是能组织到一起作为一独立的命令使用的一系列vim命令(其实也包括键盘操作),它能使日常工作变得更容易”

那么,OK了,宏可以说是一个录像机和放映机的集合,也就是录制一段自定义的文本编辑动作后,在原样的把这些动作重复出来。

vim的宏可以干什么呢?

宏可以实现自动化的快速生成模板文件,有规律的文件编写操作程式化。

实例一:

要求将一篇文章前面加递增序列号,比如,这个文件是 /etc/passwd 这个文件,文件内容如下:

[root@hdp-1 ~]# cat passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/nologin
daemon:x:2:2:daemon:/bin:/bin/bin/bin/nologin
adm:x:3:4:adm:/var/adm:/bin/bin/nologin
lp:x:4:7:lp:/var/spool/lpd:/bin/nologin
sync:x:5:0:sync:/bin:/bin/sync
shutdown:x:6:0:shutdown:/bin:/bin/shutdown
halt:x:7:0:halt:/bin:/bin/halt
mail:x:8:12:mail:/var/spool/mail:/bin/nologin

那么,如何做才是正确的快速的方法呢?

当然,首先在root用户这手动先添加一个1和两个空格,也就是文件修改为这样的:

[root@hdp-1 ~]# cat passwd 
1 root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/nologin
bindaemon:x:3:2:daemon:/bin:/bin/bin/bin/nologin
adm:x:3:4:ad4m:/var/adm:/bin/bin/nologin
lp:x:4:7:lp:5m/var/spool/lpd:/bin/nologin
sync:x:5:0:s6mync:/bin:/bin/sync
shutdown:x:67mync:0:shutdown:/bin:/bin/shutdown
halt:x:7:0:h8myncalt:/bin:/bin/halt
mail:x:8:12:9myncaltmail:/var/spool/mail:/bin/nologin

 然后开始录入宏到按键q,也就是先连续按两下q键,然后录入如下的键位:

ywjPb^AywjPbyw^AywjPb^A^[          (^A 表示键盘的Ctrl+a  ^[ 表示键盘的esc键,j表示下移一行,大p表示在光标前黏贴前面复制的1,然后在Ctrl+a 将1改成递增的2,在继续复制2,然后黏贴到第三行,在将2改写成3)

以上录入完成后,在按q键结束宏录制。使用的时候在光标处在第一行的时候,比如,10@q  重复宏10次,就可以快速的给这个文件的10行添加递增序列号了。效果如下:

[root@hdp-1 ~]# cat passwd
1 root:x:0:0:root:/root:/bin/bash
2 bin:x:1:1:bin:/bin:/bin/nologin
3 bindaemon:x:3:2:daemon:/bin:/bin/bin/bin/nologin
4 adm:x:3:4:ad4m:/var/adm:/bin/bin/nologin
5 lp:x:4:7:lp:5m/var/spool/lpd:/bin/nologin
6 sync:x:5:0:s6mync:/bin:/bin/sync
7 shutdown:x:67mync:0:shutdown:/bin:/bin/shutdown
8 halt:x:7:0:h8myncalt:/bin:/bin/halt
9 mail:x:8:12:9myncaltmail:/var/spool/mail:/bin/nologin

实例2:

比如,我现在有很多的rpm文件,我想写一个脚本自动安装这些rpm文件,当然,我们可以把这些文件集中到一个文件夹下,然后 rpm -ivh *  就可以安装完成了,那么,不用这个方法,怎么写到脚本里呢?

root@hdp-1 ~]# cat 333
python2-setuptools-38.4.0-3.el7.noarch.rpm
python-pip-8.1.2-1.el7.noarch.rpm

 比如,我有两个文件如上图所示,怎么样将安装过程写成脚本的样式呢?

还是q连续按两次,然后输入irpm -ivh ^[<80>K4a --nodeps^[j^ 就可以自动生成如下的形式了(^[<80>K4a 是键盘上的end键,j^是跳转到下一行的行首):

rpm -ivh python2-setuptools-38.4.0-3.el7.noarch.rpm --nodeps
rpm -ivh python-pip-8.1.2-1.el7.noarch.rpm --nodeps

此时,按q键停止录制后,在光标处于第一行的时候,在正常模式下,按2@q 就可以生成以上的内容啦。

实例3:

现在有一组SQL插入语句,需要经过加工后只保留这些插入的数据值(插入的是7个数值,不信你数数)。(SQL插入语句格式基本每行都是一样的形式)

插入语句长这样婶的:

insert into stu values ('1','Alfreds Futterkiste','Maria Anders','Obere Str. 57','Berlin','12209','Germany                                       ')      
insert into stu values ('2','Ana Trujillo Emparedados y helados','Ana Trujillo','Avda. de la Constitución 2222','México D.F.','5021','Mexico ')
insert into stu values ('3','Antonio Moreno Taquería','Antonio Moreno','Mataderos 2312','México D.F.','5023','Mexico ')
insert into stu values ('4','Around the Horn','Thomas Hardy','120 Hanover Sq.','London','WA1 1DP','UK ')

 需要清理成这样婶的(插入的原始数据每一个单元由4个空格隔开,SQL语句的  , 以及左右括号都去掉)(知道vim有快速替换的功能,并且多次修改后可以达到要求,可就是要加点难度,自动排版----每个单元隔离一个tab,一个命令就完成,哈哈哈哈):

1'      'Alfreds Futterkiste'   'Maria Anders'  'Obere Str. 57' 'Berlin'        '12209' 'Germany                                       ')
2' 'Ana Trujillo Emparedados y helados' 'Ana Trujillo' 'Avda. de la Constitución 2222' 'México D.F.' '5021' 'Mexico ')
3' 'Antonio Moreno Taquería' 'Antonio Moreno' 'Mataderos 2312' 'México D.F.' '5023' 'Mexico ')
4' 'Around the Horn' 'Thomas Hardy' '120 Hanover Sq.' 'London' 'WA1 1DP' 'UK

vim可以利用宏快速的一条命令完成这样的模板文件编写工作哦。

方法如下:

"q   dwdwdwdwdw/,^Mxi^I^[nxi^I^[nxi^I^[nxi^I^[nxi^I^[nxi^I^[j^   (这个是vim里命令模式输入命令reg查看到的具名为q的宏,使用方法为首先,移动光标到文首,然后按键盘的 4@q  就可以完成啦)

 

这里说明一下,

dw是删除一个单词,总共有5个单词

/, 是定位,号 因为这个文件内的插入数据是以,为分隔符的

^M是回车

xi是删除刚才定位到的,然后进入插入编写模式

^表示tab

^[表示esc

n表示跳转到下一个标识

剩下就是重复刚才的动作直到 j 跳转到下一行,并按键盘上的^ 键跳转到下一行的行首。 可以想象,如果有成百上千条SQL语句需要处理,使用vim的宏会非常的方便啦。

实验4:

快速复制一段文字,并按自己想要的格式黏贴。

还是以上面的那一段SQL语句为例,如何快速的复制这四列,每四列算一个单元,每个单元之间间隔5行,达成的效果像这样的:

insert into stu values ('1','Alfreds Futterkiste','Maria Anders','Obere Str. 57','Berlin','12209','Germany                                       ')
insert into stu values ('2','Ana Trujillo Emparedados y helados','Ana Trujillo','Avda. de la Constitución 2222','México D.F.','5021','Mexico ')
insert into stu values ('3','Antonio Moreno Taquería','Antonio Moreno','Mataderos 2312','México D.F.','5023','Mexico ')
insert into stu values ('4','Around the Horn','Thomas Hardy','120 Hanover Sq.','London','WA1 1DP','UK





insert into stu values ('1','Alfreds Futterkiste','Maria Anders','Obere Str. 57','Berlin','12209','Germany ')
insert into stu values ('2','Ana Trujillo Emparedados y helados','Ana Trujillo','Avda. de la Constitución 2222','México D.F.','5021','Mexico ')
insert into stu values ('3','Antonio Moreno Taquería','Antonio Moreno','Mataderos 2312','México D.F.','5023','Mexico ')
insert into stu values ('4','Around the Horn','Thomas Hardy','120 Hanover Sq.','London','WA1 1DP','UK





insert into stu values ('1','Alfreds Futterkiste','Maria Anders','Obere Str. 57','Berlin','12209','Germany ')
insert into stu values ('2','Ana Trujillo Emparedados y helados','Ana Trujillo','Avda. de la Constitución 2222','México D.F.','5021','Mexico ')
insert into stu values ('3','Antonio Moreno Taquería','Antonio Moreno','Mataderos 2312','México D.F.','5023','Mexico ')
insert into stu values ('4','Around the Horn','Thomas Hardy','120 Hanover Sq.','London','WA1 1DP','UK





insert into stu values ('1','Alfreds Futterkiste','Maria Anders','Obere Str. 57','Berlin','12209','Germany ')
insert into stu values ('2','Ana Trujillo Emparedados y helados','Ana Trujillo','Avda. de la Constitución 2222','México D.F.','5021','Mexico ')
insert into stu values ('3','Antonio Moreno Taquería','Antonio Moreno','Mataderos 2312','México D.F.','5023','Mexico ')
insert into stu values ('4','Around the Horn','Thomas Hardy','120 Hanover Sq.','London','WA1 1DP','UK

那么,在实际的操作中,命令大体应该如下:

"q   4y4jjjjo^M^M^M^M^[p


#4y复制这4行,然后移动到这四行的末尾,按o 进入编辑模式,按esc退出编辑模式,在连续按4个回车,在按p黏贴即可,这些动作算一个周期。
#使用的时候,命令为比如重复3次,3@q 就可以啦