跳转到内容

学习 vi 编辑器/Vim/模式

来自维基教科书,开放世界中的开放书籍

VIM 提供比 vi 更多的模式(vi 只提供“普通”、“插入”和“命令行”模式)。这些额外的模式使 VIM 更强大,更容易使用;正因为如此,vim 用户至少应该知道它们的存在。(注意:如果您不小心进入了您不熟悉的模式,通常您可以按 ESC 键返回到 普通 模式。)

以下是 vim 中每个模式的简要概述

名称 描述 帮助页面
普通 用于文本导航和操作。这是 vim 通常启动的模式,通常可以通过按 ESC 键返回该模式。 :help Normal-mode
插入 用于插入新文本。与 vi 的主要区别在于,许多重要的“普通”命令也可以在插入模式下使用——只要您的键盘有足够的元键(例如 Ctrl、Alt、Windows 键等)。 :help Insert-mode
可视 用于文本选择导航和操作,此模式允许您对选定的文本执行大多数普通命令以及一些额外命令。 :help Visual-mode
选择 与可视模式类似,但行为更像 MS Windows。 :help Select-mode
命令行 用于输入编辑器命令——就像第 3 列中的帮助命令。 :help Command-line-mode
Ex 模式 类似于命令行模式,但针对批处理进行了优化。 :help Ex-mode

下面将详细介绍每个模式。

插入(和替换)

[编辑 | 编辑源代码]

在插入模式下,您可以键入新文本。在经典的 vi 中,插入模式仅仅是插入文本,除此之外没有其他功能。Vim 利用了现代键盘上的许多元键;在正确配置的 vim 中,光标键应该可以在插入模式下工作。

可以通过多种方式进入插入模式,但最常见的一些方式是 <a> (在光标后追加)<i> (在光标前插入)<A> (在行尾追加)<I> (在行首插入)<C> (更改到行尾) 以及 <s> (替换字符)

如果您希望通过选择和替换来编辑文本,就像许多基于 GUI 的编辑器中常用的那样,<C> 可以很好地完成此操作。选定的文本将在进入插入模式之前被删除。

普通(命令)

[编辑 | 编辑源代码]

除非您使用 evim 接口,否则这是 vim 的标准模式(vim 在普通模式下启动)。用户在普通模式下键入的所有内容都将被解释为命令(包括切换用户到其他模式的命令)。

如果 vim 作为 evim 启动(命令行中为 evim),vim 将始终让用户处于插入模式。可以通过按 <Ctrl-O> 键,然后按所需的命令进入普通模式。执行完一个命令后,用户将返回到插入模式。(每个普通命令必须首先通过按 <Ctrl-O> 键开始。)您也可以通过按 Esc 键从插入模式进入命令模式。

可视模式中有三种不同的高亮显示类型。每种类型都允许用户以不同的方式高亮显示文本。通常只影响一个字符、一行或一个区域的命令将影响高亮显示的文本(例如,将文本更改为大写 (<Ctrl-~>)、删除文本 (<d>)、缩进行 (>>、<< 和 =) 等等)。

可视模式有三种(子)类型:可视块可视行可视

普通可视模式

[编辑 | 编辑源代码]

普通 可视 模式可以通过在普通模式下按 'v' 键启动。在任何时候,按 ESC 或 <v> 键都会退出 VISUAL 模式,而不会执行任何操作。移动命令会更改选择区域,而其他命令通常会对文本执行预期的操作(有一些例外情况,行为会发生改变或命令无法工作,但如果它没有按你希望的那样做,你可以随时使用 <u> 键撤消)。

块可视模式

[编辑 | 编辑源代码]

块可视 模式可以通过按 <Ctrl-V> 键(或在某些 Windows 版本中按 <Ctrl-Q> 键启动。如果这两个键都不起作用,请使用“:help visual-block”查找启动方式)。可视块始终保持矩形选择,只高亮显示跨多行的特定字符列。在以下示例中,用户想要在每个电话号码的第二和第三个数字字段之间添加一个连字符

用户首先将光标移动到该列的顶部(如果您愿意,也可以从底部开始)。

接下来,按 <Ctrl-V> 键。这将使您进入块可视模式(VISUAL BLOCK 将出现在底部,告诉您您处于哪种可视模式)。接下来,向下移动到所需的底部行。您可以在此示例中看到一列被高亮显示,但您也可以向右或向左移动并高亮显示更多列。

在本例中,用户想要将空格 更改 为连字符。要更改文本,我们按 'c' 键。所有空格都会消失,并且更改只显示在当前行,直到我们键入

当我们按 <ESC> 键时,更改会在所有行上复制。

(注意:如果您只想 插入 文本而不是更改文本,则需要使用 '<I>' 或 '<A>' 键,而不是 '<i>' 或 '<a>' 键。)

