
Vim 及其前身 Vi 在 macOS 和大多数 Linux 发行版中都已预装。在远程服务器或最小化系统上工作时,Vim 往往是最唯一可用的编辑器。
在编辑文件时,搜索文本是最常见的操作之一;当你的首选编辑器不可用时,熟练掌握 Vim 的搜索命令会非常有用。
本指南讲解如何在 Vim / Vi 中使用正向与反向搜索、整词匹配、搜索历史,以及区分大小写或不区分大小写的模式进行搜索。
Vim 模式
在 Vim 中搜索前,你必须处于普通模式(Normal mode)。这是打开编辑器时的默认模式。如果你处在其他模式(插入模式或可视模式),请按 Esc 返回普通模式。
Vim 中的基础搜索
Vim 允许你使用两个主要命令来搜索文本:
/(正斜杠)- 正向搜索。?(问号)- 反向搜索。
要执行一次搜索,请按以下步骤操作:
- 按
/进行正向搜索,或按?进行反向搜索。 - 输入搜索模式。
- 按
Enter执行搜索。
Vim 会将光标移动到它找到的第一个匹配项。
要在搜索结果之间导航:
- 按小写
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 中查找与替换》指南。