Featured image of post Neovim 入门教程 14——一些实用高阶技巧

Neovim 入门教程 14——一些实用高阶技巧

学会这些小技巧,增强你使用 neovim 的幸福感

到目前为止,在我看来,我们所安装的插件已经差不多能满足我们基本的开发需求了。现在,我们还需要最后补全一些我们还没有学习的 neovim 技巧和高级配置,让 neovim 使用起来变得更加舒适。当然我不是在说我会用这最后两讲把 neovim 所有的使用技巧都讲出来——那是文档该做的事情;我也不是说除了这一系列教程以外的内容对你来说都没有任何意义了,我只是从我自己的使用经验出发,把我常使用到的 neovim 技巧摊开来讲一讲。

1 寄存器 (register)

相信你在使用 neovim 的时候会遇到一个很讨厌的事情,那就是我们只是想要用 d 删除一段文字,但是 neovim 实际做的却是剪切了这段文字,如果你之前复制了别的内容,那么它就会被覆盖掉。显然,强大的 neovim 不会考虑不到这么基础的功能。如果想要我们删除的内容和之前复制的内容之间互补干扰,我们就要引入寄存器的概念。

在进行复制、删除的操作的时候,这些内容会被存放到寄存器中。寄存器有很多种,比如 unnamed register("")、named register("a"z)等,你可以通过 :h registers 查看这些寄存器的功能。我们可以通过 "ayy 将当前行的内容复制到 a 寄存器中,然后通过 "ap 将 a 寄存器中的内容粘贴出来。其实,我们前面所讲的复制粘贴操作只是省去了指定寄存器的过程,默认情况下,neovim 会将内容添加到 unnamed register,默认的粘贴也是从该寄存器中获取。

所以,为了解决本节开头提到的问题,我们可以通过指定寄存器的方式来规避。然而更多时候,我们并不需要删除的内容,把它放在寄存器中纯粹是浪费资源,此时我们可以使用 black hole register,即 "_。例如 "_cw 就可以直接删除一个单词并且不影响当前复制、剪切的内容。

利用寄存器,我们还可以解决另一个问题,那就是如何和系统的剪贴板互通——默认情况下,我们在 neovim 中复制的内容没有办法在外部应用中进行粘贴,我们需要使用 "+ 寄存器或 "* 寄存器。不过,我们可以设置 neovim 默认使用 "+ 寄存器,只需要在我们的配置中添加下面这行代码:

1
vim.opt.clipboard = "unnamedplus" -- unnamed register + plus register

2 Replace Mode

有时候,如果我们在 normal mode 下只想修改一个字符,并且不想离开 normal mode——经过这么长时间的练习,你应该发现了,频繁离开 normal mode 是一件比较麻烦的事情——该怎么做呢?对于比较长的内容修改,我们的确没什么办法不离开 normal mode,但是对于一个字符的修改,我们可以使用 replace mode。

操作方法是在 normal mode 中,在要修改的字符上按 r 键,然后键入你要修改的字符,在完成键入后,neovim 会自动回到 normal mode。

3 宏操作

在第一讲中,我曾经提到过 neovim 中存在一些可以大幅提高我们效率的功能,其中之一就是宏操作 (macro)。简单来说,它会录制我们的一组按键,后续我们可以按需调用录制好的宏,重复我们此前的按键。这里,我们介绍一下宏涉及到的一些基本操作:

  • Normal mode 下按下 q<register>(例如 qa)开始录制一个宏
  • 结束录制的时候按下 q 即可
  • 按下 @<register>(例如 @a)调用宏,也可以前面加上重复次数,如 10@a
  • 在 normal mode 下,在数字上按下 Ctrl + a 可以让数字加一,按下 Ctrl + x 可以减一

一般来说,宏操作更多应用于批量重复但又没办法通过简单的替换解决的场景。例如,我们这里想要在 HTML 中创建 100 个 div 元素,其 id 依次为 div1div100,该怎么办呢?手动操作似乎很麻烦,但是用宏操作就非常简单。

首先,我们手动写下第一行代码:

1
<div id="div1"></div>

接下来,我们要怎么做呢?如果没有宏,我们应该会把这行代码复制下来,定位到 1 处,然后修改这个 id。好的,我们在使用宏操作的时候也这样做,只不过我们只需要做这个操作一次。我们按下 qayyp02t"<C-a>q 就可以录制这个宏。看起来,这串按键毫无逻辑,的确,但是如果我们拆解来看:

  • qa:开始录制宏 a
  • yy:复制当前行
  • p:在下一行粘贴当前行;注意,此时光标会移动到下一行
  • 0:将光标移动到行首;这样相当于确定一个光标的起始位置
  • 2t":在当前的情景下,id 的数字一定在第二个引号前面
  • <C-a>:增加数字
  • q:结束录制

好的,现在我们还要添加 98 行,那么按下 98@a 将这个宏重复 98 次就可以了。

我们可以进一步对宏操作做一些配置。默认情况下,自增自减的操作只针对数字和十六进制生效,但我们可以设置 nrformats 选项,让它对字母也生效,这样我们对字母 a 进行自增的就会变成字母 b:

1
vim.opt.nrformats = "bin,hex,alpha"

4 Neovim 启动参数

目前,我们启动 neovim 的时候只是在后面加上了要打开的文件名。但实际上,neovim 是可以添加启动参数的,我们可以通过 :h startup-options 查看这些启动参数。例如,我们可以通过 nvim -O file1 file2 直接在一左一右两个 window 中打开两个文件。

不过这一节我主要是想要讲的是,当你的 neovim 配置损坏的时候,该怎么通过添加启动参数进行修复。例如,你可能在你大部分配置被加载之前引入了一个 bug,这就导致下次启动 neovim 的时候,bug 之后的配置都不会被加载了,更坏的情况可能是你会不停地在 neovim 里收到报错,想要正常修改配置文件都做不到。那么,此时我们就可以在启动的时候添加一个 --clean 参数,即不使用任何配置文件打开 neovim,去修改你存在 bug 的那个 neovim 文件。

使用 Hugo + Stack 主题构建