ChatGPT解决这个技术问题 Extra ChatGPT

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

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

/copyright/i    # Doesn't work

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


l
lurker

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

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

要进行逆向(区分大小写 匹配),请改用 \C(大写 C)。


此外,\c 可以出现在模式中的任何位置,因此如果您键入一个模式,然后决定要进行不区分大小写的搜索,只需在末尾添加一个 \c
我喜欢在我的 vimrc 中添加 set ignorecase 以进行不区分大小写的搜索,并且我可以使用 \C 进行类似于@AlokSinghal 提到的区分大小写的搜索。
如果您使用任何大写字母,还有 set smartcase 会自动切换到区分大小写的搜索。
只想添加到 Zaz 的评论中。 set smartcase 仅在 set ignorecase 已激活时适用。我被这件事难住了一段时间。请参阅Vim Tips
@coderMe,这是大写,\c\C
D
DrAl

除了对 \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'

ignorecase 的问题在于它会影响替换和搜索。我发现默认情况下进行(智能)不区分大小写的搜索但区分大小写的替换是有意义的。但据我所知,没有办法做到这一点。
值得注意的是,要使 smartcase 工作,您还需要 set ignorecase。很好的提示,谢谢!
我相信您可以在搜索表达式中使用 \C 进行替换,例如::%s/lowercasesearch\C/replaceString/g。这不会创建您想要的默认功能,但它确实允许您强制区分大小写以进行替换,同时在搜索时仍然受益于 smartcase。
您还可以在替换上设置 I flag 以强制模式区分大小写。像:%s/lowercasesearch/replaceString/gI
帮助页面中的注释(如果您像我一样沉迷于“*”,则很有用):After "*" and "#" you can make 'smartcase' used by doing a "/" command, recalling the search pattern from history and hitting <Enter>.
N
Nathan Fellman

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

:set ic

要返回区分大小写的搜索,请使用:

:set noic

icignorecase 的简写


如果您不幸仍然使用 Vi 而不是 Vim,这也是您唯一的选择。 \c 在 vi 中不起作用。
P
Paolo Tedesco

你可以发出命令

:set ignorecase

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


v
vbd

要在区分大小写和不区分大小写的搜索之间切换,我在 .vimrc 中使用了这个映射

nmap <F9> :set ignorecase! ignorecase?


是的,但是 ignorecase? 显示了标志的当前状态。 (在命令行中)
谢谢!对我来说,这是页面上最有用的答案:一种在两种模式之间快速切换的方法,具体取决于您当时正在搜索的内容。
M
Matthieu

您可以在 vimrc 中使用这些命令:

设置忽略大小写 - 您的所有搜索都将不区分大小写

set smartcase - 如果搜索包含大写字母,您的搜索将区分大小写

如果您想使用 smartcase 提供的内容,您需要设置 ignorecase

我最近写了 an article about Vim search commands(内置命令和高效搜索的最佳插件)。


如果我不使用大写字母,set smartcase 似乎不会执行不区分大小写的搜索……这正常吗?
好的,请阅读下面的内容,您必须同时设置 ignorecase 和 smartcase 才能使其工作。对于那个很抱歉!
T
Thomas

正如其他人建议的那样:

:set ic

但很酷的东西是您可以使用以下方式切换此类模式:

:set ic!

M
Mick

好老的 vim[grep] 命令..

:vimgrep /example\c/ &

\c 不区分大小写

\C 区分大小写

是在当前缓冲区中搜索

https://i.stack.imgur.com/e4ftH.gif


Cannot open file "&"
我猜他的意思是 % 而不是 %
C
Community

把这个命令放在你的 vimrc 文件中

set ic 

总是做不区分大小写的搜索


我不知道为什么,但我的 vim 默认设置为不区分大小写,以应对这种情况。使用 set noic
N
Nick Tsai

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

/copyright\c

Y
Yogesh Jilhawar

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

要更改回区分大小写的模式,请在命令模式下键入 -
:set noignorecase:set noic


:set ic! 将切换
p
pbogut

正如@huyz 提到的,有时所需的行为是使用不区分大小写的搜索,但使用区分大小写的替换。我的解决方案:

nnoremap / /\c
nnoremap ? ?\c

总是当您点击 /? 时,它会添加 \c 以进行不区分大小写的搜索。


不错的建议,但它会阻止您使用 smartcase 选项吗?
看起来它会因为 \c 覆盖 smartcase
G
Gowthaman D

Vim 有 2 种模式

1.编辑模式

正常模式(Esc)

搜索将适用于正常模式

/\c 区分大小写

/\c 搜索


视觉模式呢?
S
Steely Wing

您可以默认设置 ignorecase,在 shell 中运行它

echo "set ic" >> ~/.vimrc

D
DevWL

请注意,在表达式中放置诸如“\c”之类的修饰符是不同的:

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

无论从接受的答案来看,这表明在正则表达式模式中放置修饰符的位置没有区别,它看起来确实很重要。

示例文本:

asdasdasdasdasd wiktor asdasdasdasd   
adasdasdasd wiktor asdasda ahjkjlkhjkl
asdasd asd asdasdasdasd iuuuu -       
asdjkkkkkkkaopbsdasda                 
wiktor ----(---------------------)--  

匹配

\c^.*A?.*$
^\c.*A?.*$
^.*\cA?.*$
^.*A\c?.*$

https://i.stack.imgur.com/JDB6q.png

没有匹配

^.\c*A?.*$
^.*A?\c.*$
^.*A?.\c*$
^.*A?.*$\c

https://i.stack.imgur.com/vwuaW.png

vim -version VIM - Vi IMproved 8.2(2019 年 12 月 12 日,编译 2020 年 6 月 1 日 06:42:35)包含的补丁:1-869


M
Manuel Lazo

一些重要信息,如果您想了解更多关于 vim 的命令,如下所述,您可以尝试以下步骤:

调用命令“帮助”后跟一个空格,然后用 TAB 键完成单词,一旦你找到正确的命令按返回键。

:help ignorecase

将显示如下信息:

https://i.stack.imgur.com/Lw1Pk.png

您将能够向前和向后移动并观看简短的命令,例如“ignorecase”('ic')的情况。此外,另一个简短的示例可能是“smartcase”(“scs”等)的情况:

https://i.stack.imgur.com/pPzr5.png

为了离开文档,只需像往常一样输入 ":q" ,您将返回到 "command mode" 。

:q

我真的希望所提供的信息对某人有所帮助。

此致,