Ответы:
Ответ Куинси хорош, но есть точный способ сделать это, не требующий редактирования буфера:
:%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//n
n
Флаг в конце говорит :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