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

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

Ответ 1

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

:e **/test/Suite.java

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

Другим трюком является использование

:r! find . -type f

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

Ответ 2

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

:set path

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

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

бит перед ** Я скопировал из начального :set path

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

:find myfile.txt

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

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

Ответ 3

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

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

введите описание изображения здесь

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

Репо: https://github.com/kien/ctrlp.vim

Ответ 4

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

Ответ 5

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

Ответ 6

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

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

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

:!find ...

Ответ 7

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

:! find . -name *.xml

Ответ 8

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

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

См. также этот поток на SuperUser.

Ответ 9

Просмотр в виде Quickfix в виде

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

Find my.regex

Результат:

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

Найти все файлы:

Find

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

код:

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

Ответ 10

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

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

Ответ 11

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

:e `locate SomeUniqueFileName.java`

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

locate SomeUniqueFileName.java

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

Ответ 12

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

Ответ 13

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

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>