Найти файл (с помощью рекурсивного поиска в каталоге) в Vim - PullRequest
71 голосов
/ 24 августа 2010

Есть ли способ рекурсивного поиска в каталоге файла (с использованием подстановочных знаков при необходимости) в Vim? Если не изначально, есть ли плагин, который может справиться с этим?

Ответы [ 15 ]

1 голос
/ 06 апреля 2016

Я удивлен, что никто не упомянул Unite.vim .

Поиск файлов (нечетко или иначе) - это лишь верхушка айсберга того, что он может сделать для разработчика.Он имеет встроенную поддержку ag, git и множество других плагинов программ / утилит / vim.Кривая обучения может быть немного крутой, но я не могу представить свою жизнь без нее.База пользователей большая, и ошибки исправляются немедленно.

1 голос

Просмотр результатов в стиле Quickfix

Использование:

Find my.regex

Итог:

  • открывается новая вкладка
  • каждая строка содержит относительный путь, соответствующий grep -E регулярному выражению
  • хит:
    • <enter> или <C-w>gf, чтобы открыть файл в текущей строке в новой вкладке
    • gf, чтобы открыть файл на текущей вкладке и потерять список файлов

Вместо этого найдите все файлы:

Find

Альтернативные методы:

  • Gfind my.regex: поиск только по отслеживаемым файлам Git (git ls-files). Беглец запрос: https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743
  • Gtfind my.regex: похоже Gfind, но поиск по верхнему уровню git вместо текущего каталога
  • Locate somefile: locate версия

Код:

function! Find(cmd)
  let l:files = system(a:cmd)
  if (l:files =~ '^\s*$')
    echomsg 'No matching files.'
    return
  endif
  tabedit
  set filetype=filelist
      set buftype=nofile
  " TODO cannot open two such file lists with this. How to get a nice tab label then?
  " http://superuser.com/questions/715928/vim-change-label-for-specific-tab
  "file [filelist]
  put =l:files
  normal ggdd
  nnoremap <buffer> <Enter> <C-W>gf
  execute 'autocmd BufEnter <buffer> lcd ' . getcwd()
endfunction
command! -nargs=1 Find call Find("find . -iname '*'" . shellescape('<args>') . "'*'")
command! -nargs=1 Gfind call Find('git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Gtfind call Find('git rev-parse --show-toplevel && git ls-files | grep -E ' . shellescape('<args>'))
command! -nargs=1 Locate call Find('locate ' . shellescape('<args>'))
1 голос
/ 24 августа 2010

vim имеет билд в командах с именами grep, lgrep, vimgrep или lvimgrep, которые могут это сделать

, вот руководство по их использованию http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

вы также можете использовать внешнийкоманда типа find или grep из vim, выполнив ее так:

:!find ...
0 голосов
/ 27 сентября 2018
Инструмент

ag и соответствующий плагин Ag vim отлично решают эту проблему:

Чтобы найти файл с использованием некоторого шаблона, используйте:

AgFile! pattern

Откроется окно быстрого исправления с результатами, которые вы можете выбрать.

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

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>
0 голосов
/ 06 февраля 2013

Вы можете найти файлы рекурсивно в вашем "пути" с помощью этого плагина . Он также поддерживает завершение табуляции для имени файла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...