विम में एक फ़ाइल (पुनरावर्ती निर्देशिका खोज के माध्यम से) खोजें


84

क्या विम में किसी फ़ाइल (वाइल्डकार्ड का उपयोग करके) के लिए किसी निर्देशिका को खोज करने का कोई तरीका है? यदि मूल रूप से नहीं है, तो क्या कोई प्लगइन है जो इसे संभाल सकता है?



@E_Jovi का क्या मतलब है?
सिरो सेंटिल्ली 郝海东 冠状 i i 法轮功 '

@CiroSantilli 巴拿馬 文件 事件 法轮功 name मेरा मतलब है कि आपका नाम .. जो चीन में निषिद्ध कुछ व्यक्त करता है।
E_Jovi

1
@E_Jovi लेकिन i का क्या मतलब है? बस मेरी चिनसी को सुधारने के लिए :-)
सिरो संटिली 冠状 ins ins ins

2
@CiroSantilli 巴拿馬 ill ill comm atory सराहनीय शब्द के रूप में, इसका मतलब है कि आप कुछ करते हैं जबकि अधिकांश लोग नहीं कर सकते हैं, इस मामले में, मुझे लगता है कि आपका नाम इतिहास का सच बताता है, लेकिन सरकार के व्यवहार के कारण अधिकांश चीनी ऐसा नहीं कर सकते , अपमानजनक शब्द के रूप में, यह व्यक्त करता है कि व्यक्ति बोलता या व्यवहार करता है जो किसी व्यक्ति के लिए सम्मान की कमी दर्शाता है।
E_Jovi

जवाबों:


108

आप :editकमांड के साथ वाइल्डकार्ड का उपयोग कर सकते हैं । इसलिए,

:e **/test/Suite.java

खुलेगा / सूट.जवा कोई बात नहीं जहां यह वर्तमान निर्देशिका पदानुक्रम में है। यह टैब-पूर्णता के साथ काम करता है ताकि आप फ़ाइल खोलने से पहले वाइल्डकार्ड के विस्तार के लिए [टैब] का उपयोग कर सकें। इसके बजाय सभी संभावित एक्सटेंशन के माध्यम से ब्राउज़ करने के तरीके के लिए वाइल्डमोड विकल्प भी देखें ।

एक और ट्रिक है इस्तेमाल करने की

:r! find . -type f

वर्तमान निर्देशिका की सभी फ़ाइलों की सूची को एक बफर में लोड करने के लिए। फिर आप सूची को नेविगेट / सॉर्ट / ट्रिम करने के लिए और CTRL+W gfएक नए फलक में कर्सर के नीचे फ़ाइल खोलने के लिए सभी सामान्य विम टेक्स्ट हेरफेर टूल का उपयोग कर सकते हैं ।


1
+1 मैंने कमांड को संपादित करने में वाइल्डकार्ड की कभी कोशिश नहीं की। यह वास्तव में वाइल्डमोड के साथ भी अच्छी तरह से काम करता है। तो आप टाइप कर सकते हैं: ई ** / सूट <टैब> और सभी में संभावित फाइलों की सूची है
mb14

6
जटिल निर्देशिका संरचना के साथ बड़े फ़ाइल संग्रह के साथ बहुत सावधान रहें। यह कमांड आपके विम को बहुत लंबे समय तक लटका सकती है। मेरे कोडबेस के साथ यह 20 मिनट पहले से ही खोज रहा था। जो बात उलझी हुई है, वह यह है कि इसे रोकने का कोई तरीका नहीं है। मैंने सामान्य Ctrl + C और Ctrl + ब्रेक आज़माया। Procmon दिखाता है कि vim अभी भी मेरी फ़ाइल खोज रहा है। तो समाधान हर किसी के लिए नहीं है :(
evpo

1
@ हमको भी यही समस्या थी। मैंने फ़ोल्डर की संख्या कम करने के लिए खोज में पथ का पहला भाग देकर इसे हल किया: e dir / ** / File.java। फिर एक सेकंड से भी कम समय लगा।
user79878

1
कैसे बकवास मैं इस बारे में पता नहीं था? मैं 20 से अधिक वर्षों से विम का उपयोग कर रहा हूं। बस कमाल 10
ब्रैडले

1
OMG यह भयानक है!
फंककोडायट

50

एक कमांड है। यदि आप अपने को जोड़ते हैं **(देखें :help starstar) 'path'तो आप पुन: खोज कर सकते हैं:

:set path

आपको अपना वर्तमान रास्ता दिखाएगा, **कुछ ऐसा करके जोड़ें

:set path+=**

तो आप बस टाइप कर सकते हैं

:find myfile.txt

और यह जादुई रूप से खुलता है!

यदि आप सेट कमांड को अपने .vimrc में जोड़ते हैं तो यह सुनिश्चित करेगा कि आप भविष्य में पुनरावर्ती खोज कर सकते हैं। यह खोज करने के लिए प्रतीत नहीं होता डॉट निर्देशिका (उदाहरण के लिए .sh)


1
यदि फ़ाइल का नाम बहुत लंबा है, तो यह विधि बहुत आरामदायक नहीं है, या यह my*.txtभी करता है ?
श्रीकांत शरत

1
हां, आप * वाइल्डकार्ड का उपयोग कर सकते हैं। देखते हैं :h find
ताए

12
तुम भी कर अपने रास्ते के लिए :set path+=**
अपील

वहाँ किसी भी तर्क को जोड़ने के लिए कोई खतरा है vimrc? cc @alanboy
iamnotsam

21

मैं ctrlp.vim की सलाह दूंगा । यह एक बहुत अच्छा प्लगइन है, बड़ी परियोजनाओं के अंदर काम करने के लिए आदर्श है। इसमें फ़ाइल नाम या पूर्ण पथ, regexp खोज, प्रोजेक्ट रूट का स्वत: पता लगाने (a के साथ एक) है। hg | svg | svn | bzr | _darcs फ़ोल्डर), वैयक्तिकृत फ़ाइल नाम बहिष्करण और भी बहुत कुछ।

