Як зробити нечутливий пошук у Vim


1650

Я хотів би знайти верхнє слово у великому регістрі, наприклад COPYRIGHT у файлі. Я спробував здійснити пошук на зразок:

/copyright/i    # Doesn't work

але це не працює. Я знаю, що в Perl, якщо я передаю iпрапор у регулярний вираз, він перетворить регулярний вираз у нечутливий до регістру регекс. Здається, що у Віма є свій спосіб вказати на нечутливий до регексу випадок.

Відповіді:


2106

Ви можете використовувати \cпослідовність втечі в будь-якому місці шаблону. Наприклад:

/\ccopyrightабо /copyright\cабо навіть/copyri\cght

Щоб зробити обернене (з урахуванням регістру ), \Cзамість цього використовуйте (з великої літери С).


516
Крім того, вони \cможуть з’являтися в будь-якому місці шаблону, тому якщо ви введете шаблон, а потім вирішите, що хочете нечутливий до регістру пошук, просто додайте в \cкінці.
Алок Сінгал

268
Мені подобається додавати set ignorecaseдля нечутливого до обліку пошуку в моєму vimrc, і я можу використовувати \Cдля обліку регістру, подібного до того, що згадував @AlokSinghal.
Нік МакКерді

163
Є також, set smartcaseщо автоматично перейде до великого регістру пошуку, якщо ви використовуєте будь-які великі літери.
Заз

82
Просто хочу додати коментар Заза. 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.
Rory O'Kane

1
Зауважте на сторінці довідки (корисно, якщо ви "*" After "*" and "#" you can make 'smartcase' used by doing a "/" command, recalling the search pattern from history and hitting <Enter>.
звикаєтесь

291

Ви можете встановити icпараметр у Vim перед пошуком:

:set ic

Щоб повернутися до пошукових запитів, залежних від регістру, використовуйте:

:set noic

ic це скорочення для ignorecase


також ваш єдиний варіант, якщо вам не пощастило все-таки використовувати Vi замість Vim. \cне працює in vi.
bluppfisk

61

Ви можете видати команду

:set ignorecase

і після цього ваші пошукові запити не залежать від регістру.


50

Для переключення між пошуковим і нечутливим пошуком я використовую це відображення у своєму .vimrc

nmap <F9> :set ignorecase! ignorecase?


15
Так, але ignorecase?показує поточний стан прапора. (у командному рядку)
Борис Бродський

1
Дякую! Для мене це найкорисніша відповідь на сторінці: спосіб швидкого перемикання між двома режимами залежно від того, що ви шукаєте в той момент.
Бен

30

Ви можете використовувати в своїх vimrcцих командах:

  • set ignorecase - Усі ваші пошукові запити не залежать від регістру
  • set smartcase - Ваш пошук буде враховувати великі регістри, якщо він містить великі літери

Вам потрібно встановити, ignorecaseякщо ви хочете використовувати те, що smartcaseпередбачено.

Нещодавно я написав статтю про пошукові команди Vim (як вбудовані в команду, так і найкращі плагіни для ефективного пошуку).


1
Здається, що set smartcaseне виконуються нечутливі до регістру пошуки, якщо я не використовую великі літери ... це нормально?
caneta

1
Гаразд, просто прочитайте нижче, що вам потрібно встановити ігнорувати і смарт-чек, щоб він працював. Вибач за те!
caneta

24

Як запропонували інші:

:set ic

Але класна річ: Ви можете перемикати такі режими за допомогою:

:set ic!

18

помістіть цю команду у свій файл vimrc

set ic 

завжди робимо нечутливий пошук у випадку


4
Я не знаю чому, але мій vim за замовчуванням встановлений на чутливий до регістру, щоб протистояти цьому. використання set noic.
користувач1510539

18

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

:vimgrep /example\c/ &
  • \c для корпусу нечутливий
  • \C для чутливих до регістру
  • % полягає в пошуку в поточному буфері

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


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

Я думаю, він мав на увазі %замість цього %.
морська риба

15

Я вважаю за краще використовувати \cв кінці рядка пошуку:

/copyright\c

10

Як згадує @huyz, іноді бажана поведінка використовує нечутливі до регістру пошуки, але чутливі до регістру підстановки. Моє рішення для цього:

nnoremap / /\c
nnoremap ? ?\c

З цим завжди, коли ви натискаєте, /або ?це додасть \cдля нечутливого до регістру пошуку.


1
Непогана пропозиція, але чи заважає вам використовувати цей smartcaseваріант?
Trebor Rude

Схоже, це буде з моменту відміниsmartcase
Matthew Woo

4

Vim має 2 режими

1. режим редагування

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

Пошук буде працювати у звичайному режимі

/ \ c для чутливих до регістру

/ \ c пошук


Що з візуальним режимом?
користувач202729

3

Ви можете встановити ignorecaseза замовчуванням, запустити це в оболонці

echo "set ic" >> ~/.vimrc
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.