Поиск: /, ?, *, # и магия паттернов

Рейтинг: 79.6% · 15 голосов
Исчерпывающий курс по Vim и Neovim: модальное редактирование и грамматика (операторы, движения, текстовые объекты, точка-команда), регистры, метки, макросы, поиск и :substitute, :global, буферы/окна/quickfix, визуальный режим, конфигурация на Lua, маппинги, плагины (lazy.nvim), LSP, автодополнение (blink.cmp), Treesitter, fuzzy-поиск, Git, эргономика и антипаттерны. 34 главы, актуально на 2026 (Vim 9.1, Neovim 0.11/0.12).
Ответить
Аватара пользователя
Roman_Vim
Сообщения: 34
Зарегистрирован: 11 май 2026, 05:31

Поиск: /, ?, *, # и магия паттернов

Сообщение Roman_Vim »

Оглавление курса (34)
  1. Философия Vim: модальное редактирование и почему это актуально в 2026
  2. Установка и выживание: первый запуск, режимы, как выйти
  3. Перемещение по тексту: движения как основа эффективности
  4. Базовое редактирование: вставка, удаление, копирование
  5. Грамматика Vim: операторы + движения = команды
  6. Текстовые объекты: оперируем структурой, а не символами
  7. Точка-команда и повторяемость: "один штрих, чтобы повторить"
  8. Регистры: продвинутая работа с буфером обмена
  9. Метки и прыжки: навигация по истории перемещений
  10. Поиск: /, ?, *, # и магия паттернов (вы здесь)
  11. Замена :substitute и регулярные выражения Vim
  12. Команда :global - оружие массового редактирования
  13. Буферы, окна и вкладки: организация рабочего пространства
  14. Quickfix и location list: пакетная работа по всему проекту
  15. Навигация по файлам: netrw, fuzzy-поиск и проекты
  16. Макросы: автоматизация повторяющихся правок
  17. Визуальный режим и блочное редактирование
  18. Трюки режима вставки
  19. Свёртки, автодополнение и аббревиатуры (встроенные)
  20. Конфигурация с нуля: init.lua и разумные дефолты 2026
  21. Маппинги: leader, which-key и здравые привычки
  22. Скриптинг: основы Vimscript и Lua для Neovim
  23. Менеджеры плагинов: lazy.nvim и lazy-loading
  24. Neovim в 2026: чем отличается и почему выбирают
  25. LSP в Neovim: умные возможности языка
  26. Автодополнение 2026: blink.cmp против nvim-cmp
  27. Treesitter: точная подсветка и структурное редактирование
  28. Fuzzy-поиск: Telescope, fzf-lua и snacks.picker
  29. Git внутри редактора: fugitive, gitsigns и lazygit
  30. Дистрибутивы, отладка и терминал: быстрый старт и интеграции
  31. Vim повсюду: IDE, браузер и shell
  32. Эргономика и антипаттерны: как не навредить себе и не застрять
  33. Рабочие рецепты, тренажёры и план обучения
  34. Шпаргалка-справочник: все ключевые команды одним списком
Поиск - это не отдельная "функция найти", а полноценное движение в Vim. Это меняет всё. Раз поиск - движение, его можно скормить любому оператору (d, c, y), повторить точкой, использовать как прыжок в jumplist (см. главу 9) и превратить в основу выборочного рефакторинга по всему файлу. Программист, который умеет искать в Vim по-настоящему, редко тянется к :substitute с подтверждением - он работает быстрее и с большим контролем.

В этой главе мы разберём весь поисковый арсенал: от простого /foo до very magic-паттернов, текстового объекта gn и связки cgn + ., которая в 2026 году остаётся одним из самых элегантных способов "найти и заменить руками, но молниеносно".

Зачем это нужно

Представьте задачу: в файле на 400 строк нужно переименовать переменную userId в accountId, но не везде - только там, где она встречается как самостоятельное слово, и не трогая userIdList. Можно открыть :%s/, выстроить хитрый паттерн с границами слов, добавить флаг c и нажимать y/n на каждом совпадении. А можно поставить курсор на слово, нажать *, затем cgn, ввести новое имя - и дальше жать . ровно там, где замена нужна. Второй путь короче, нагляднее и не требует выходить из normal-режима.

Поиск также лежит в основе навигации: * мгновенно перепрыгивает к следующему вхождению слова под курсором, n/N гоняют по совпадениям, а /pattern с оффсетом /e ставит курсор ровно в нужную точку. Освоив это, вы перестанете "листать глазами".

