Vim精粹
Vim基础
Vim是一个通过命令进行交互并且区分模式的编辑器,理解这一点是用好Vim的基础。
命令
命令是使Vim进行某种操作的用户输入,用户通过它与Vim进行交互。命令主要分为动作命令、操作符和Ex命令等,像移动光标、输入文本、查找/替换文本等各种操作都是由各种命令执行的。用户对命令的掌握程度决定了Vim的编辑效率。
模式
模式是Vim的一种状态,模式与Vim的命令密切相关,相同的命令在不同的模式下可能对应不同的操作。因此,知道当前正处于哪种模式,以及如何在各模式间切换,是极其重要的。
寄存器
Vim中的寄存器是用于保存文本的容器。通过寄存器,用户不仅能够剪切复制文本,还能够把文本作为表达式或者命令来执行。Vim有多个寄存器,这些寄存器都有其不同的用途,用户可以根据需要选用合适的寄存器来高效地完成编辑任务。
宏
宏允许用户把一段命令序列录制到寄存器中,并在之后进行回放。宏的存在使得用户能够高效地重复执行一系列的编辑操作。
Vim命令
命令的语法
Vim中的命令可以按照一些语法规则进行构造,使得用户能够高效、灵活地表达出一些编辑操作。这些语法规则有:
- 操作符 + 动作命令 = 操作。
例子:
c
为修改操作符,而aw
是作用于当前单词的动作命令,所以caw
为修改当前单词。 - 在动作命令和操作前可以指定重复次数。
例子:
j
为向下移动一行,3j
为向下移动3行。 - 当一个操作符命令被连续调用两次时,它会作用于当前行。
例子:
y
为复制操作符,而yy
为复制当前行。 - 命令作用的范围 + 待执行的命令 + 命令参数 = 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编辑范式
“一键定位,一键操作”
某些简单的编辑工作可以分解为两种操作:
- 移动光标到合适的位置
- 编辑文本
这种类型的编辑工作通常可以利用.
命令实现“一键定位,一键操作”的高效率编辑,这需要我们:
- 构造恰当的光标移动
- 构造可重复的
.
命令或者宏
执行、重复、回退
优化重复性的操作对于高效率的编辑来说是必要的,对此Vim提供了一些实用的重复操作。有时候重复操作会被误用,因此对应的回退操作也是必要的。“执行、重复、回退”是Vim中典型的编辑方式,许多编辑需求都能以这种方式满足。