Vim 有七种基本模式:

1,正常模式(Normal mode)

在正常模式下,可以输入所有正常的编辑器命令。在打开编辑器时,就会进入到该模式(除非设置了“insertmode”选项)。该模式也被称为命令模式。

2,可视化模式(Visual mode)

与正常模式类似,但是移动命令涉及一个高亮区域。当使用非移动命令时,会对高亮区域执行该命令。

如果开启了 'showmode' 选项,那么窗口的底部会展示“-- VISUAL --”。

可视化模式用于选择文本块(select a block of text)。

可视化模式的使用包含三步:

  1. 使用 “v”、“V”或 CTRL-V 标记文本的起始位置。

    光标下的字符会被当作文本块的起始字符。

  2. 移动到文本的终止位置。

    从可视化模式的起始位置到光标下的字符之间的文本会被高亮显示。

  3. 输入操作命令。

    命令将操作被高亮显示的字符

开始可视化模式:

退出可视化模式:

3,选择模式(Select mode)

键入一个可打印的字符删除选中的文本,然后进入插入模式。

如果开启了 'showmode' 选项,那么窗口的底部会展示“-- SELECT --”。

进入选择模式:

选择模式中的命令:

gh:

开启字符选择模式。与“v”类似,但是开启选择模式,而不是可视化模式。

gH:

开启行选择模式。与“V”类似,但是开启选择模式,而不是可视化模式。

g_CTRL-H:

开启块选择模式。与 CTRL-V 类似,但是开启选择模式,而不是可视化模式。

4,插入模式(Insert mode)

在插入模式,键入的文本会被插入到缓冲区。

如果开启了 'showmode' 选项,那么窗口的底部会显示“-- INSERT --”。

常用的插入模式命令:

下面的命令用于向缓冲区中插入新文本。它们都能被取消,以及使用“.”命令重复执行。

5,命令行模式(Command-Line mode)

在命令行模式下,可以在窗口的底部输入一行文本。

命令行模式用于进入 Ex 命令(“:”),搜索模式(“/”和“?”)和过滤器命令(“!”)。

下面将简单地介绍过滤器:

过滤器是一个程序,它在标准输入接收文本,然后以某种方式改变它,最后再把它发送到标准输出。可以使用下面的命令把某些文本发送到过滤器,以便使用过滤器的输出替换它。

“shell”选项用于指定 Vim 用来执行过滤器命令的 shell。可以使用“.”命令重复执行过滤器命令。

:{range}![!]{filter} [!][arg]

通过外部程序 {filter} 过滤 {range} 行。Vim 使用上次指定的命令替换可选的叹号(bang),然后追加可选的 [arg]。Vim 把过滤器命令的输出保存到一个临时文件中,然后把该文件读到缓冲区中。

{range} 的格式可以是:

6,Ex 模式(Ex mode)

与命令行模式类似,但是在输入命令之后,仍然在 Ex 模式。在 Ex 模式中只能进行非常受限的命令行编辑。

在正常模式下,输入“Q”或“gQ”切换到 Ex 模式。在 Ex 模式下,使用“:vi”或“:visual”命令退出 Ex 模式,使用“:q”命令退出 Vim。

Vim 底层使用的是行编辑器 Ex,Ex 产生于终端时代。目前大多数编辑操作都不会直接使用 Ex,但在修改多个文件时,Ex 比较有用。

  1. 使用 ex filename 打开文件时,看不到文件的内容,只能看到该文件的行数和冒号提示符

  2. Ex 命令由行号和命令组成,比如在“1p”中,“1”是行号,“p”是 print 命令。“p”是默认命令,当只有行号时,会打印行号表示的行。没有行号时则表示操作的是当前行

  3. 常用的 Ex 命令包括:

    • delete,缩写为 d
    • move,缩写为 m
    • copy,缩写为 co 或 t
  4. 在 Ex 命令中,可以通过三种方式指定行地址:

    • 绝对的行号
    • 根据当前位置得到的相对位置
    • 搜索到的位置
    • “.”表示当前行;“$”表示最后一行;“%”表示所有行
  5. 常用命令举例:

    • 3,18d

      删除第 3 到第 18 行之间的内容

    • 150,180 m 23

      将第 150 行到第 180 行这个块移动到第 23 行的后面

    • 23,38co100

      将第 23 行到第 38行之间的内容拷贝到第 100 行的后面

    • set nu

      显示行号

    • %t$

      把所有行拷贝到文件的末尾

    • 20,.m$

      把第 20 行到当前行之间的内容移动到文件的末尾

    • .=

      打印当前行的行号,与正常模式下输入 CTRL-G 效果相同

    • =

      打印文件的行数

    • /pattern/=

      打印模式 pattern 第一次出现的行的行号

    • %s/Music/music

      将每行的第一个 Music 替换为 music

    7,终端任务模式(Terminal-Job mode)

    该特性用于在一个 Vim 窗口中运行终端模拟器。连接到终端模拟器的任务会被启动。比如,运行一个 shell:

    或者运行一个构建命令:

    任务会异步地运行,窗口会展示任务的输出,同时也可以在其它窗口中编辑。

    除此之外,Vim 还有 7 种附加模式,它们是基本模式的变种。比如替换模式(Replace mode)。