Базовый поиск: / и ?

Два направления, две клавиши:
  • /pattern <CR> - искать вперёд (вниз по файлу) от курсора.
  • ?pattern <CR> - искать назад (вверх по файлу).
После того как поиск выполнен, повторять его не нужно набирать заново:
  • n - повторить поиск в том же направлении.
  • N - повторить поиск в обратном направлении.
Важная тонкость: n и N зависят не от физического "вниз/вверх", а от направления исходного поиска. Если вы искали через ? (назад), то n пойдёт вверх, а N - вниз. Это сбивает с толку новичков, но логично: n значит "next match в смысле моего запроса".

Поиск по умолчанию зацикливается ('wrapscan' включён): дойдя до конца файла, он продолжит с начала. Отключить можно через :set nowrapscan, но большинство оставляет дефолт.

Ещё один практичный момент: пустой паттерн повторяет последний. / <CR> (просто слэш и Enter) повторит предыдущий поиск вперёд, а ? <CR> - назад. Последний паттерн хранится в специальном регистре "/ (см. главу 8 о регистрах), и его можно вставить или присвоить программно - этим мы воспользуемся ниже.

История поиска

Командная строка поиска имеет собственную историю. Нажав / и затем стрелку вверх (или <C-p>), вы листаете прошлые запросы. А q/ открывает окно истории поиска - полноценный буфер, где каждую строку можно отредактировать как обычный текст и выполнить нажатием <CR>. Это особенно удобно для длинных регулярок: проще поправить опечатку в буфере, чем перенабирать.

Поиск слова под курсором: *, #, g*, g#

Самый частый сценарий - "найти, где ещё используется вот это слово". Для него есть отдельные клавиши, не требующие набирать паттерн вообще:

Код: Выделить всё

Клавиша  |  Действие
---------+---------------------------------------------------------------------------
*        |  Искать следующее вхождение слова под курсором (вперёд), с границами слова
#        |  То же, но назад
g*       |  Как *, но без границ слова (частичные совпадения тоже считаются)
g#       |  Как #, но без границ слова
Ключевое различие - границы слова. * на слове count ищет паттерн \<count\>, то есть найдёт count, но пропустит counter и account. А g* ищет просто count и остановится в том числе на counter. Когда вы переименовываете идентификатор, нужен *; когда ищете подстроку - g*.

После нажатия * паттерн оседает в регистре "/, поисковая подсветка зажигается, а n/N начинают работать с этим словом. Фактически * - это "настроить поиск по слову и сразу прыгнуть".

Код: Выделить всё

Было (курсор на слове userId в строке 1):
    userId = req.userId;          <- курсор здесь
    const userIdList = [];
    log(userId);

Нажимаем: *
Стало: курсор прыгнул на userId в строке 3 (log(userId)),
       строку с userIdList ПРОПУСТИЛО (это другое слово).
       Дальше n идёт по вхождениям userId как целого слова.
Интерактивность: incsearch, hlsearch и :noh

Две опции, без которых поиск в 2026 году ощущается архаично. В Neovim 'incsearch' и 'hlsearch' включены по умолчанию; в классическом Vim их стоит включить явно в конфиге (см. главу 20).

'incsearch' (incremental search) - по мере набора паттерна Vim сразу подсвечивает и прыгает к первому совпадению. Вы видите результат ещё до нажатия <CR>. Если передумали - <Esc> отменяет поиск и возвращает курсор на исходное место.

'hlsearch' - подсвечивает все совпадения последнего паттерна, а не только текущее. Это превращает поиск в инструмент "обзора": нажали * на имени функции - и видите все её вызовы, разбросанные по экрану.

Проблема hlsearch: подсветка остаётся после того, как поиск стал не нужен, и мешает читать. Решение - команда сброса:
  • :noh (полностью :nohlsearch) - убирает подсветку до следующего поиска. Опцию hlsearch она не выключает, просто гасит текущее свечение.
Типовой маппинг в конфиге - повесить сброс на <Esc> или на <Leader><CR> (про маппинги - глава 21):

Код: Выделить всё

-- Neovim, init.lua
vim.keymap.set('n', '<Esc>', '<cmd>noh<CR>', { desc = 'Clear search highlight' })
В Neovim есть и приятная мелочь: при включённом 'incsearch' подсвечивается ещё и текущее "активное" совпадение отдельным цветом (группа IncSearch), что помогает не путать его с остальными.

Регистр символов: ignorecase и smartcase

