与大部分常用的编辑器(notepad、word、kate等)不同,Vim是一种区分操作模式的编辑器。很多常用的编辑操作(如复制、粘贴、删除等)只有在特定的模式下才能进行,相同的按键在不同的Vim模式下所完成的操作是不一致的。

Vim这种区分模式的设计既是其操作高效、灵活的关键,也是其学习曲线十分陡峭的重要原因。

一、普通模式

普通模式(normal mode,也被翻译为正常模式)是打开 Vim 后进入的默认模式;不论当前处于哪种模式,按下 Esc 键 (有时需按两下) 都会进入普通模式。

normal 表示自然、放松的状态,Vim设计之初就认为人们使用编辑器时其实只有小部分时间是在真正进行编辑操作,绝大多数时间会用于思考、阅读,以及在文件已有内容中穿梭浏览。

因此,Vim普通模式下提供了非常高效的命令用于光标移动(如Vim字符查找与光标快速移动命令fVim基于单词移动及Vim单词、字串概念)、位置跳转(如Vim使用ctags实现函数跳转Vim位置标记mark)等。

此外,在Vim普通模式下还可以重新调整已有文件内容的位置(如复制 y、粘贴 p、删除 d),实现对文件的修改。

Vim普通模式的强大,很大程度上源于普通模式命令可以把操作符与动作命令结合在一起。Vim操作符与动作命令的结合形成了一种语法,这种语法的第一条规则很简单:一个操作由一个操作符,后面跟一个动作命令组成。例如,y2j 会复制光标当前所在位置下两行 (2j) 的内容到 Vim 无名寄存器中,6dw 会删除6个单词。推荐阅读Vim中的操作符和动作命令详解

. 命令可以重复最近一次的普通模式命令。

二、插入模式

Vim普通模式下按下 iIaAoO 等键会进入插入模式(insert mode)。

Vim插入模式只专注于做一件事,那就是输入文字,对文件内容进行编辑。除此之外,还可以使用键盘上的 按键移动光标。

另外,为了减少模式切换带来的额外按键成本,Vim还在插入模式下提供了一些额外的功能,如不离开插入模式删除一个单词等,更多内容请阅读Vim插入模式实用技巧

替换模式(rR命令触发)可以看作是插入模式的一种特例,它会从普通模式快速进入插入模式并替换文档中已有的字符,然后再返回到普通模式;

插入-普通模式也算是Vim普通模式的一种特例,它可以在Vim插入模式下执行一次普遍模式命令,执行完后马上就又返回到插入模式。

三、命令行模式

Vim普通模式下按下 : 键会进入命令行模式(command mode)。

Vim命令行模式和 shell 下的命令行有些类似,可以输入一条命令后按回车键执行它。当然,在任意时刻都可以按 Esc 键从命令行模式切换回普通模式。

命令行模式会提示用户输入一条 Ex 命令、一个查找模式或一个表达式。出于历史原因,在命令行模式中执行的命令又被称做 Ex 命令。在我们按 / 调出查找提示符或用 <Ctrl>= 访问表达式寄存器时,命令行模式也会被激活。

有时使用 Ex 命令能比用普通模式命令更快地完成同样的工作。例如,普通模式命令一般操作当前字符或当前行,而 Ex 命令却可以在任意位置执行,这意味着无需移动光标就可以使用 Ex 命令做出修改。具体内容可参考Ex命令操作范围Vim跨行操作

此外,Vim还提供了在 命令行模式 下对一系列连续行执行一条 普通模式 命令的 :normal 命令。

例如,:%normal A 将指示 Vim 在文件每行的结尾添加一个分号。关于 normal 命令的详细介绍和使用方法,推荐阅读Vim normal命令和重复操作

@: 命令可用于重复最近一次的 Ex 命令。

Vim命令行模式下也提供用于对文件内容进行删除、复制与粘贴操作的 Ex 命令。例如,执行 :delete c 可以把当前行剪切到寄存器 c,再执行 :put c 命令可将其粘贴至当前光标所在行之下。

相比Vim普通模式下的 ydp 等命令来说,这些操作看似繁琐,但如果将它们与其他 Ex 命令结合起来使用,或者用于 Vim 脚本编程,将会更方便。例如,Vim global命令和重复操作一文就展示了 :delete 命令怎样和 :global 命令一起使用的场景。

四、可视化模式

Vim普通模式按下 vV<Ctrl> v 可以进入可视化模式 (visual node)。

大多数的Vim普通模式命令在可视化模式下依然有效。例如,仍可以把 hjkl 当成光标移动键使用;也可以用 f{char} 跳到当前行的某个字符上,然后用 ;, 命令正向或反向重复此跳转。

每次在可视模式中移动光标,都会改变高亮选区的边界。在可视模式中执行完一条命令后会返回到普通模式,并且在可视模式里所选中的文本范围也不再高亮显示。

Vim可视化模式举例

五、操作符待决模式

操作符待决模式(Operator-Pending mode)是一个只接受Vim动作命令的状态。这个状态在调用操作符时被激活,直到提供一个动作命令,完成整个操作为止。关于Vim的操作符和动作命令,强烈推荐阅读谈谈Vim中的操作符和动作命令

六、小结

可以看出,Vim虽然提供了多种操作模式,但各种模式之间相互依赖,彼此穿插 (如可以在插入模式下执行普通模式命令、可以在命令行模式下执行普通模式下的命令)。而这一切,都是为了在操作效率上提供支持。这5种操作模式,都应该是Vim日常使用中经常要经历的,缺一不可。

:Vim查找命令可以在普通模式下使用,也可以在可视模式及操作符待决模式中使用来完成实际的工作。

嗯,扫一扫就可以找到小女子我啦~