在 Vim / Vi 中搜索文本:正向反向搜索、整词匹配、大小写与高亮实战

Vim 及其前身 Vi 在 macOS 和大多数 Linux 发行版中都已预装。在远程服务器或最小化系统上工作时,Vim 往往是最唯一可用的编辑器。

在编辑文件时,搜索文本是最常见的操作之一;当你的首选编辑器不可用时,熟练掌握 Vim 的搜索命令会非常有用。

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

Vim 模式

在 Vim 中搜索前,你必须处于普通模式(Normal mode)。这是打开编辑器时的默认模式。如果你处在其他模式(插入模式或可视模式),请按 Esc 返回普通模式。

Vim 中的基础搜索

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

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

要执行一次搜索,请按以下步骤操作:

  • 按 / 进行正向搜索,或按 ? 进行反向搜索。
  • 输入搜索模式。
  • 按 Enter 执行搜索。

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

提示:搜索会将模式作为子字符串进行匹配,而不是整词匹配。搜索 “gnu” 也会匹配 “cygnus” 或 “magnum” 这类更长单词中的出现。

要在搜索结果之间导航:

  • 按小写 n 搜索下一个匹配项。
  • 按大写 N 沿相反方向搜索。

搜索整词

若只想匹配整词,可以添加单词边界:

  • \< 用于标记单词的开头。
  • \> 用于标记单词的结尾。

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

搜索当前单词

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

将光标置于某个单词上,然后:

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

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

使用 Vim 搜索历史

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

  • 按 / 或 ? 。
  • 使用上下方向键浏览之前的搜索。
  • 按 Enter 执行搜索。在执行操作前,你可以先编辑该模式。

搜索高亮

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

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

:set hlsearch

要在不关闭该设置的情况下清除当前高亮,使用 :nohlsearch 命令(或其缩写 :noh ):

:noh

要为当前会话彻底关闭搜索高亮:

:set nohlsearch

要让以上任一设置永久生效,请将其添加到你的 ~/.vimrc 文件中:

set hlsearch

大小写敏感

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

单次搜索时覆盖大小写规则

要针对某一次搜索忽略大小写,可在搜索模式后附加 \c :

/Linux\c

要强制区分大小写,可在模式后附加大写的 \C :

/Linux\C

为当前会话覆盖大小写规则

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

要回到区分大小写的模式,请输入 :set noignorecase 或 :set noic 。

Smartcase(智能大小写)

smartcase 选项是 ignorecase 的一个实用补充。当两者同时启用时,如果模式全部为小写,Vim 会忽略大小写;但一旦输入任何大写字母,就会切换到区分大小写的匹配。

:set ignorecase
:set smartcase

在这种组合下,/linux 可匹配 “Linux”、“LINUX” 和 “linux”,而 /Linux 只匹配 “Linux”。

永久覆盖大小写规则

要将 ignorecase 和 smartcase 设为默认选项,请将它们加入你的 ~/.vimrc 文件中:

set ignorecase

set smartcase

快速参考

如需可打印的速查表,请参阅 Vim 备忘单(Vim cheatsheet)。

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

故障排查

搜索高亮无法清除:在普通模式下输入 :noh 可清除当前搜索的高亮,同时不关闭 hlsearch。如果你希望永久关闭高亮,请在 ~/.vimrc 中加入 set nohlsearch 。

搜索意外匹配了单词的一部分:默认情况下,Vim 会搜索子字符串。请使用单词边界来限制匹配:/\<word\> 只会匹配精确的单词,而不会匹配更长单词中的片段。

区分大小写的搜索表现不符合预期:请通过 :set ignorecase? 检查 ignorecase 是否已设置。如果已开启,而你需要区分大小写的搜索,既可以在模式后附加 \C ,也可以运行 :set noignorecase 为当前会话关闭该选项。

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

常见问题(FAQ)

如何在 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 中查找与替换》指南,其中详细介绍了正则表达式模式。

总结

一旦掌握了按键,Vim 的搜索命令既快速又灵活。使用 / 和 ? 进行正向与反向搜索,使用 n 和 N 在匹配之间导航,使用 * 立即搜索光标下的单词。要进一步掌控你的编辑流程,请参阅《Vim 中查找与替换》指南。