По умолчанию поиск чувствителен к регистру: /foo не найдёт Foo. Две опции делают поведение умным:
  • :set ignorecase - поиск игнорирует регистр полностью. /foo найдёт Foo, FOO, foo.
  • :set smartcase - работает только вместе с ignorecase и уточняет его: если в паттерне есть хотя бы одна заглавная буква, поиск снова становится чувствительным к регистру.
Канонический дефолт 2026 года - обе включены:

Код: Выделить всё

vim.opt.ignorecase = true
vim.opt.smartcase = true
Логика получается интуитивной: набрали /error - найдёт и Error, и ERROR (удобно, не надо думать о регистре). Набрали /Error с заглавной - значит, вы осознанно ищете именно Error, и error со строчной будет пропущен.

Важный нюанс: * и # подчиняются ignorecase, но НЕ smartcase (см. :help star) - даже при включённом smartcase команда * на слове со строчными буквами останется регистронезависимой. А ещё в любой паттерн можно встроить флаг прямо посимвольно: \c форсирует игнорирование регистра в этом конкретном поиске, \C - форсирует чувствительность, независимо от опций. Например, /foo\c найдёт FOO даже при noignorecase.

Магия паттернов: режим very magic (\v)

Поиск в Vim - это регулярные выражения, но синтаксис у них исторически своеобразный. По умолчанию (magic) часть метасимволов требует экранирования обратным слешем: чтобы сгруппировать, пишут \(...\), чтобы поставить "один или больше" - \+, альтернатива - \|. Это раздражает всех, кто привык к PCRE/Perl/JavaScript.

Решение - very magic, префикс \v. После него синтаксис становится почти как в обычных регэкспах: (, ), +, ?, |, {} работают без бэкслешей, а экранировать нужно только литералы.

Код: Выделить всё

Что нужно        |  Обычный режим (magic)  |  Very magic (\v)
-----------------+-------------------------+-------------------+-------+-----
Группа           |  \(abc\)                |  (abc)
Один или больше  |  a\+                    |  a+
Ноль или один    |  a\?                    |  a?
Альтернатива     |  foo\                   |  bar              |  foo  |  bar
Квантификатор    |  a\{2,4\}               |  a{2,4}
Граница слова    |  \<word\>               |  <word>
Сравните читаемость поиска "слово из цифр в скобках":

Код: Выделить всё

magic:      /(\d\+)              <- скобки литеральные, \d\+ метасимволы
very magic: /\v\(\d+\)           <- скобки экранированы, \d+ чисто
Есть и зеркальные режимы:
  • \m - magic (дефолт).
  • \M - nomagic, экранирования требует больше символов.
  • \V - very nomagic ("very literal"): почти всё трактуется буквально. Идеально для поиска путей, URL и текста со спецсимволами: /\V/usr/local/bin найдёт буквальную строку, не интерпретируя . или /.
Практическое правило 2026: любой нетривиальный паттерн начинайте с \v. А в скриптах (Vimscript/Lua с vim.fn.search()) фиксируйте режим обязательно - паттерн без явного \v/\m/\M/\V зависит от пользовательской опции 'magic' и может повести себя по-разному у разных людей. Это тот же принцип, что и для :substitute - подробнее в главе 11.

Классы символов и границы слов

Полезный минимум, который покрывает 90% поисков (показан в \v-стиле, но классы \d, \w и т.п. работают во всех режимах):

Код: Выделить всё

Конструкция   |  Значение
--------------+-----------------------------------------------
.             |  Любой символ (кроме перевода строки)
\d / \D       |  Цифра / не цифра
\w / \W       |  Слово-символ ([0-9A-Za-z_]) / не слово-символ
\s / \S       |  Пробельный / не пробельный
\a / \l / \u  |  Буква / строчная / заглавная
[abc]         |  Любой из перечисленных
[^abc]        |  Любой, кроме перечисленных
< и > (в \v)  |  Граница начала / конца слова (\< и \> вне \v)
Границы слов \< и \> (или < и > в very magic) - это нулевая ширина: они не совпадают с символом, а отмечают позицию на стыке слова и не-слова. Именно их подставляет *. Пример: /\v<count> найдёт count как отдельное слово, но не counter и не account.

Код: Выделить всё

Текст:  account counter count counting
/count           -> найдёт ВСЕ четыре (count внутри каждого)
/\v<count>       -> найдёт только третье слово (count целиком)
/\v<count        -> найдёт count и counter и counting (начало слова count)
Поиск как движение: оператор + /

