Como fazer pesquisa sem distinção entre maiúsculas e minúsculas no Vim

1650

Gostaria de procurar uma palavra em maiúscula, por exemplo, COPYRIGHT em um arquivo. Eu tentei realizar uma pesquisa como:

/copyright/i    # Doesn't work

mas não funciona. Eu sei que em Perl, se eu der o isinalizador em uma regex, ela transformará a regex em uma regex que não diferencia maiúsculas de minúsculas. Parece que o Vim tem sua própria maneira de indicar uma regex que não diferencia maiúsculas de minúsculas.

Haiyuan Zhang
fonte

Respostas:

2107

Você pode usar a \csequência de escape em qualquer lugar do padrão. Por exemplo:

/\ccopyrightou /copyright\cou mesmo/copyri\cght

Para fazer o inverso ( correspondência sensível a maiúsculas e minúsculas ), use \C(C maiúsculo).

Chinmay Kanchi
fonte
516
Além disso, \cpode aparecer em qualquer lugar do padrão; portanto, se você digitar um padrão e decidir que deseja uma pesquisa sem distinção entre maiúsculas e minúsculas, basta adicionar uma \cno final.
Alok Singhal
269
Eu gosto de adicionar pesquisas sem distinção set ignorecaseentre maiúsculas e minúsculas no vimrc e posso usar \Cpara fazer uma pesquisa com distinção entre maiúsculas e minúsculas semelhante ao que o @AlokSinghal mencionou.
Nick McCurdy
164
Há também o set smartcaseque mudará automaticamente para uma pesquisa que diferencia maiúsculas de minúsculas se você usar letras maiúsculas.
Zaz
83
Só quero adicionar ao comentário de Zaz. set smartcaseaplica-se apenas quando set ignorecasejá estiver ativo. Fiquei perplexo nisso por um tempo. Consulte Dicas do Vim .
Tan Wang
12
@coderMe, é a capitalização, \ccontra #\C
Aaron McDaid
680

Bem como as sugestões para \ce ignorecase, acho as smartcasemuito úteis. Se você procurar algo que contenha caracteres maiúsculos, ele fará uma pesquisa com distinção entre maiúsculas e minúsculas; se você procurar algo puramente em minúsculas, fará uma pesquisa sem distinção entre maiúsculas e minúsculas. Você pode usar \ce \Csubstituir isso:

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

Vejo:

:help /\c
:help /\C
:help 'smartcase'
DrAl
fonte
83
O problema ignorecaseé que isso afeta as substituições e as pesquisas. Acho que faz sentido ter pesquisas (inteligentes) que não diferenciam maiúsculas de minúsculas, mas substituições que diferenciam maiúsculas de minúsculas por padrão. Mas não há como fazer isso que eu saiba.
huyz
150
Vale a pena notar que, para smartcasetrabalhar, você também precisa set ignorecase. Ótima dica, obrigado!
Skilldrick 28/03/12
12
Eu acredito que você poderia usar apenas a \ C em sua expressão de busca para substituições, como esta: :%s/lowercasesearch\C/replaceString/g. Isso não cria a funcionalidade padrão que você deseja, mas permite forçar a diferenciação entre maiúsculas e minúsculas para substituições, enquanto ainda se beneficia da smartcase ao pesquisar.
Anthony DiSanti 15/10/12
23
Você também pode definir o Isinalizador em uma substituição para forçar o padrão a fazer distinção entre maiúsculas e minúsculas. Like :%s/lowercasesearch/replaceString/gI.
Rory O'Kane
1
Nota da página de ajuda (útil se você é "*" viciado como eu):After "*" and "#" you can make 'smartcase' used by doing a "/" command, recalling the search pattern from history and hitting <Enter>.
mcella
291

Você pode definir a icopção no Vim antes da pesquisa:

:set ic

Para voltar às pesquisas que diferenciam maiúsculas de minúsculas, use:

:set noic

ic é uma abreviação de ignorecase

Nathan Fellman
fonte
também é sua única opção se você tiver azar de usar o Vi em vez do Vim. \cnão funciona no vi.
bluppfisk 12/12/19
61

Você pode emitir o comando

:set ignorecase

e depois disso, suas pesquisas não diferenciam maiúsculas de minúsculas.

Paolo Tedesco
fonte
50

Para alternar entre pesquisa sensível a maiúsculas e minúsculas, eu uso esse mapeamento no meu .vimrc

nmap <F9> :set ignorecase! ignorecase?

vbd
fonte
15
Sim, mas ignorecase?mostra o estado atual da bandeira. (na linha de comando)
Boris Brodski 22/01
1
Obrigado! Para mim, esta é a resposta mais útil da página: uma maneira de alternar rapidamente entre os dois modos, dependendo do que você está procurando no momento exato.
Ben Hillier
31

Você pode usar em seus vimrccomandos:

  • set ignorecase - Todas as suas pesquisas não diferenciam maiúsculas de minúsculas
  • set smartcase - Sua pesquisa fará distinção entre maiúsculas e minúsculas se contiver uma letra maiúscula

Você precisa definir ignorecasese deseja usar o que smartcasefornece.

Escrevi recentemente um artigo sobre os comandos de pesquisa do Vim (tanto comando embutido quanto os melhores plugins para pesquisar com eficiência).

Matthieu
fonte
1
Parece que set smartcasenão realiza pesquisas sem distinção entre maiúsculas e minúsculas se eu não usar letras maiúsculas ... isso é normal?
caneta 21/02
1
Ok, basta ler abaixo que você precisa definir o ignorecase e o smartcase para que funcione. Me desculpe por isso!
caneta 21/02
24

Como outros sugeriram:

:set ic

Mas o interessante é que você pode alternar esses modos com:

:set ic!
Thomas
fonte
18

coloque este comando no seu arquivo vimrc

set ic 

sempre faça pesquisa sem distinção entre maiúsculas e minúsculas

WALID BELRHALMIA
fonte
4
Não sei por que, mas meu vim está definido como sem distinção entre maiúsculas e minúsculas por padrão, para combater isso. use set noic.
user1510539
18

O bom e velho vim[grep]comando ..

:vimgrep /example\c/ &
  • \c caso insensitivo
  • \C para maiúsculas e minúsculas
  • % é procurar no buffer atual

insira a descrição da imagem aqui

Mick
fonte
Cannot open file "&"
Vitaly Zdanevich
Eu acho que ele quis dizer em %vez de %.
oarfish
15

Eu prefiro usar \cno final da string de pesquisa:

/copyright\c
Nick Tsai
fonte
10

Como o @huyz menciona, às vezes o comportamento desejado é usar pesquisas que não diferenciam maiúsculas de minúsculas, mas substituições que diferenciam maiúsculas de minúsculas. Minha solução para isso:

nnoremap / /\c
nnoremap ? ?\c

Com isso sempre quando você pressiona /ou ?ele adiciona \cuma pesquisa que não diferencia maiúsculas de minúsculas.

pbogut
fonte
1
Não é uma sugestão ruim, mas impede você de usar a smartcaseopção?
Trebor rude
Parece que desde que \ c substituismartcase
Matthew Woo
4

Vim tem 2 modos

Modo 1.edit

  1. modo normal (Esc)

A pesquisa funcionará no modo normal

/ \ c para distinção entre maiúsculas e minúsculas

/ \ c pesquisa

Gowthaman D
fonte
E o modo visual?
user202729
3

Você pode definir ignorecasepor padrão, executar isso no shell

echo "set ic" >> ~/.vimrc
Asa de aço
fonte