Как выполнить поиск без учета регистра в 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'

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


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 

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


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

18

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

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

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


Cannot open file "&"
Виталий Зданевич

Я думаю, он имел в виду, %а не %.
oarfish


10

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

nnoremap / /\c
nnoremap ? ?\c

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


1
Неплохое предложение, но мешает ли оно вам использовать smartcaseопцию?
Требор Руд

Похоже, так было бы, так как \ c переопределяетsmartcase
Мэтью Ву

4

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

Режим 1.edit

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

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

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

/ \ c поиск


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

3

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

echo "set ic" >> ~/.vimrc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.