行可视模式

[编辑 | 编辑源代码]

行可视 模式中,通过按 <Shift-V> 键进入,整个行会被高亮显示。否则,它通常与普通 可视 模式的工作方式相同。

类似于可视模式,但行为更像 CUA。这意味着如果您键入单个字符,它将替换选择的内容。当然,您会失去所有对选择的单键操作,例如 <U> 将选择的内容改为大写。

此模式通常通过以下方式激活

:behave mswin

这是 MS-Windows 安装的默认设置。您可以通过以下方式获得正常模式:

:behave xterm

命令行

[编辑 | 编辑源代码]

在命令行中,您可以运行 Ex 命令,输入搜索模式,并输入过滤器命令。在底部会出现一个命令行,您可以在其中输入命令。与 vi 不同,vim 支持光标键,这使得输入命令变得容易很多。执行完一个命令后,编辑器将返回到正常模式。

您可以在正常模式下输入冒号 : 来输入 Ex 命令。一些示例包括

:set number
:substitute/search/replace/ig

您可以输入斜杠 / 来向前搜索,或问号 ? 来向后搜索,以输入搜索模式。您可以在这些搜索模式中使用 vim 的扩展正则表达式。例如,

/word

将跳到 "word" 的下一个出现位置(即使它是 "sword" 或 "wordlessly"),但是

/\<word\>

将只跳到完整的单词 "word"(而不是 "sword" 或 "wordless")。

您可以输入一个过滤器,方法是在正常模式下输入 !,然后输入一个移动命令,然后输入一个要在由移动命令捕获的文本上运行的 shell 命令。例如,在 Linux 和其他类 UNIX 操作系统中,输入

!22jsort

将使用 sort 系统命令对当前行及其后的 22 行进行排序。同样的事情也可以用

:.,.+22!sort

事实上,如果您按照第一个示例操作,vim 会为您创建上述命令!

Ex 模式

[编辑 | 编辑源代码]

Ex 模式类似于命令行模式,因为它也允许您输入 Ex 命令。与命令行模式不同,您不会自动返回到正常模式。您可以在正常模式下输入 Q 来输入 Ex 命令,并使用 :visual 命令退出 Ex 模式。请注意,Ex 模式是为批处理而设计的,因此它不支持映射或命令行编辑。

对于批处理,Ex 模式通常从外部启动,方法是在调用编辑器时使用 "-E" 选项。以下是一个来自 RPM 包管理器 规范的真实示例

vim -E -s Makefile <<-EOF
   :%substitute/CFLAGS = -g$/CFLAGS =-fPIC -DPIC -g/
   :%substitute/CFLAGS =$/CFLAGS =-fPIC -DPIC/
   :%substitute/ADAFLAGS =$/ADAFLAGS =-fPIC -DPIC/
   :update
   :quit
EOF

RPM 使用 Bash 作为脚本语言,这使得该示例有点难以理解,因为两种不同的脚本语言在一个文件中混合在一起。

vim -E -s
以改进的 Ex 模式启动 vim,该模式允许使用比 vi 兼容的 Ex 模式 (由 vim -e -s 启动) 更高级的命令。
<<-EOF
告诉 bash 将其后的所有行复制到刚启动的外部程序的标准输入。'-' 告诉 shell 去除制表符。
:
是包含 Ex 命令的行,vim 将执行这些命令。: 是可选的,但在两个脚本语言在一个文件中混合在一起时很有用
:update
初学者常犯的一个错误是忘记在更改后实际保存文件,错误地认为这是自动发生的。
:quit
最后但并非最不重要的一点是:不要忘记实际退出 vim。
EOF
标记标准输入重定向的结束 - 从现在起,bash 将再次执行该命令本身。

如果您的 shell 不允许这种巧妙的标准输入重定向,那么您始终可以使用更经典的 I/O 重定向方法,使用两个文件

vim -E -s Makefile <Makefile-Fix1.vim

如果您没有标准输入重定向可用,那么您可以尝试使用 -c 选项和 source 命令的组合

vim -E -s -c "source Makefile-Fix1.vim" Makefile

使用改进的 Ex 模式,许多传统上由 awksed 执行的任务可以使用 vim 完成,而且通常做得更好

  • awksed 是面向流的 - 它们只从头到尾向前读取文件,而 vim 是面向缓冲区的 - 您可以在文件中随意向前和向后移动。
  • vim 的 正则表达式awksed 的表达式更强大 - 例如,vim 可以跨多行匹配,并支持零匹配。


学习 vi 编辑器: 熟悉基本任务使工作更轻松高级任务细节Vi 克隆 (Vim基本导航模式技巧和窍门程序员需要了解的有用内容增强 VimWindows 上的 VimVimL 脚本语言, Vile, BB vi)vi 参考

华夏公益教科书