Vim基础

Vim是一个通过命令进行交互并且区分模式的编辑器,理解这一点是用好Vim的基础。

命令

命令是使Vim进行某种操作的用户输入,用户通过它与Vim进行交互。命令主要分为动作命令、操作符和Ex命令等,像移动光标、输入文本、查找/替换文本等各种操作都是由各种命令执行的。用户对命令的掌握程度决定了Vim的编辑效率。

模式

模式是Vim的一种状态,模式与Vim的命令密切相关,相同的命令在不同的模式下可能对应不同的操作。因此,知道当前正处于哪种模式,以及如何在各模式间切换,是极其重要的。

寄存器

Vim中的寄存器是用于保存文本的容器。通过寄存器,用户不仅能够剪切复制文本,还能够把文本作为表达式或者命令来执行。Vim有多个寄存器,这些寄存器都有其不同的用途,用户可以根据需要选用合适的寄存器来高效地完成编辑任务。

宏允许用户把一段命令序列录制到寄存器中,并在之后进行回放。宏的存在使得用户能够高效地重复执行一系列的编辑操作。

Vim命令

命令的语法

Vim中的命令可以按照一些语法规则进行构造,使得用户能够高效、灵活地表达出一些编辑操作。这些语法规则有:

  1. 操作符 + 动作命令 = 操作。 例子:c为修改操作符,而aw是作用于当前单词的动作命令,所以caw为修改当前单词。
  2. 在动作命令和操作前可以指定重复次数。 例子:j为向下移动一行,3j为向下移动3行。
  3. 当一个操作符命令被连续调用两次时,它会作用于当前行。 例子:y为复制操作符,而yy为复制当前行。
  4. 命令作用的范围 + 待执行的命令 + 命令参数 = Ex命令 例子::2,5 move 10会将第2到5行移动到第10行下,其中2,5是范围,move是要执行的命令,10是要传给命令的参数

.命令

.命令可以用来重复执行上次修改,我们可以把它视为一个宏。 .命令可以用来提高重复编辑工作的效率,不过要想充分发挥它的作用,我们需要构造可重复的修改。

Vim模式

Vim使用了区分模式的编辑模型,每个模式都有其独特的操作,并且相同的按键在不同的模式下可以对应不同的操作。模式是Vim的核心,相比没有模式的编辑器,拥有模式的Vim能够充分复用键位,从而提供各种更加简便快捷的操作方式。

普通模式

普通模式侧重于浏览和编辑已有文本,它被设计为Vim的默认模式,因为通常情况下用户大部分的时间都花在了阅读或调整文本上。

插入模式

插入模式专注于输入文本,大部分的按键被用来输入文字。

可视模式

可视模式为用户提供了选择并操作文本的功能,选择的粒度有单个字符、行以及列。可视模式使得用户能够灵活地选择需要编辑的文本,但它同时也牺牲了一部分.命令的可重复性。在使用 .命令重复一条可视模式命令时,.命令所操作的文本数量和上次被高亮选中的文本数量相同,这意味着在可视模式下.命令无法做出普通模式下的动作命令(motion)。 总而言之,可视模式适合用来对特定范围内的文本进行一次性操作,在普通模式不容易界定编辑范围时,可视模式是一种很好的补充。

命令行模式

命令行模式为用户提供了执行Ex命令和Shell命令的界面。Ex命令使用户可以高效地完成大范围的行编辑,而Shell命令使Vim可以与外部程序进行交互。

Vim虽然区分了各种模式,但它们并不是割裂独立的,相反,这些模式相互补充,共同支持用户进行高效率的编辑。

Vim编辑范式

“一键定位,一键操作”

某些简单的编辑工作可以分解为两种操作:

  1. 移动光标到合适的位置
  2. 编辑文本

这种类型的编辑工作通常可以利用.命令实现“一键定位,一键操作”的高效率编辑,这需要我们:

  1. 构造恰当的光标移动
  2. 构造可重复的.命令或者宏

执行、重复、回退

优化重复性的操作对于高效率的编辑来说是必要的,对此Vim提供了一些实用的重复操作。有时候重复操作会被误用,因此对应的回退操作也是必要的。“执行、重复、回退”是Vim中典型的编辑方式,许多编辑需求都能以这种方式满足。