这两天看到一个小练习,要求如下:

在GVIM下,将下面这张图的内容

改成下面这样

并且指出,要用批量操作的方式,不能一行一行的键入

其实第一反应是利用正则表达式来操作,但是让用正则表达式以外的操作方式,查了不少方法,最终发现了VIM的宏,觉得挺有意思的,特地记录一下

宏的基本操作

宏是用来重复执行一组操作的

操作方式为

1、在普通模式下,按q 开启宏操作方式

2、随后输入一个宏名作为寄存器,为了方便,可以输入一个小写字母,但不要用大写字母哟

3、输入要批量操作的内容,VIM会将此时所有的操作记录在寄存器中

4、操作完成后,再次在普通模式下按q 结束宏记录

5、之后可以调用宏操作,调用方式有两种,一种是在普通模式下按@宏名,另一种方式是在命令模式下输入normal @宏名

下面一步步演示

先是在普通模式下依次按下qa,其中a是我们的宏名

完成这一步可以看到在VIM窗口的左下角出现了记录中字样,表明随后的操作都将记录在VIM的宏中

随后,我们按下i进入输入模式,并输入

number <回车>

Esc退出输入模式,再按q,退出宏操作

此时便完成了宏记录操作,记录完宏操作后是这样的

接下来分别用两种方式调用宏

普通模式下,直接输入@a

可以看到多出了一行内容,用命令行方式调用

在命令行输入
:normal @a

可以看到,再次输入了一行内容

如果想知道宏名中有哪些操作,可以在命令模式下输入

:register @a

可以看到刚才记录在宏名a中操作全部展示出来了

为什么不建议宏名用大写字母

我们新建一个VIM文本,按照同样的方式操作一下,只是将宏名由a换成A

我们先来查看一下宏名A中的内容

可以看到,宏中并没有任何操作,大写字母的作用是在现有宏中添加操作的

对一个现有的宏,如果我们想修改里面的操作,如果我们按照

q
a
<一系列操作>
q

这个方式操作只会覆盖掉原有的宏,并不会在原有宏的基础上增加操作

接下我们试试在最初的宏a中加上is 0,用a进入和A进入分别会发生什么

#方式1
q
a
输入 is 0
q

可以看到,执行宏操作后,只打印出is 0,再来看看此时宏a中的内容

可以看到此时的宏中只有is 0

先将宏改回原来的样子,再来换一种方式试试

#方式2
q
A
输入 is 0
q

可以看到此时调用宏时,不仅有打印出了number也打印出了is 0,最后再看看这种方式更改后宏a中记录的操作

宏中设置变量

有时我们会用到变量,而宏中也可以设定变量,操作方式如下

在进入宏记录后,在命令行输入
:let i = 1 <回车>
按 i 进入输入模式
按Ctrl r = 三个按键
在输入变量名 i 即可插入变量

我们按照这个步骤试一下,过程如下

q
b
:let i = 1 <回车>
进入输入模式,并输入Ctrl r = i <回车>
退出输入模式,并结束宏记录
普通模式下按下 @b

不过有一点要说明,在一个VIM文本中,所有的变量是共同有的,我们对宏a进行一个更改

在宏a后面加上
value Ctrl r = i <回车>

可以看到在宏b中设置的变量在宏a中依旧可以调用

如果我们对变量 i不断进行累加,可以在宏a中加入let i = i + 1

此时,我们也可以在其他宏中更改变量i,比如我们新建一个宏,如下:

q
c
在命令行输入
:let i = 10 <回车>
q
普通模式下输入 @a

可以看到此时i的值是10,我们再次在普通模式下按@a

可以看到此时是在10的基础上进行累加的

如果,我们再新建一个宏,更改变量i的变化方式呢,就像下面这样

q
m
命令行输入 :let i = i + 50 <回车>
q
普通模式下按 @a

可以看到只有第一次调用宏时是按照宏m的设定变化的,但随后又按照宏a的设定变化


下面给出最初的小练习的解决方案

/*	在宏中设置变量	*/
q
a
:let i = 1 <回车>
:let j = 2 <回车>
q /* 在宏中键入内容 */
q
a
i
number 组合键 i + number 1 = number 组合键 j <回车>
ESC
:let i = i + 1 <回车>
:let j = j + 1 <回车>
q /* 打印 */
普通模式下输入 20@a

其实利用正则表达式的方式也是能够实现的,正则表达的方式下次贴出来