बस दबाएँ <c-p>और यह एक बहुत ही सहज फलक खोलेगा जहाँ आप खोज सकते हैं कि आप क्या चाहते हैं:

यहां छवि विवरण दर्ज करें

एक साथ कई फ़ाइलों को चुनना और खोलना संभव है। यह अतिरिक्त मनमाना आदेशों को भी स्वीकार करता है, जैसे कि एक निश्चित लाइन पर कूदना, स्ट्रिंग घटना या कोई अन्य Vim कमांड।

रेपो: https://github.com/kien/ctrlp.vim


5
kien / ctrlp.vim लगता है अचूक है। Ctrlpvim / ctrlp.vim fork का उपयोग करने के लिए सर्वसम्मति प्रतीत होती है, जो सक्रिय रूप से बनाए रखा प्रतीत होता है: github.com/ctrlpvim/ctrlp.vim
डेमियन la Cealrligh

4
fzf ctrlp के समान है। यह तेज है और परिणाम बेहतर है। यह विम के बाहर भी काम करता है, लेकिन इसे विम सपोर्ट में बनाया गया है: github.com/junegunn/fzf
still_dreaming_1

6

एक अंतर्निहित खोज कमांड के रूप में विम (: खोजने में सहायता करें) लेकिन केवल पहले मिली फ़ाइल खोलें। हालाँकि आप इस अद्भुत प्लगइन का उपयोग कर सकते हैं: FuzzyFinder जो आप चाहते हैं और उससे भी अधिक सब कुछ करता है


3

आप फ़ाइल सिस्टम को ब्राउज़ कर सकते हैं :ex ., लेकिन मैं नहीं जानता कि कैसे पुनरावर्ती खोज करें (मैं एक विम नौसिखिया हूं - मैं केवल दस वर्षों से इसका उपयोग कर रहा हूं)।

कुछ लोकप्रिय फ़ाइल ब्राउज़र प्लग-इन हैं:

इस धागे को सुपरयूजर पर भी देखें ।


3

कमांड-टी आपको कुछ अक्षरों को टाइप करके बहुत तेजी से एक फाइल खोजने की सुविधा देता है। आप फ़ाइल को एक नए टैब में भी खोल सकते हैं, लेकिन इसे माणिक समर्थन के साथ संकलित करने की आवश्यकता है।


और ctrlp.vim भी।
क्रिस


1

vim के पास grep, lgrep, vimgrep या lvimgrep नाम के कमांड हैं, जो ऐसा कर सकते हैं

यहाँ उनका उपयोग करने के तरीके के बारे में एक ट्यूटोरियल है http://vim.wikia.com/wiki/Find_in_files_within_Vim#Recursive_Search

आप इस तरह से इसे निष्पादित करके किसी बाहरी कमांड जैसे वीम से खोज या grep का उपयोग कर सकते हैं

:!find ...

Grep, lgrep, vimgrep या lvimgrep कैसे कर सकते हैं? वे एक फ़ाइल में खोज करते हैं एक फ़ाइल के लिए नहीं।
kroiz

का उपयोग करके उदाहरण के लिए: ग्रेप परीक्षण * / जावा
निकोलस ग्रेडवॉल