Вот где поиск раскрывается. Раз /foo - это движение к началу совпадения, его можно ставить после оператора:
  • d/foo <CR> - удалить от курсора до начала следующего foo.
  • c/foo <CR> - изменить от курсора до foo.
  • y/foo <CR> - скопировать до foo.
По умолчанию такой оператор работает exclusive: удаляется текст до начала совпадения, само foo остаётся.

Код: Выделить всё

Было:   const value = getUserData() + computeTotal();
        ^курсор в начале строки
Нажимаем: d/comp <CR>
Стало:  computeTotal();
        (удалено всё от начала до начала "comp")
Это мощнее, чем кажется: вместо того чтобы считать слова для dw/d3w, вы просто называете "докуда" через узнаваемый кусок текста.

Оффсеты поиска: /foo/e, /foo/s, /foo/+2

Поиск умеет ставить курсор не на начало совпадения, а со смещением. Оффсет добавляется через второй слэш:

Код: Выделить всё

Оффсет             |  Куда встанет курсор
-------------------+---------------------------------------------------------
/foo/e             |  На последний символ совпадения (end)
/foo/e+1           |  На символ после совпадения
/foo/s или /foo/b  |  На первый символ совпадения (begin) - это и есть дефолт
/foo/s+2           |  На 2 символа правее начала
/foo/+2            |  На 2 строки ниже строки совпадения, в колонку 1
/foo/-1            |  На строку выше, в колонку 1
Оффсет /e особенно ценен в связке с операторами, потому что превращает движение в inclusive (включает само совпадение):

Код: Выделить всё

Было:   foo = calculate(a, b, c);
        ^курсор
Нажимаем: d/c)/e <CR>     (искать "c)", курсор на ")")
Стало:   ;
         (удалено от начала до закрывающей скобки включительно)
Чистая навигация тоже выигрывает: /function/e поставит курсор сразу в конец слова function, готовый к редактированию суффикса. Повтор n сохраняет оффсет.

Обратите внимание на разницу между линейными и символьными оффсетами: линейные (+N/-N, без e/s/b) ставят курсор всегда в колонку 1 соответствующей строки - горизонтальная позиция не сохраняется (см. :help search-offset: "[num] lines downwards, in column 1"). Символьные же (e, s, b с числом) работают относительно самого совпадения.

gn и gN: поиск как текстовый объект

Это, возможно, самая недооценённая фича поиска. gn - это текстовый объект (про текстовые объекты - глава 6), который выделяет текущее или следующее совпадение последнего поискового паттерна.
  • gn - в normal-режиме входит в visual и выделяет следующее совпадение; в комбинации с оператором применяет его к этому совпадению.
  • gN - то же, но в обратную сторону.
Поскольку gn - объект, работает вся грамматика Vim:
  • dgn - удалить следующее совпадение.
  • cgn - изменить (удалить и войти в insert) следующее совпадение.
  • ygn - скопировать его.
И вот ключевая магия - cgn + .:

Код: Выделить всё

Задача: заменить foo на bar выборочно.

1. Ставим паттерн. Проще всего: курсор на foo, жмём *
   (теперь @/ = \<foo\>, и hlsearch показывает все foo)
2. n возвращает на первое foo (или вручную дойти до нужного)
3. cgn  -> foo выделилось и стёрлось, мы в insert
4. печатаем bar, <Esc>
5. Теперь на КАЖДОМ следующем foo:
   - n  -> перейти к нему (если хотим ПРОПУСТИТЬ - просто n)
   - .  -> заменить (точка повторяет ВЕСЬ cgn+ввод!)
Почему это лучше :%s/foo/bar/gc? Потому что точка-команда (глава 7) повторяет всю операцию целиком, включая поиск следующего совпадения. Вы получаете тот же выборочный режим "заменить/пропустить", что и флаг c у :substitute, но:
  • остаётесь в normal-режиме и видите контекст в полном окне;
  • решение "менять или нет" делаете естественным . (заменить) или n (пропустить);
  • можете в любой момент сделать что угодно ещё и вернуться;
  • замена попадает в точку-команду, так что её легко перенести в другой файл.

Код: Выделить всё

Было:
    foo();          <- курсор, жмём * затем cgn -> bar(); <Esc>
    log(foo);
    foo.bar = foo;
    fooBar();       <- это НЕ совпадёт (* ищет \<foo\>)

Последовательность: cgn -> "bar" <Esc> -> n -> . -> . -> n -> .
(где . меняет, n пропускает по вашему усмотрению)

