5

VIM编辑器的宏操作 - 行走的BUG永动机

 2 years ago
source link: https://www.cnblogs.com/ICcode/p/16492488.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

VIM编辑器的宏操作

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

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

img_for_typora202207182339192.png

改成下面这样

img_for_typora202207182340817.png

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

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

宏的基本操作

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

操作方式为

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

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

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

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

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

下面一步步演示

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

img_for_typora202207182340884.png

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

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

number <回车>

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

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

img_for_typora202207182340448.png

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

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

img_for_typora202207182340199.png

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

在命令行输入
:normal @a

img_for_typora202207182340017.png

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

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

:register @a
img_for_typora202207182340548.png

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

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

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

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

img_for_typora202207182340410.png

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

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

q
a
<一系列操作>
q

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

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

#方式1
q
a
输入 is 0
q

img_for_typora202207182340040.png

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

img_for_typora202207182340841.png

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

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

#方式2
q
A
输入 is 0
q
img_for_typora202207182340383.png

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

img_for_typora202207182340016.png

宏中设置变量

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

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

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

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

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

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

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

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

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

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

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

img_for_typora202207182340562.png

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

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

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

可以看到只有第一次调用宏时是按照宏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
img_for_typora202207182340061.png

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


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK