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


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

15 62
vim

15 ответов:

вы можете использовать подстановочные знаки с . Итак,

:e **/test/Suite.java

откроется тест/набор.в Java независимо от того, где он находится в текущей иерархии каталогов. Это работает с tab-completion, поэтому вы можете использовать [tab] для расширения подстановочных знаков перед открытием файла. Смотрите также раздел wildmode опция для просмотра всех возможных расширений вместо этого.

еще один трюк, чтобы использовать

:r! find . -type f

загрузить список всех файлов в текущем каталог в буфер. Затем вы можете использовать все обычные инструменты обработки текста vim для навигации / сортировки / обрезки списка и CTRL+W gf открыть файл под курсором в новой области.

есть команда найти. Если вы добавите ** к вашему пути, то вы можете искать рекурсивно.

:set path

покажет вам ваш текущий путь, добавьте **, сделав что-то вроде

:set path=.,/usr/include,,**

совсем ** Я скопировал из исходного :set path

затем вы можете просто ввести

:find myfile.txt

и он открывается волшебным образом!

если вы добавите команду set в свой .vimrc он будет убедиться, что вы можете сделать рекурсивный поиск в будущем. Это не кажется, для поиска точечных каталогов (.ssh например)

Я бы рекомендовал ctrlp.ВИМ. Это очень хороший плагин, идеально подходит для работы в больших проектах. Он имеет поиск по имени файла или полному пути, поиск регулярных выражений, автоматическое обнаружение корня проекта (тот, с которым .папка git|hg|svn|bzr|_darcs), персонализированные исключения имен файлов и многое другое.

нажмите <c-p> и он откроет очень интуитивную панель, где вы можете искать то, что вы хотите:

enter image description here

возможно выберите и откройте сразу несколько файлов. Он также принимает дополнительные произвольные команды, такие как переход к определенной строке, вхождению строки или любой другой команде Vim.

РЕПО:https://github.com/kien/ctrlp.vim

vim как встроенная команда поиска (: help find), но открывает только первый найденный файл. Однако вы можете использовать этот удивительный плагин : FuzzyFinder который делает все, что вы хотите, и даже больше

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

вы можете использовать ! для выполнения команд оболочки :

:! find . -name *.xml

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

вот учебник о том, как их использовать http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

вы также можете использовать внешнюю команду, такую как find или grep из vim, выполнив ее следующим образом

:!find ...

вы можете просматривать файловую систему с :ex ., но я не знаю, как искать рекурсивно (я новичок Vim - я использую его только десять лет).

есть несколько популярных плагинов для файловых браузеров:

см. также этот поток на суперпользователя.

Я удивлен, что никто не упомянул объединить.ВИМ еще.

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

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>'))

в зависимости от вашей ситуации (то есть, предполагая, что следующая команда найдет только один файл), возможно, используйте команду типа:

:e `locate SomeUniqueFileName.java`

это приведет к тому, что Vim откроет на текущей вкладке (команда e) файл, который является результатом выполнения (в этом примере),

locate SomeUniqueFileName.java

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

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

вам не нужен плагин только для этой функции, ниже фрагмент кода вполне достаточно.

function! FindFiles()
    call inputsave()
    let l:dir = input("Find file in: ", expand("%:p:h"), "dir")
    call inputrestore()
    if l:dir != ""
        call inputsave()
        let l:file = input("File name: ")
        call inputrestore()
        let l:nf = 'find '.l:dir.' -type f -iname '.l:file.' -exec grep -nH -m 1 ".*" {} \;'
        lexpr system(l:nf)
    endif
endfunction
nnoremap <silent> <leader>fo :call FindFiles()<CR>

Command-t в одном из моих любимых плагинов vim, это плагин на основе ruby выше интеграции с FZF.

С помощью Comamnd-T и FZF вы можете сделать поиск с чрезвычайно быстрым "нечетким" механизмом для:

  • открытие файлов и буферов
  • переход к тегам и помощь
  • выполнение команд или предыдущих поисков и команд
  • С минимальным количеством нажатий на клавиши.

Как видите,

enter image description here

Я всегда ищу в истории команд, открывая новый терминал и нажимая:

CTRL+R

в дополнение к рекурсивному поиску во всех папках, записывая на любой вкладке терминала:

fzf

кроме того, вы можете писать внутри vim

:CommandT 

очень мощный и быстрый.

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

чтобы найти файл с помощью некоторого шаблона используйте:

AgFile! pattern

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

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

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>