Одна вещь, которую я часто делаю (но полагаюсь на командную строку), это поиск / поиск в нескольких файлах.
Есть ли способ отобразить результаты поиска для всех открытых буферов?
В идеале, я хотел бы иметь новый разделенный буфер, содержащий местоположение результата и фрагмент так же, как это grep
делает. Например ( /statistics
):
models/statistics.php: /*! \file statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();
В качестве бонуса я хотел бы иметь возможность искать термин под курсором, во многом как gd
делает.
search
multiple-files
Roflo
источник
источник
Ответы:
Вы можете использовать
:vimgrep /pattern/ {files}
для заполнения списка быстрых исправлений соответствующими шаблонами. Проблема в том, что:vimgrep
опция файлов напрямую не разрешает буферы. Ты можешь использовать:Другой вариант - написать скрипт, который генерирует список файлов из
:buffers
. По такому посту с небольшим изменением мы получаем:Теперь вы можете вызывать
:GrepBufs <expression>
и получать стандартный:vimgrep
вывод, но вместо этого используя буферы.Обновить Если вы хотите позвонить,
GrepBuffers
используя значение под курсором, добавьте это новое отображение.Когда вы находитесь в нормальном режиме типа ,
<leader>z
и вы будете:vimgrep
курсор слово над открытыми буферами.источник
command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' ')
. Использование::Bufgrep/foo/
Поиск только в открытых буферах - это хорошо, но может наступить момент, когда вы захотите выполнить поиск по всему проекту. Это может быть быстрее и проще, чем вы думаете!
Поиск по проекту
grep
стандартный поисковый инструмент Unix Стоит упомянуть из-за его повсеместности. Уже интегрированы в Vim через:grep
команду. например:grep -r 'foo'
. См:h :grep
.--perl
. Для интеграции Vim см. Ack.vimgit grep
очень быстро ищет репозиторий Fugitive.vim предоставляет:Ggrep
.git grep
. Можно использовать и с:grep
.Я рекомендую оба ripgrep, Ag, и так
git grep
как они все очень быстрые. Я искал более 4700+ менее чем за 1 секунду. Это довольно сложно победить ripgrep.Чтобы протестировать один из этих вариантов без плагина, или вы просто не хотите плагин, вы можете соответственно настроить свой
'grepprg'
вариант. напримерset grepprg=ag\ --vimgrep
илиset grepprg=rg\ --vimgrep
. Смотрите:h 'grepprg'
и:h 'grepformat'
для получения дополнительной информации. Теперь вы можете искать через:grep
. например:grep 'foo'
.В качестве последнего запасного варианта вы можете использовать
:vimgrep
его, так как он доступен на всех системах, в которых доступен Vim. Смотрите:h :vimg
для получения дополнительной помощи.Список быстрых исправлений
Поскольку большинство этих опций используют список быстрых исправлений, я предлагаю вам использовать более удобные сопоставления для пересечения списка быстрых исправлений. Я использую неповрежденный плагин Тима Поупа, который использует
]q
и[q
для:cnext
и:cprev
соответственно. Некоторые люди , как QuickFix открыть после поиска выполняется , то добавьте следующие строки в~/.vimrc
файл:autocmd QuickFixCmdPost *grep* cwindow
. Вы также можете вручную открыть список QuickFix через:copen
.Хотите еще более быстрых «поисков»?
Вам нужно будет использовать какой-то инструмент, который использует готовые индексы, такие как ctags , cscope или GNU global .
:tag
,<c-]>
и многие другие команды и опции. См:h tags
. Также может захотеть прочитать Effortless Ctags с Git или заглянуть в плагин Gutentags:cscope
команду. Видеть:h cscope
Больше помощи
Я хотел бы начать с этого хорошего эпизода Vimcast : поиск нескольких файлов с
:vimgrep
.Для получения дополнительной помощи Vim см. Документацию:
источник
Мой плагин GrepCommands определяет варианты встроенной
:vimgrep
команды, которые нацелены на поиск всех аргументов, перечисленных буферов, окон на текущей вкладке или на всех вкладках. По сути, надежная реализация плагина ответа @ jecxjo.источник
Команды
:bufdo
и:vimgrepadd
Этот ответ основан на /programming//a/11976158/1057593 .
Однако я хотел добавить несколько битов. Опять основная команда
Если ваш список быстрых исправлений не пуст, вы, вероятно, хотите сначала очистить его (см. Https://stackoverflow.com/q/27385970/1057593 ). Это может быть сделано с
vim-unimpaired предоставляет сопоставления
]q
и[q
циклически проходит матчи.CmdLine-история
Это хороший рабочий процесс для ввода шаблона поиска отдельно
/pattern
. Это позволяет вам использовать общую команду из истории командной строки, используя текущий шаблон поиска. Это будет выглядеть какТипичный новый поиск по всему буферу будет
Я добавил следующие отображения в мой vimrc для использования
<C-N>
и<C-P>
вместо клавиш со стрелкамиДля поиска в истории команд используйте
q:
, затем/bufdo<CR>
и вызовите команду с помощью<CR>
. Для получения дополнительной информации см. Https://vim.fandom.com/wiki/Using_command-line_history и страницы справки:h history
и:h cmdline-window
.Вы можете добавить в команду многоразового использования,
:copen
чтобы сразу увидеть список исправлений следующим образом:Предложение от stackoverflow
:bufdo vimgrepadd // % | copen
открыло несколько непреднамеренных окон в моем случае.источник