Найти файл (с помощью рекурсивного поиска в каталоге) в Vim
есть ли способ рекурсивно искать каталог для файла (используя подстановочные знаки, когда это необходимо) в 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>
и он откроет очень интуитивную панель, где вы можете искать то, что вы хотите:возможно выберите и откройте сразу несколько файлов. Он также принимает дополнительные произвольные команды, такие как переход к определенной строке, вхождению строки или любой другой команде Vim.
vim как встроенная команда поиска (: help find), но открывает только первый найденный файл. Однако вы можете использовать этот удивительный плагин : FuzzyFinder который делает все, что вы хотите, и даже больше
Command-T позволяет найти файл очень быстро, просто набрав несколько букв. Вы также можете открыть файл на новой вкладке, но для этого нужен vim, скомпилированный с поддержкой ruby.
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-200749743Gtfind 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 вы можете сделать поиск с чрезвычайно быстрым "нечетким" механизмом для:
- открытие файлов и буферов
- переход к тегам и помощь
- выполнение команд или предыдущих поисков и команд
- С минимальным количеством нажатий на клавиши.
Как видите,
Я всегда ищу в истории команд, открывая новый терминал и нажимая:
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>