VIM编辑器的宏操作的更多相关文章

  1. vim 编辑器的光标操作

    vim中最简单的移动光标的方式是使用使用方向键操作,但这种方式的效率底下,更高效的方式是使用快捷键,常用的快捷键如下表所示. 快捷键                                 功 ...

  2. 1201.1——Vim编辑器的相关操作

    一 vi的操作模式 vi提供两种操作模式:输入模式(insert mode)和指令模式(command mode).在输入模式下,用户可输入文本资料.在指令模式下,可进行删除.修改等各种编辑动作. 在 ...

  3. Linux中vim编辑器常用操作技巧

    Normal 0 false false false EN-US ZH-CN X-NONE /* Style Definitions */ table.MsoNormalTable {mso-styl ...

  4. 【Linux学习】Vi / Vim编辑器—编辑器工作模式、vi编辑操作

    Vi / Vim编辑器-编辑器工作模式.vi编辑操作 推荐一个很好的学习指南:http://www.oschina.net/translate/learn-vim-progressively 一.编辑 ...

  5. vim编辑器操作①

    Linux文本编辑器: 行编辑器:sed 全屏编辑器:nano,vi/vim 本文主要介绍说明vim编辑器的相关使用: 其有三种模式,即: 编辑模式(默认模式).插入模式(输入模式).末行模式(内置的 ...

  6. vi/vim编辑器操作梳理

    1. vi/vim编辑器详细使用讲解 1.1 vi/vim编辑器的3种模式 1.2 vi/vim编辑器操作说明 参数/命令/模式 说明 ###普通模式   :set nu  显示行号 :set non ...

  7. vim编辑器中撤销和恢复操作

    在VIM编辑器下切换至命令行模式: 撤销: u 恢复: ctrl + r

  8. vim 编辑器的设置

    vi编辑器的配置:http://blog.mcuol.com/User/fenghua/Article/17411_1.htm ******************************vim ~/ ...

  9. vim编辑器学习

    vim是一个非常强大的编辑器,看了很多文章能感受到它的强大,不过还需要不断地学习和使用来慢慢感受. 安装vim 在ubuntu 系统中使用 sudo apt-get install vim-gtk 安 ...

随机推荐

  1. 2003031121-浦娟-python数据分析五一假期作业

    项目 内容 课程班级博客链接 20级数据班(本) 这个作业要求链接 Python作业 博客名称 2003031121-浦娟-python数据分析五一假期作业 要求 每道题要有题目,代码(使用插入代码, ...

  2. muduo源码分析之回调模块

    这次我们主要来说说muduo库中大量使用的回调机制.muduo主要使用的是利用Callback的方式来实现回调,首先我们在自己的EchoServer构造函数中有这样几行代码 EchoServer(Ev ...

  3. muduo源码分析之TcpServer模块

    这次我们开始muduo源代码的实际编写,首先我们知道muduo是LT模式,Reactor模式,下图为Reactor模式的流程图[来源1] 然后我们来看下muduo的整体架构[来源1] 首先muduo有 ...

  4. 现有教学数据库JX_DB,作业

    现有教学数据库JX_DB,数据库有以下三个基本表: 学生表student,它由学号sno.姓名sname.性别sex.出生日期Bdate.所在系dept五个属性构成.其中,学号不能为空,值是唯一的: ...

  5. Java多线程编程实战02:多线程编程模型

    多线程编程模型 线程安全名词 串行.并发和并行 串行:一个人,将任务一个一个完成 并发:一个人,有策略地同时做多件事情 并行:多个人,每人做一个事情 竞态 名词 竞态:计算结果的正确性与时间有关的现象 ...

  6. CentOS6安装PLEX

    CentOS6安装PLEX 一.安装使用PLEX 1.1 安装 1)下载 https://www.plex.tv/downloads/ plexmediaserver-1.11.3.4803-c40b ...

  7. linux篇-centos7 安装cacti

    1 cacti运行环境准备 cacti需要php+apache+mysql+snmp+RRDTool,以及cacti本身.cacti本体是用php开发的网站,通过snmp对远端设备信息进行采集.apa ...

  8. el-form 中的数组表单验证(数组可动态添加删除)

    除了一些简单的表单验证之外,我们还会有一些稍微复杂点的多层级表单的验证,如下图所示可点击添加,删除对数组进行操作,当点击确定时需要验证每一条form-item不能为空 其tempalte部分主要代码如 ...

  9. babel使用

    Babel转码器 Babel定义 Babel 是一个广泛使用的 ES6 转码器,可以将 ES6 代码转为 ES5 代码,从而在老版本的浏览器执行 Babel安装 仅需要在项目文件下安装 npm ins ...

  10. Python 空间名称与闭包函数

    空间名称与闭包函数 名称空间 名称空间 namespaces:存放名字的地方,是对栈区的划分 名称空间在栈区中分为三种,详细的划分不同的空间,不同空间可以存放相同名字的名字 内置名称空间 存放的名字: ...