Vim 的宏与文本对象

这一小节我们来讲解一下 Vim 的文本对象和宏的概念,这两个概念比较难理解。但是却很重要,下面我们一起来看一下:

1. 文本对象

文本对象首先针对的就是文本。文本就包括单个字符,单词,句子甚至段落。作为编辑器操作文本是最基本的功能。但是如何能高效的操作上述这些不同文本对象每个编辑器可能都不相同。Vim 也有它自有的特点。它把这些文本都称之为文本对象。所以文本对象听着高大上,其实很容易理解。简单可以按照如下分类:

1.1 单词/句子/段落

文本对象 说明 备注
w word 单词
s sentence 句子
p paragraph 段落

1.2 块文本对象

文本对象 说明  
]/[ [] 块  
)/(、b ()块  
>/< <>块  
}/{、B {} 块  
t 标签块: <> </>  

1.3 文本对象公式

在之前操作中有很多操作都已经涉及到了文本对象操作,这里先抛出一个公式。后面会举例说明。

{operator}{a}{object}
{operator}{i}{object}

daw = delete a word
ciw = change inner word

上述公式中 operator 之前已经讲过了,忘记的同学可以查看前面的内容,或者最好可以通过 Vim 的帮助查看。object 就是我们上述讲的三个文本对象。可能需要注意的就是它们之间的 a 和 i

  • a: 包含尾部间隔空格
  • i: 只是内容本身,不包含尾部单词间隔空格

2. 文本对象实战操作

具体的指令和之前的增删改查讲过的并无二异。都是可以套用。这里不再赘述了。所以这里直接看看文本对象操作本身到底有何不一样的地方。

2.1 开发场景——块文本对象

删除某段括号内所有内容。这里以 Golang 一段代码为例。

Tips:大家可以根据这段代码试试删除小括号

2.2 通用场景——句子/段落

随机打开 object.txt 文件,并删除其中的一个句子,包括空格。然后删除一个段落,不包括空格。

大家可以根据上述场景举一反三。原理都是大同小异。

3. 宏

宏字面理解不太好理解。本质就是个重复回放脚本。我们可以把经常用到的固定步骤操作录制下来,然后需要时候只用调用下就可以了,这就是宏。类似于数据库里的存储过程,或者是代码脚本。

3.1 宏录制步骤

  • 普通模式下,q 键便是宏录制/停止快捷键。
  • 宏录制后需要放在寄存器的,所以需要跟上寄存器名字q{register}。比如:qa
  • 录制完毕后,按下 q 键停止
  • 调用时候只需要 @{register} 即可。就像微博一样 @ 一下。
  • 重复调用 n@{register}

3.2 宏操作指令

指令 说明  
qa 录制宏到寄存器a  
qA 寄存器a中追加宏  
n@a 执行n遍寄存器  
@@ 执行一遍上一次操作  
:n,mnormal @a n到m行执行寄存器a中宏  
:let @a= ’ 编辑宏  

3.4 宏最佳实践

  • 规范光标位置:0——推荐在行首
  • 执行编辑和操作
  • 移动光标到容易回访的位置:j

4. 宏实战

我们在代码中通过宏批量加注释。

录制宏到 c 寄存器,录制完之后批量调用宏 n@c:

使用 @@ 命令执行一遍上一次的操作,为 main.go 文件的第4,21,25行增加注释:

5. 总结

以上就是宏与文本对象的基本原理和相关内容。尤其是宏的概念可以让很多重复操作事半功倍。让 Vim 变得更有用也更有趣。