如何在Vim中进行不区分大小写的搜索

2030

我希望在文件中搜索大写单词,例如 COPYRIGHT。我尝试执行以下搜索:

/copyright/i    # Doesn't work

但它没有生效。我知道在Perl中,如果我在正则表达式中加入i标志,它会将正则表达式转换为不区分大小写的正则表达式。似乎Vim有自己的一种方式来表示不区分大小写的正则表达式。

16个回答

2607
您可以在模式中的任何位置使用\c转义序列。例如:

/\ccopyright/copyright\c甚至/copyri\cght

要执行反向(大小写敏感匹配),请改用大写字母C (\C)。

579
另外,\c 可以出现在模式的任何位置,因此如果您输入了一个模式,然后决定要进行不区分大小写的搜索,只需在末尾添加 \c 即可。 - Alok Singhal
328
我希望在我的vimrc文件中添加“set ignorecase”以进行不区分大小写的搜索,同时可以使用\C进行类似于@AlokSinghal所提到的区分大小写的搜索。 - Nick McCurdy
209
还有一个命令 set smartcase,如果你输入大写字母,它将自动切换到区分大小写的搜索模式。 - Zaz
127
只是想在Zaz的评论中补充一点。当且仅当set ignorecase已经激活时,set smartcase才会起作用。我曾经被这个问题困扰了一段时间。请参见Vim技巧 - Tan Wang
13
@coderMe,这里涉及到大写字母的问题,\c\C是有区别的。 - Aaron McDaid
显示剩余2条评论

836

除了使用\cignorecase的建议外,我发现smartcase非常有用。如果您搜索包含大写字符的内容,它将执行区分大小写的搜索; 如果您搜索仅包含小写字符的内容,则将执行不区分大小写的搜索。您可以使用\c\C来覆盖这一行为:

:set ignorecase
:set smartcase
/copyright      " Case insensitive
/Copyright      " Case sensitive
/copyright\C    " Case sensitive
/Copyright\c    " Case insensitive

参见:

:help /\c
:help /\C
:help 'smartcase'

102
“ignorecase” 的问题在于它影响了替换操作及搜索操作。我认为默认情况下应该实现(智能)大小写不敏感的搜索,但大小写敏感的替换操作。但据我所知不可能做到这一点。 - huyz
173
值得注意的是,为了让 smartcase 生效,您还需要使用 set ignorecase。非常好的提示,谢谢! - Skilldrick
15
我认为你可以在搜索表达式中使用 \C 进行替换,像这样: :%s/lowercasesearch\C/replaceString/g。虽然这并不会创建你想要的默认功能,但它允许你在替换时强制区分大小写,同时仍然可以从智能大小写搜索中受益。 - Anthony DiSanti
32
你也可以在替换指令上设置 I 标志 来强制匹配时区分大小写,例如 :%s/lowercasesearch/replaceString/gI - Rory O'Kane
1
来自帮助页面的提示(如果您像我一样沉迷于“”):在使用“”和“#”之后,您可以通过执行“/”命令使用“smartcase”,从历史记录中调用搜索模式并按<Enter>键。 - mcella
我认为应该将@Skilldrick的评论添加到答案中。 - Dane

355

在搜索前,您可以在 Vim 中设置 ic 选项:

:set ic

要重新使用区分大小写的搜索,请使用:

:set noic

icignorecase 的缩写


2
如果你还不幸使用 Vi 而不是 Vim,那么 \c 在 Vi 中是无效的。 - bluppfisk

72

您可以发出该命令

:set ignorecase

之后您的搜索将不区分大小写。


59

你可以在你的vimrc文件中使用以下命令:

  • set ignorecase - 所有搜索都将不区分大小写。
  • set smartcase - 如果搜索项包含大写字母,则大小写敏感。

如果你想使用smartcase提供的功能,你需要设置ignorecase

我最近写了一篇关于Vim搜索命令(内置命令和最佳插件)的文章


2
似乎如果我不使用大写字母,set smartcase 就不能执行大小写不敏感的搜索...这正常吗? - caneta
1
好的,刚才看到你必须同时设置ignorecase和smartcase才能使其工作。对此我感到抱歉! - caneta

51

为了在大小写敏感和不敏感的搜索之间切换,我在我的 .vimrc 文件中使用以下映射:

nmap <F9> :set ignorecase! ignorecase?


17
是的,但 ignorecase? 会显示标志当前的状态。(在命令行中) - Boris Brodski
1
谢谢!对我来说,这是页面上最有用的答案:一种快速切换两种模式的方法,取决于你此时正在搜索什么。 - Ben Hillier
是的,最好有 ignorecase? 这样你就知道当前状态了。 - COil
顺便提一下,最好在命令末尾添加 <Cr>,这样命令就会被验证,而且你不必按回车键(至少在neovim中是这样)。 - COil

28

默认情况下,vi中的所有搜索都是区分大小写的。要进行不区分大小写的搜索,请进入命令模式(按Escape键),然后输入-
:set ignorecase
您也可以输入- :set ic 作为缩写。

要切换回区分大小写模式,请在命令模式下输入-
:set noignorecase:set noic


9
:set ic!会切换。 - robmsmt

27

好用的旧时代vim[grep]命令..

:vimgrep /example\c/ &
  • \c用于不区分大小写
  • \C用于区分大小写
  • %用于在当前缓冲区中搜索

这是图片的描述


Cannot open file "&" - Vitaly Zdanevich
我猜他们是指 % 而不是 % - oarfish

26

正如其他人建议的:

:set ic

不过,有趣的是你可以使用以下方式切换这些模式:

:set ic!

21

我更喜欢在搜索字符串的末尾使用\c:

/copyright\c

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接