Есть ли способ рекурсивного поиска файла в каталоге (при необходимости с использованием подстановочных знаков) в Vim? Если не изначально, есть ли плагин, который может с этим справиться?
Есть ли способ рекурсивного поиска файла в каталоге (при необходимости с использованием подстановочных знаков) в Vim? Если не изначально, есть ли плагин, который может с этим справиться?
Ответы:
В команде можно использовать подстановочные знаки :edit
. Так,
:e **/test/Suite.java
откроет test / Suite.java независимо от того, где он находится в текущей иерархии каталогов. Это работает с завершением табуляции, поэтому вы можете использовать [tab] для раскрытия подстановочных знаков перед открытием файла. См. Также параметр wildmode, чтобы вместо этого просмотреть все возможные расширения.
Еще одна уловка - использовать
:r! find . -type f
для загрузки списка всех файлов в текущем каталоге в буфер. Затем вы можете использовать все обычные инструменты редактирования текста vim для навигации / сортировки / обрезки списка, а также CTRL+W gf
для открытия файла под курсором в новой панели.
Есть команда поиска. Если вы добавите **
(см. :help starstar
) В свой, 'path'
вы можете рекурсивно искать:
:set path
покажет вам ваш текущий путь, добавьте **
, выполнив что-то вроде
:set path+=**
тогда вы можете просто ввести
:find myfile.txt
и открывается волшебно!
Если вы добавите команду set в свой .vimrc, она обеспечит вам возможность выполнять рекурсивный поиск в будущем. Кажется, он не ищет точечные каталоги (например, .ssh)
my*.txt
также подходит ?
:h find
.
:set path+=**
Я бы рекомендовал ctrlp.vim . Это очень хороший плагин, идеально подходящий для работы внутри больших проектов. В нем есть поиск по имени файла или полному пути, поиск по регулярному выражению, автоматическое определение корня проекта (тот, который находится в папке .git | hg | svn | bzr | _darcs), персонализированные исключения имен файлов и многое другое.
Просто нажмите, <c-p>
и откроется очень интуитивно понятная панель, где вы можете искать то, что хотите:
Можно выбрать и открыть сразу несколько файлов. Он также принимает дополнительные произвольные команды, такие как переход к определенной строке, вхождение строки или любую другую команду Vim.
vim как встроенную команду поиска (: help find), но открывать только первый найденный файл. Однако вы можете использовать этот замечательный плагин: FuzzyFinder, который делает все, что вы хотите, и даже больше.
Вы можете просматривать файловую систему с помощью :ex .
, но я не знаю, как выполнять рекурсивный поиск (я новичок в Vim - я использую его всего десять лет).
Есть несколько популярных плагинов файловых браузеров:
См. Также эту ветку на SuperUser .
Вы можете использовать ! для запуска команд оболочки:
:! find . -name *.xml
vim имеет билд в командах grep, lgrep, vimgrep или lvimgrep, которые могут это делать
вот руководство о том, как их использовать http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search
вы также можете использовать внешнюю команду, например find или grep, из vim, выполнив ее следующим образом
:!find ...
:grep test */.java
будет искать слово test
во всех .java
файлах. :!find
будет использовать команду find
оболочки для поиска файлов. Команда find
оболочки довольно мощная, если объединить ее с pcre или расширенным регулярным выражением
Я удивлен, что никто еще не упомянул Unite.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>
Бежать:
:args `find . -name '*xml'`
Vim выполнит команду оболочки с обратными кавычками, поместит список файлов в список arglist и откроет первый файл. Затем вы можете использовать его :args
для просмотра списка arglist (т.е. списка найденных файлов) :n
и :N
для перехода вперед и назад по файлам в списке arglist. См. Https://vimhelp.org/editing.txt.html#%7Barglist%7D и https://vimhelp.org/editing.txt.html#backtick-expansion.
С помощью этого плагина вы можете рекурсивно находить файлы по своему «пути» . Он также поддерживает завершение табуляции для имени файла.
Инструмент 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>