Как вы можете составить список совпадений поиска Vim?

101

Я хотел бы перечислить совпадения, когда я нажимаю:

/example

так что я сразу вижу, где находятся все совпадения.

Лео Леопольд Герц 준영
источник

Ответы:

3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps
Йордан Георгиев
источник
1
Мне очень нравятся твои идеи F5-F8. Было бы неплохо иметь здесь визуализацию / вывод этих команд. Как устроена F8 для работы? Ищет только в текущем каталоге? - - Пропуск директории - это обычай - - Почему node_modules? - - Как регулярные выражения Perl изменяют работу Vim по умолчанию? - - Вот как я разработал свой поиск в файлах .tex askubuntu.com/a/789769/25388 Было бы неплохо узнать от вас, как его улучшить. Это не так интуитивно понятно, поэтому я тоже часто забывала логику.
Лео Леопольд Герц 준영
node_modules - это каталог, содержащий много js-кода из модулей npm, если вы будете разрабатывать
Йордан Георгиев
1
сделайте резервную копию вашего .vimrc и добавьте эти настройки, загрузите их с помощью: so%, а затем попробуйте запустить "help" в командах ... vim сложен - вам придется повторять эти тысячи раз, но как только вы освоите их, вы будете смеяться над всеми, кто укажет на свои ужасные новые возможности UI IDE ...
Йордан Георгиев
226
:g//p

В более длинной форме:

:global/regular-expression/print

Вы можете опустить шаблон / регулярное выражение, и Vim повторно использует предыдущий поисковый запрос.

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

слишком много php
источник
18
:g//- поскольку p (rint) является действием по умолчанию, вы также можете не указывать его.
dekeguard
6
:g/еще короче!
Sparhawk
2
Можно ли увидеть здесь контекст, как в grep --context 9?
Виталий Зданевич
@VitalyZdanevich Try :%s/regular-expression//gn It создаст что-то в этом роде:X matches on Y lines
Alexej Magura
@AlexejMagura Я имею в виду - как увидеть несколько строк до и после строки?
Виталий Зданевич
50

Вы также можете:

g/pattern/#

который напечатает нужный шаблон и номер строки.

Телец Олсон
источник
2
Хороший. Но если у вас уже включены номера строк, #это не требуется. По умолчанию он показывает номера строк
Паван Манджунатх
44

если вы хотите просмотреть этот список и быстро переключаться между совпадениями, рассмотрите возможность использования

:vimgrep example %

или

:grep example %

Это заполнит «список ошибок» всеми совпадениями, так что вы можете использовать их :copenдля перечисления их всех в буфере быстрой фиксации, нажать Enter в определенной строке, чтобы перейти к этому совпадению, или использовать такие команды, как :cnи, :cpчтобы перемещаться вперед и назад.

подробное объяснение см. в моем ответе на аналогичный вопрос

Павел Иванов
источник
Это дает E499: Empty file name for '%' or '#', only works with ":p:h"на MacVim 8.1
Линкольн Бергесон
35

Только что выучил новый Location List:!
Введите :lvim foo %для поиска fooв текущем файле и введите все совпадения, содержащиеся fooв списке местоположений .
Введите, :lopenчтобы открыть список местоположений в окне быстрого исправления, которое, как обычно, полностью доступно для навигации.
Используйте :lnext/ :lpreviousto, чтобы просмотреть список (используйте сопоставления tpope / unimpaired для наилучшего восприятия)

бесплатно
источник
2
Хороший совет! это привело меня к созданию этого сопоставления, которое автоматически расширяет слово под курсором и открывает его за один проход: nnoremap <leader> f: lvim / <cr> = expand ("<cword>") <cr> /% <cr>: lopen <cr>
Jörgen
16

Другая возможность - использовать команды поиска включаемых файлов.

[I

Это перечислит все вхождения слова под курсором. Однако это может быть больше, чем вам нужно, потому что он также будет искать любые файлы, включенные в текущий файл.

Но что хорошо в этой команде, так это то, что на дисплее результатов поиска также отображается количество совпадений в дополнение к номеру строки каждого совпадения.

:help include-search

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

Примечание о

:g//p

В дальнейшем это можно уменьшить до

:g//

потому что, как говорили другие, p (rint) является действием по умолчанию.

Dekeguard
источник
Можно ли получить результат [Iс контекстом, как с grep --context 9?
Виталий Зданевич
10

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

:vim // %
:copen

очень удобно, если вы ранее создавали сложный поисковый шаблон, используя только /pattern

Изменить : только что выяснилось, что это также работает для всех открытых буферов

:bufdo vimgrepadd // %
:copen
user1859022
источник
10

Использование :set hlsearchвыделит все совпадения желтым цветом, что позволит вам легко сканировать файл на предмет совпадений. Это может быть не то, что вы хотите, однако после поиска: g // p выдаст вам перечисленные совпадения

Кевин
источник
2
Должно быть ': set hlsearch' not ': hlsearch'.
слишком много php
Также полезно использовать карту, :nohlчтобы убрать светлые участки, когда они вам больше не нужны.
Кос,
9

Чтобы уточнить это ... вместо

/example
:g//p

вы также можете написать прямо

:g/example/p

или, поскольку p (rint) является действием по умолчанию для команды: g (lobal), его можно сократить до

:g/example

И вместо p (rint) возможны другие действия, например d (elete). См .: help: global

user55400
источник
6
g/pattern

Если да :set number, указанная выше команда также отображает номера строк.

Если нет :set number, то

g/pattern/#

отобразит номера строк.

Сагар Джайн
источник
0

Я написал для этого кусок кода. На самом деле это позволяет избежать проблем с расширением vimgrep. Работает даже с безымянными файлами. И пользоваться им проще.

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

Когда вы вызываете его с шаблоном, он открывает окна локации со всеми совпадениями.

Это может быть команда

command! -nargs=1 Mat call Matches(<f-args>)

Итак, все, что вам нужно сделать, это ввести :Mat pattern

Я также использую следующее сопоставление, чтобы получить совпадения с текущим визуальным выделением.

vnoremap Y "xy:call Matches(@x)<CR>
user2679290
источник
-1

Ctrl-f для вывода всех результатов поиска:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
Фишер
источник