यह फ़ाइलों के नाम में शब्द परीक्षण के लिए नहीं दिखेगा। जावा? क्या आप समझा सकते हैं? मुझे यह काम करने के लिए नहीं मिला।
kroiz

@kroiz, हाँ सभी फाइलों में :grep test */.javaशब्द खोजेगा । फ़ाइलों के लिए खोजने के लिए शेल कमांड का उपयोग करेगा । शेल कमांड, सुंदर शक्तिशाली है अगर आप PCRE या विस्तारित regex के साथ संयोजितtest.java:!findfindfind
alpha_989

1

मुझे आश्चर्य है कि किसी ने भी यूनाइट.विम का उल्लेख नहीं किया है।

फाइल्स ढूंढना (फिज़ूल या अन्यथा) आइसबर्ग का एक बहुत ही सिरा है जो किसी डेवलपर के लिए कर सकता है। यह करने के लिए समर्थन में बनाया गया है ag, git, और अन्य कार्यक्रमों / उपयोगिताओं / vim प्लगइन्स के असंख्य। सीखने की अवस्था थोड़ी खड़ी हो सकती है, लेकिन मैं इसके बिना अपने जीवन की कल्पना नहीं कर सकता। उपयोगकर्ता आधार बड़ा है, और बग तुरंत तय हो गए हैं।


1

क्विकफिक्स-जैसे परिणाम ब्राउज़िंग

उपयोग:

Find my.regex

परिणाम:

  • एक नया टैब खुलता है
  • प्रत्येक पंक्ति में एक सापेक्ष पथ होता है जो एक grep -Eरेग्ज से मेल खाता है
  • मारो:
    • <enter>या <C-w>gfएक नई टैब में वर्तमान लाइन पर फ़ाइल खोलने के लिए
    • gf फ़ाइल को वर्तमान टैब पर खोलने के लिए और फ़ाइल सूची को खो दें

इसके बजाय सभी फ़ाइलें खोजें:

Find

वैकल्पिक तरीके:

  • Gfind my.regex: केवल गिट ट्रैक की गई फाइलों की खोज करें ( git ls-files)। भगोड़ा अनुरोध: https://github.com/tpope/vim-fugitive/issues/132#issuecomment-200749743
  • Gtfind 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>'))

1

आपकी स्थिति के आधार पर (अर्थात, निम्नलिखित कमांड को केवल एक फ़ाइल मिलेगी), शायद इस तरह एक कमांड का उपयोग करें:

:e `locate SomeUniqueFileName.java`

यह विम को चालू टैब में (ई कमांड) एक फ़ाइल को खोलने का कारण बनेगा, जो चलने का परिणाम है (इस उदाहरण में),

locate SomeUniqueFileName.java

ध्यान दें कि यहां जादू कमांड के चारों ओर बैकटिक्स है, जो शेल कमांड से आउटपुट को टेक्स्ट कमांड में बदल देगा।


1

आपको इस फ़ंक्शन के लिए केवल प्लगइन की आवश्यकता नहीं है, नीचे कोड स्निपेट पर्याप्त है।

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

Daud:

:args `find . -name '*xml'`

विम बैकटिक्स में शेल कमांड चलाएगा, फ़ाइलों की सूची को आर्गलिस्ट में डाल देगा और पहली फाइल को ओपन करेगा। तो आप उपयोग कर सकते :argsarglist (यानी सूची फ़ाइलें मिल) और देखने के लिए :nऔर :Narglist में फ़ाइलों के माध्यम से आगे और bacwards नेविगेट करने के लिए। देखें https://vimhelp.org/editing.txt.html#%7Barglist%7D और https://vimhelp.org/editing.txt.html#backtick-expansion


0

आप इस प्लगइन के साथ अपने "पथ" में पुनरावर्ती फ़ाइलें पा सकते हैं । यह फ़ाइल नाम के लिए टैब पूर्णता का भी समर्थन करता है।


0

एजी उपकरण और इसी एजी विम प्लगइन इस समस्या को पूरी तरह हल करता है:

कुछ पैटर्न का उपयोग करके एक फ़ाइल खोजने के लिए:

AgFile! pattern

यह उन परिणामों के साथ क्विकफ़िक्स विंडो खोलेगा जहां आप चुन सकते हैं।

आप एक पैटर्न के रूप में चयनित शब्द का उपयोग करके इस कमांड को कॉल करने के लिए vim कीबाइंडिंग जोड़ सकते हैं।

nnoremap <silent> <C-h> :AgFile! '<C-R><C-W>'<CR>
vnoremap <silent> <C-h> y :AgFile! '<C-R>"'<CR>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.