Как выполнить поиск без учета регистра в Vim

1651

Я хотел бы найти слово в верхнем регистре, например, COPYRIGHT в файле. Я попытался выполнить поиск как:

/copyright/i    # Doesn't work

но это не работает Я знаю, что в Perl, если я передам iфлаг в регулярное выражение, оно превратит регулярное выражение в регистр без учета регистра. Кажется, что у Vim есть свой собственный способ указать регистронезависимое регулярное выражение.

Хайюань Чжан
источник

Ответы:

2108

Вы можете использовать \cescape-последовательность в любом месте шаблона. Например:

/\ccopyrightили /copyright\cили даже/copyri\cght

Чтобы сделать обратное ( сопоставление с учетом регистра ), используйте \Cвместо него (заглавная C).

Чинмай Канчи
источник
516
Кроме того, он \cможет появиться в любом месте шаблона, поэтому, если вы наберете шаблон и затем решите, что вам нужен поиск без учета регистра, просто добавьте \cв конце.
Алок Сингхал
269
Мне нравится добавлять поиск без учета set ignorecaseрегистра в моем vimrc, и я могу использовать \Cпоиск с учетом регистра, подобный тому, что упоминал @AlokSinghal.
Ник МакКарди
164
Также есть функция, set smartcaseкоторая автоматически переключается на регистрозависимый поиск, если вы используете заглавные буквы.
Заз
83
Просто хочу добавить в комментарий Заз. set smartcaseприменяется только когда set ignorecaseуже активен. Я был озадачен этим на некоторое время. Смотрите Vim Советы .
Тан Ван
12
@coderMe, это капитализация, по \cсравнению с\C
Аарон МакДейд
680

А также предложения для \cи ignorecaseя считаю 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'
Dral
источник
83
Проблема в ignorecaseтом, что это влияет на замены, а также на поиск. Я считаю, что имеет смысл иметь (умный) регистронезависимый поиск, но регистрозависимые замены по умолчанию. Но я не знаю, как это сделать.
Хайз
150
Стоит отметить, что для smartcaseработы вам также необходимо set ignorecase. Отличный совет, спасибо!
Skilldrick
12
Я полагаю , вы могли бы просто использовать \ C в этом выражении поиска замен, как это: :%s/lowercasesearch\C/replaceString/g. Это не создает желаемой функциональности по умолчанию, но позволяет принудительно учитывать регистр для замен, но при этом использовать смарт-регистр при поиске.
Энтони ДиСанти
23
Вы также можете установить Iфлаг подстановки, чтобы заставить шаблон быть чувствительным к регистру. Как :%s/lowercasesearch/replaceString/gI.
Рори О'Кейн
1
Примечание со страницы справки (полезно, если вы "*" зависимы, как я):After "*" and "#" you can make 'smartcase' used by doing a "/" command, recalling the search pattern from history and hitting <Enter>.
mcella
291

Вы можете установить icопцию в Vim перед поиском:

:set ic

Чтобы вернуться к поиску с учетом регистра, используйте:

:set noic

ic это сокращение для ignorecase

Натан Феллман
источник
также ваш единственный вариант, если вам не повезло, что вы все равно используете Vi вместо Vim. \cне работает в vi.
bluppfisk
61

Вы можете выполнить команду

:set ignorecase

и после этого ваши поиски будут без учета регистра.

Паоло Тедеско
источник
50

Чтобы переключаться между поиском с учетом регистра и без учета регистра, я использую это отображение в моем .vimrc

nmap <F9> :set ignorecase! ignorecase?

ВБД
источник
15
Да, но ignorecase?показывает текущее состояние флага. (в командной строке)
Борис Бродский
1
Спасибо! Для меня это самый полезный ответ на странице: способ быстрого переключения между двумя режимами в зависимости от того, что вы ищете в данный момент.
Бен Хиллиер
31

Вы можете использовать в vimrcэтих командах:

  • set ignorecase - Все ваши поиски будут без учета регистра
  • set smartcase - Ваш поиск будет чувствителен к регистру, если он содержит заглавную букву

Вам нужно установить, ignorecaseесли вы хотите использовать то, что smartcaseобеспечивает.

Недавно я написал статью о командах поиска Vim (как встроенных в команду, так и лучшие плагины для эффективного поиска).

Матье
источник
1
Кажется, что set smartcaseне выполняет поиск без учета регистра, если я не использую заглавные буквы ... это нормально?
caneta
1
Хорошо, просто прочитайте ниже, что вы должны установить ignorecase и smartcase, чтобы он работал. Прости за это!
caneta
24

Как и другие предлагали:

:set ic

Но самое интересное, что вы можете переключать такие режимы:

:set ic!
Томас
источник
18

поместите эту команду в ваш файл vimrc

set ic 

всегда выполнять поиск без учета регистра

WALID BELRHALMIA
источник
4
Я не знаю почему, но мой vim по умолчанию установлен без учета регистра, чтобы противостоять этому. использовать set noic.
user1510539
18

Старая добрая vim[grep]команда ..

:vimgrep /example\c/ &
  • \c без учета регистра
  • \C для чувствительного к регистру
  • % это искать в текущем буфере

введите описание изображения здесь

Мик
источник
Cannot open file "&"
Виталий Зданевич
Я думаю, он имел в виду, %а не %.
oarfish
15

Я предпочитаю использовать \cв конце строки поиска:

/copyright\c
Ник Цай
источник
10

Как упоминает @huyz, иногда желаемое поведение использует поиск без учета регистра, но замены с учетом регистра. Мое решение для этого:

nnoremap / /\c
nnoremap ? ?\c

При этом всегда, когда вы нажимаете, /или ?это добавит \cдля поиска без учета регистра.

pbogut
источник
1
Неплохое предложение, но мешает ли оно вам использовать smartcaseопцию?
Требор Руд
Похоже, так было бы, так как \ c переопределяетsmartcase
Мэтью Ву
4

Vim имеет 2 режима

Режим 1.edit

  1. нормальный режим (Esc)

Поиск будет работать в обычном режиме

/ \ c для чувствительного к регистру

/ \ c поиск

Gowthaman D
источник
А как насчет визуального режима?
user202729
3

Вы можете установить ignorecaseпо умолчанию, запустить это в оболочке

echo "set ic" >> ~/.vimrc
Steely Wing
источник