Стало (если меняли всё):
    bar();
    log(bar);
    bar.bar = bar;
    fooBar();       <- осталось нетронутым
Канонический маппинг 2026 года, который ставит паттерн по слову под курсором и сразу запускает замену:

Код: Выделить всё

-- Neovim: <Leader>c - заменить слово под курсором через cgn
vim.keymap.set('n', '<Leader>c',
  [[:let @/='\<'.expand('<cword>').'\>'<CR>cgn]],
  { desc = 'Change word under cursor (repeat with .)' })

-- Визуальный режим: взять выделение как паттерн
vim.keymap.set('x', '<Leader>c',
  [["sy:let @/=@s<CR>cgn]],
  { desc = 'Change selection (repeat with .)' })
После <Leader>c печатаете замену, <Esc>, и дальше . по совпадениям. Подводный камень: cgn опирается на наличие активного паттерна в "/. После "холодного старта" без заданного @/ поведение неинтуитивно - всегда задавайте паттерн через * или маппинг перед cgn.

Ещё одна важная оговорка про визуальный маппинг: он кладёт выделение в @/ как есть, без экранирования regex-метасимволов. Поэтому он корректен только для текста без спецсимволов (простые идентификаторы вроде foo, myVar). Если в выделении окажутся ., *, [, ], \, /, ~ и т.п., они будут истолкованы как regex - паттерн сломается или сработает не так. Для произвольного выделения нужно либо префиксовать паттерн \V (very nomagic, тогда литеральными станут почти все символы, кроме \ и разделителя), либо экранировать через escape(). Например, более надёжный вариант: [["sy:let @/='\V'.escape(@s,'\/')<CR>cgn]].

Лучшие практики 2026
  • Включите incsearch, hlsearch, ignorecase + smartcase. В Neovim первые два - дефолт; регистровые опции добавьте сами. Это базовый "sane defaults"-набор (глава 20), без которого поиск ощущается сырым.
  • Начинайте сложные паттерны с \v. Меньше бэкслешей - меньше ошибок. В скриптах фиксируйте режим явно, не полагаясь на чужую опцию 'magic'.
  • Предпочитайте * + cgn + . для рефакторинга в одном файле. Это нагляднее и контролируемее, чем :%s//gc, и кладёт правку в точку-команду. К :substitute переходите, когда правок много и они однотипны (глава 11), а для всего проекта - quickfix + :cfdo (глава 14).
  • Сбрасывайте подсветку маппингом. Повесьте :noh на <Esc> или leader-клавишу, чтобы hlsearch не превращался в визуальный шум.
  • Используйте \V для "грязного" текста. Пути, URL, строки с ./*// ищите в very nomagic - не придётся экранировать каждый спецсимвол.
  • Запоминайте оффсет /e для inclusive-движений с операторами и точного позиционирования курсора в конец совпадения.
  • q/ для длинных регулярок. Окно истории поиска редактируется как обычный буфер - это удобнее, чем перенабирать сложный паттерн в командной строке.
Частые ошибки
  • Путать направление n/N после ?. n повторяет поиск в направлении исходного запроса. После ?foo клавиша n идёт вверх. Если запутались - / или ? без паттерна задаёт направление заново.
  • Забыть, что * ставит границы слова. Ожидать, что * на count найдёт counter - не найдёт. Для частичных совпадений нужен g*.
  • smartcase без ignorecase. smartcase сам по себе не работает - он только модифицирует ignorecase. Включать надо обе опции.
  • Лишние бэкслеши в \v-паттерне. Перейдя на very magic, легко по привычке написать \( - а там это означает буквальную скобку. В \v экранируются литералы, а не метасимволы.
  • cgn без заданного паттерна. Если "/ пуст или содержит не то, что вы думаете, cgn поменяет неожиданное место. Всегда сначала * или маппинг, выставляющий @/.
  • Считать, что :noh выключает hlsearch. Она лишь гасит текущую подсветку до следующего поиска; сама опция остаётся включённой. Чтобы отключить совсем - :set nohlsearch.
  • Поиск спецсимволов без \V или экранирования. /a.b найдёт и axb, потому что . - метасимвол. Для буквальной точки нужен /a\.b или \Va.b.
Упражнения
  1. Границы слова. В любом коде найдите идентификатор, который является подстрокой другого (например id внутри idList). Поставьте курсор на короткий, нажмите * и убедитесь, что n пропускает idList. Затем попробуйте g* и сравните поведение.
  1. Оператор + поиск с оффсетом. Возьмите строку result = compute(a) + render(b);. Поставьте курсор в начало и удалите всё до закрывающей скобки первого вызова включительно одной командой d/)/e. Затем повторите с c вместо d.
  1. Very magic. Напишите один поисковый паттерн в режиме \v, который найдёт "слово из 3-5 цифр, заключённое в круглые скобки" (например (12345), но не (7) и не 123). Подсказка: \v\(\d{3,5}\). Проверьте на тестовых строках.
  1. cgn + .. Создайте файл с пятью строками, в каждой встречается слово temp. Через * задайте паттерн, затем cgn, замените на cache, и пройдите по остальным, выборочно применяя . и пропуская через n. Оставьте одно вхождение нетронутым.
  1. smartcase на практике. Включите ignorecase + smartcase. В тексте, где есть Error, error и ERROR, убедитесь, что /error находит все три, а /Error - только вариант с заглавной E.
  1. Окно истории. Сделайте 3-4 разных поиска. Нажмите q/, найдите в открывшемся буфере один из паттернов, отредактируйте его прямо в строке и выполните нажатием <CR>. Закройте окно через :q, если передумали.
Главное из главы
  • / и ? ищут вперёд и назад; n/N повторяют поиск в исходном и обратном направлении; пустой паттерн повторяет последний.
  • * и # ищут слово под курсором с границами слова; g*/g# - без границ (частичные совпадения).
  • 'incsearch' показывает совпадение по мере набора, 'hlsearch' подсвечивает все, :noh гасит подсветку.
  • 'ignorecase' + 'smartcase' - рекомендуемый дефолт: регистр игнорируется, пока в паттерне нет заглавных; \c/\C форсируют режим точечно.
  • \v (very magic) даёт PCRE-подобный синтаксис без лишних бэкслешей; \V - для буквального текста. В скриптах режим фиксируется явно.
  • Поиск - это движение: d/foo, c/foo, y/foo работают с любым оператором; оффсет /e делает движение inclusive и точно позиционирует курсор.
  • gn/gN - текстовый объект совпадения; связка * -> cgn -> ввод -> . даёт выборочную замену в normal-режиме, повторяемую точкой, - флагманский приём этой главы.
В следующей главе мы перейдём от "найти руками" к декларативной замене: команда :substitute, группы, \zs/\ze, обратные ссылки и живой предпросмотр inccommand в Neovim.
👍3 ❤️6 🔥 😄 🤔3
Аватара пользователя
qemu_smith
Сообщения: 1
Зарегистрирован: 25 май 2026, 15:28

Re: Поиск: /, ?, *, # и магия паттернов

Сообщение qemu_smith »

cgn + . это что-то с чем-то, реально пересел с :%s//gc на это и не жалею. видишь контекст в полном окне, жмёшь точку где надо, n где не надо. зря я раньше боялся
👍1 ❤️1 🔥1 😄 🤔
Аватара пользователя
lonelydaemon
Сообщения: 1
Зарегистрирован: 25 май 2026, 02:15

Re: Поиск: /, ?, *, # и магия паттернов

Сообщение lonelydaemon »

а у меня cgn сначала сработал не туда. оказалось в @/ висел старый паттерн с прошлого поиска. как в уроке - всегда сперва * или маппинг, и тогда норм. подводный камень реальный
👍1 ❤️1 🔥1 😄 🤔
Аватара пользователя
happycamper
Сообщения: 1
Зарегистрирован: 06 июн 2026, 22:55

Re: Поиск: /, ?, *, # и магия паттернов

Сообщение happycamper »

Roman_Vim писал(а):даже при включённом smartcase команда * на слове со строчными буквами останется регистронезависимой
вот это меня в своё время выбесило пока не дошёл до help star. думал у меня конфиг сломан, а это by design
👍1 ❤️1 🔥1 😄 🤔
Аватара пользователя
davem1
Сообщения: 1
Зарегистрирован: 22 май 2026, 21:24

Re: Поиск: /, ?, *, # и магия паттернов

Сообщение davem1 »

g* против * наконец улеглось в голове. раньше тупо жал * и удивлялся что counter не находит
👍 ❤️1 🔥 😄 🤔
Ответить
← Предыдущая глава
Метки и прыжки: навигация по истории перемещений
Следующая глава →
Замена :substitute и регулярные выражения Vim

Все главы курса «Vim и Neovim: модальное редактирование от основ до современного Neovim»

Поделиться темой: ✈ Telegram VK

Вернуться в «Vim и Neovim: модальное редактирование от основ до Neovim 2026»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 0 гостей