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

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

Ответы [ 15 ]

91 голосов
/ 25 августа 2010

Вы можете использовать подстановочные знаки с командой :edit.Таким образом,

:e **/test/Suite.java

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

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

:r! find . -type f

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

40 голосов
/ 24 августа 2010

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

:set path

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

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

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

тогда вы можете просто набрать

:find myfile.txt

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

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

19 голосов
/ 07 августа 2015

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

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

enter image description here

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

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

6 голосов
/ 24 августа 2010

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

3 голосов
/ 28 февраля 2013

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

2 голосов
/ 24 августа 2010

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

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

См. Также эту тему в SuperUser .

2 голосов
/ 24 августа 2010

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

:! find . -name *.xml
1 голос
/ 26 января 2018

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

Используя Comamnd-T и FZF, вы можете выполнять поиск с чрезвычайно быстрым «нечетким» механизмом для:

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

Как видите

enter image description here

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

CTRL+R

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

fzf

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

:CommandT 

Действительно мощный и быстрый.

1 голос
/ 22 сентября 2017

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

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>
1 голос
/ 31 мая 2017

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

:e `locate SomeUniqueFileName.java`

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

locate SomeUniqueFileName.java

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

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