Чи є спосіб рекурсивного пошуку файлу у каталозі (використовуючи підстановні символи, коли це потрібно) у 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 має bild у командах 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 плагін. Крива навчання може бути трохи крутою, але я не уявляю свого життя без неї. База користувачів велика, і помилки виправляються негайно.
Перегляд результатів, схожий на швидкі виправлення
Використання:
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: like 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 запустить команду оболонки у зворотних позначках, додасть список файлів до списку аргументів і відкриє перший файл. Потім ви можете використовувати :argsдля перегляду списку аргументів (тобто переліку знайдених файлів), а :nтакож :Nдля навігації вперед і назад по файлах в списку аргументів. Див. 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>