Vim 及其前身 Vi 已预装在 macOS 和大多数 Linux 发行版中。在处理远程服务器或精简系统时,Vim 通常是唯一可用的编辑器。

搜索文本是编辑文件时的最常见任务之一,掌握 Vim 的搜索命令在您首选编辑器不可用时将非常有用。

本指南解释了如何使用正向和反向搜索、全词匹配、搜索历史以及区分大小写或不区分大小写的模式在 Vim / Vi 中进行搜索。

Vim 模式

您必须处于正常模式才能在 Vim 中进行搜索。这是打开编辑器时的默认模式。如果您处于其他模式(插入或可视),请按 Esc 返回正常模式。

Vim 中的基本搜索

Vim 允许您使用两个主要命令来搜索文本:

  • / (正斜杠) - 正向搜索。
  • ? (问号) - 反向搜索。

执行搜索的步骤如下:

  1. 按 / 进行正向搜索或按 ? 进行反向搜索。
  2. 输入搜索模式。
  3. 按 Enter 运行搜索。

Vim 搜索

Vim 将光标移动到它找到的第一个匹配项。

Searches 将模式作为子字符串进行匹配,而不是整个单词。搜索“gnu”也会匹配较大单词(如“cygnus”或“magnum”)中的出现。

导航搜索结果:

  • 按小写 n 搜索下一个出现。
  • 按大写 N 向相反方向搜索。

搜索整个单词

要仅匹配整个单词,请添加单词边界:

  • \< 标记单词的开始。
  • \> 标记单词的结束。

例如,要仅搜索“gnu”作为独立单词,您将使用 /\<gnu\>:

搜索整个单词

搜索当前单词

Vim 提供了快速捷径来搜索当前单词(光标下方的单词)。

将光标放在一个单词上并:

  • 按 * (星号) 正向搜索全词匹配。
  • 按 # (井号) 反向搜索。

再次按 * 或 # 以查找下一个匹配项。

使用 Vim 搜索历史

Vim 会跟踪当前会话期间执行的所有搜索操作。要访问搜索历史:

  1. 按 / 或 ?。
  2. 使用上/下箭头键浏览之前的搜索。
  3. 按 Enter 运行搜索。您可以在执行操作之前编辑模式。

搜索高亮

在 Vim 的默认配置中,搜索会将光标移动到当前匹配项,而不会高亮文件中的每个匹配项。您可以使用 hlsearch 选项来控制持久性搜索高亮。

要为当前会话启用搜索高亮,请运行:

vi

:set hlsearch

要清除当前高亮而不禁用设置,请使用 :nohlsearch 命令(或其缩写 :noh):

vi

:noh

要为当前会话完全关闭搜索高亮:

vi

:set nohlsearch

要使任一设置永久生效,请将其添加到您的 ~/.vimrc 文件:

~/.vimrcvim

set hlsearch

大小写敏感性

默认情况下,Vim 搜索是区分大小写的;搜索“GNU”不会匹配“Gnu”。

每次搜索覆盖大小写敏感性

要忽略一次搜索的大小写,请在搜索模式后追加 \c:

vi

/Linux\c

要强制区分大小写,请在模式后追加大写 \C:

vi

/Linux\c

为当前会话覆盖大小写敏感性

要使当前会话的搜索不区分大小写,请在 Vim 命令行中输入 :set ignorecase 或 :set ic。

要返回到大小写匹配模式,请键入 :set noignorecase 或 :set noic。

智能大小写

smartcase 选项是 ignorecase 的有用补充。当两者都启用时,如果模式全是小写,Vim 将忽略大小写,但一旦您键入任何大写字母,就会切换到区分大小写的匹配。

vi

:set ignorecase:set smartcase

使用这种组合,/linux 匹配“Linux”、“LINUX”和“linux”,而 /Linux 仅匹配“Linux”。

永久覆盖大小写敏感性

要将忽略大小写和智能大小写设置为默认选项,请将其添加到您的 ~/.vimrc 文件:

~/.vimrcvim

set ignorecase
set smartcase

快速参考

对于可打印的快速参考,请参阅 Vim 速查表。

命令描述
/pattern正向搜索模式
?pattern反向搜索模式
n跳转到下一个匹配项
N跳转到上一个匹配项
*正向搜索光标下方的单词
#反向搜索光标下方的单词
/\<word\>仅搜索整个单词
/pattern\c不区分大小写的搜索(一次性)
/pattern\C区分大小写的搜索(一次性)
:set ignorecase忽略所有搜索的大小写
:set ignorecase smartcase除非模式包含大写字母,否则忽略大小写
:set hlsearch高亮所有匹配项
:noh清除当前搜索高亮

故障排除

搜索高亮未清除
在正常模式下键入 :noh 以清除当前搜索的高亮,而无需禁用 hlsearch。如果您想永久关闭高亮,请将 set nohlsearch 添加到 ~/.vimrc。

搜索意外匹配单词的一部分
默认情况下,Vim 搜索子字符串。使用单词边界来限制匹配:/\<word\> 仅匹配确切单词,而不是较大单词内的出现。

区分大小写的搜索未按预期工作
检查是否已设置 ignorecase(使用 :set ignorecase?)。如果已启用且您需要区分大小写的搜索,请向模式追加 \C 或运行 :set noignorecase 以在会话中禁用它。

搜索意外环绕文件
Vim 默认会环绕文件末尾。要禁用环绕,请运行 :set nowrapscan。

常见问题解答

如何在 Vim 中搜索单词?
在正常模式下按 /,输入单词,然后按 Enter。使用 n 跳转到下一个匹配项,使用 N 返回。要直接搜索光标下方的单词,请按 *。

如何在 Vim 中搜索下一个匹配项?
按 n 移动到与当前搜索相同方向的下一个匹配项,按 N 向相反方向移动。

如何在 Vim 中进行不区分大小写的搜索?
向搜索模式追加 \c(例如 /linux\c)以忽略该一次搜索的大小写。要忽略会话中所有搜索的大小写,请运行 :set ignorecase。将其添加到 ~/.vimrc 使其永久生效。

Vim 中的 / 和 ? 有什么区别?
/ 从光标位置向文件末尾正向搜索。? 向文件开头反向搜索。两者默认都会环绕文件。

如何在 Vim 中关闭搜索高亮?
运行 :noh 以清除当前高亮。要完全禁用高亮,请运行 :set nohlsearch 或将 set nohlsearch 添加到您的 ~/.vimrc。

我可以使用正则表达式在 Vim 中搜索吗?
是的。Vim 支持搜索模式中的正则表达式。例如,/^foo 匹配以“foo”开头的行,而 /foo.*bar 匹配“foo”后跟任何内容,然后是“bar”。完整参考请参阅 Vim 查找和替换指南,其中详细介绍了正则表达式模式。