Ответы:
Ответ Куинси хорош, но есть точный способ сделать это, не требующий редактирования буфера:
:%s/pattern//ng
Это напечатает сообщение как 3 matches on 2 lines, и в ваш буфер не будет внесено никаких изменений.
nФлаг делает :substituteкоманду печать количества совпадений вместо выполнения фактической замены; gфлаг позволяет сообщать о нескольких матчей в каждой строке.
Еще одна вещь, которая может быть полезна для вашего варианта использования, это напечатать все строки, которые соответствуют шаблону:
:global/pattern/print
который можно сократить до:
:g/pattern
Это одно из самых простых применений :globalкоманды (которое невероятно мощно). Он просто распечатает все совпадающие строки pattern, а затем (если имеется более одной строки) вы нажимаете Enterили вводите другую команду, чтобы она исчезла.
Немного мелочей: эта команда является источником имени grep, как его обычно называют g/re/p, где reобозначает «регулярное выражение».
g/re/pна самом деле из ed, а не vi. Grep предшествует vi на пару лет.
nnoremap <leader>n :%s///gn<CR>отображение. Поэтому я нажимаю <leader>nдля подсчета вхождений ранее найденного шаблона. Я использую это на удивление часто.
:%s/pattern//nnФлаг в конце говорит :sкоманду , чтобы сообщить количество матчей и на самом деле не заменить. Читайте :h :s_flagsдля более подробной информации.
gn?
gесли считаете, что в каждой строке может быть несколько совпадений, что часто является правдой. Для цели вопроса, однако, флаг nявляется более важным.
Сначала используйте /для поиска регулярных выражений, затем
:%s///gn
Это то же самое, что и ответ Дхурвы, за исключением того, что он a.) Проще в использовании (так как вы можете предварительно просмотреть результаты того, что сначала соответствует вашему регулярному выражению) и b.) Глобально сопоставляется с gфлагом, чтобы подсчитать все вхождения.
Благодаря этому PR https://github.com/vim/vim/pull/4317 , каждая команда поиска показывает статистику поиска (например, текущее положение и количество совпадений) в vim 8.1.1270. Обязательно удалите Sиз переменной shortmess.
:%s/pattern//g
Вы увидите количество замен в строке состояния. Вот сколько раз patternпоявляется. Затем просто нажмите, uчтобы отменить замены.
Сопоставление, которое я добавил в свой .vimrc, основано на ответах здесь:
" count nr of occurrences of word under cursor
nnoremap <leader>c :%s/<c-r><c-w>//gn<cr>
" count nr of occurrences of visual selection
vnoremap <leader>c :<c-u>%s/<c-r>*//gn<cr>
Немного объяснения, надеюсь, полезно для новых vimmers:
<c-r><c-w> вставляет слово под курсором в командной строке, что удобно во многих случаях.
<c-u>Необходимо удалить автоматически вставляется '<,'>
при нажатии :в визуальном режиме и собирается в командной строке.
*Регистр содержит (последний) визуальный выбор, <c-r>*
вставляет содержимое *регистра в командной строке (также может быть использован в режиме вставки).
:h count-items