सभी खुले बफ़र्स के लिए खोज परिणाम कैसे दिखाएं


17

एक चीज जो मैं अक्सर करता हूं (लेकिन करने के लिए कमांड लाइन पर निर्भर करता हूं) एकाधिक फ़ाइलों में खोज / grepping है।

क्या सभी खुले बफ़र्स के लिए खोज परिणाम प्रदर्शित करने का एक तरीका है?

आदर्श रूप से, मैं एक नया स्प्लिट बफ़र रखना चाहूँगा जिसमें परिणाम स्थान और स्निपेट बहुत अधिक हों grep। उदाहरण के लिए ( /statistics):

models/statistics.php: /*! \file   statistics.php
controllers/stats.php: $this->load->model('statistics');
controllers/stats.php: // Query statistics...
controllers/stats.php: $num_exams = $this->statistics->countExams();

एक बोनस के रूप में, मैं कर्सर के नीचे शब्द की खोज करने में सक्षम होना चाहता हूं, बहुत पसंद gdहै।


जवाबों:


15

आप :vimgrep /pattern/ {files}मिलान पैटर्न के साथ क्विकफ़िक्स सूची को पॉप्युलेट करने के लिए उपयोग कर सकते हैं । समस्या यह है कि :vimgrepफ़ाइलें विकल्प सीधे बफ़र्स के लिए अनुमति नहीं देता है। आप उपयोग कर सकते हैं:

%   Is replaced with the current file name.       *:_%* *c_%*
#   Is replaced with the alternate file name.     *:_#* *c_#*
#n  (where n is a number) is replaced with        *:_#0* *:_#n*
    the file name of buffer n.  "#0" is the same as "#".     *c_#n*
##  Is replaced with all names in the argument list   *:_##* *c_##*
    concatenated, separated by spaces.  Each space in a name
    is preceded with a backslash.
#<n (where n is a number > 0) is replaced with old    *:_#<* *c_#<*
    file name n.  See |:oldfiles| or |v:oldfiles| to get the
    number.                         *E809*
    {only when compiled with the |+eval| and |+viminfo| features}

एक अन्य विकल्प एक स्क्रिप्ट लिखना है जो एक फ़ाइल सूची बनाता है :buffers। प्रति इस अतः पद एक मामूली Tweek हम मिल के साथ:

function! BuffersList()
  let all = range(0, bufnr('$'))
  let res = []
  for b in all
    if buflisted(b)
      call add(res, bufname(b))
    endif
  endfor
  return res
endfunction

function! GrepBuffers (expression)
  exec 'vimgrep/'.a:expression.'/ '.join(BuffersList())
endfunction

command! -nargs=+ GrepBufs call GrepBuffers(<q-args>)

अब आप कॉल कर सकते हैं :GrepBufs <expression>और मानक :vimgrepआउटपुट प्राप्त कर सकते हैं, लेकिन इसके बजाय बफ़र्स का उपयोग कर सकते हैं ।

अद्यतन यदि आप GrepBuffersकर्सर के तहत मूल्य का उपयोग करके कॉल करना चाहते हैं तो इस नई मैपिंग को जोड़ें।

nnoremap <leader>z :call GrepBuffers("<C-R><C-W>")<CR>

जब आप सामान्य मोड में होते हैं <leader>zऔर :vimgrepआपके खुले बफ़र्स पर कर्सर शब्द होता है।


2
एकल पंक्ति रूप में command! -bang -nargs=+ Bufgrep execute 'vimgrep<bang><args> ' . join(map(filter(range(1, bufnr('$')), 'buflisted(v:val)'), '"#".v:val'), ' '):। उपयोग::Bufgrep/foo/
पीटर रिनेकर

8

केवल खोले गए बफ़र्स में खोज करना अच्छा है, लेकिन ऐसा समय भी आ सकता है, जब आप संपूर्ण प्रोजेक्ट पर खोज करना चाहते हैं। यह आपके विचार से अधिक तेज़ और आसान हो सकता है!

किसी प्रोजेक्ट पर खोज करना

  • grepयूनिक्स मानक खोज उपकरण है। इसकी सर्वव्यापकता के कारण उल्लेख। पहले से ही :grepकमांड के माध्यम से विम में एकीकृत किया गया है । उदा :grep -r 'foo'। देख लो :h :grep
  • Ack नियमित grep की तुलना में तेज़ है क्योंकि यह VCS निर्देशिकाओं, बाइनरी फ़ाइलों को छोड़ देता है, और जैसे विशिष्ट प्रकार के फ़ाइलपेट की खोज कर सकता है --perl। विम एकीकरण के लिए Ack.vim देखें
  • एजी द सिल्वर सर्फर एक कोड-सर्च टूल है, जो ऐक के समान है, लेकिन तेज है। विम प्लगइन: Ag.vim
  • git grepएक रिपॉजिटरी को बहुत जल्दी खोजता है। Fugitive.vim प्रदान करता है :Ggrep
  • Ripgrep Ag और से भी तेज है git grep। के साथ भी इस्तेमाल किया जा सकता है :grep

मैं ripgrep, Ag, और दोनों को सलाह देता हूं git grepक्योंकि वे सभी सुपर फास्ट हैं। मैंने 1 सेकंड से भी कम समय में 4700+ से अधिक की खोज की है। रिपग्रेप को हराना बहुत कठिन है।

एक प्लगइन के बिना इन विकल्पों में से एक का परीक्षण करने के लिए या आप बस एक प्लगइन नहीं चाहते हैं आप अपने 'grepprg'विकल्प को तदनुसार सेट कर सकते हैं । जैसे set grepprg=ag\ --vimgrepया set grepprg=rg\ --vimgrep। देखें :h 'grepprg'और :h 'grepformat'अधिक जानकारी के लिए। अब आप के माध्यम से खोज कर सकते हैं :grep। उदा :grep 'foo'

अंतिम गिरावट के रूप में आप इसका उपयोग कर सकते हैं :vimgrepक्योंकि यह सभी प्रणालियों पर उपलब्ध है जो विम उपलब्ध है। :h :vimgअधिक सहायता के लिए देखें ।

क्विकफिक्स लिस्ट

जैसा कि इन विकल्पों में से अधिकांश क्विकफ़िक्स सूची का उपयोग करते हैं, मेरा सुझाव है कि आप क्विकफ़िक्स सूची को पार करने के लिए कुछ अधिक अनुकूल मैपिंग का उपयोग करें। मैं टिम पोप का उपयोग अछूता जो का उपयोग करता है प्लगइन ]qऔर [qके लिए :cnextऔर :cprevक्रमशः। कुछ लोगों को खोज के बाद खोलने के लिए क्विकफ़िक्स पसंद है, तो अपनी ~/.vimrcफ़ाइल में निम्न जोड़ें autocmd QuickFixCmdPost *grep* cwindow:। आप मैन्युअल रूप से क्विकफिक्स सूची भी खोल सकते हैं :copen

और भी तेजी से "खोज" चाहते हैं?

आप की तरह एक पहले से बनाए गए अनुक्रमणिका का उपयोग करता है कुछ उपकरण का उपयोग करने की जरूरत करने जा रहे हैं ctags , cscope , या जीएनयू वैश्विक

  • विम के माध्यम से ctag समर्थन में बनाया गया है :tag, <c-]>और कई अन्य आदेश और विकल्प। देख लो :h tags। इसके अलावा Git के साथ Effortless Ctags पढ़ना चाहते हैं या Gutentags प्लगइन देख सकते हैं
  • Cscope समर्थन भी बनाया गया है और :cscopeकमांड के माध्यम से उपयोग किया जा सकता है । देख:h cscope

और अधिक सहायता

मैं इस अच्छे विमकास्ट एपिसोड के साथ शुरू करूंगा : कई फाइलों को खोजें:vimgrep

अधिक Vim मदद के लिए प्रलेखन देखें:

:h grep
:h :vimgrep
:h :grep
:h 'grepprg'
:h 'grepformat'
:h quickfix
:h :cnext
:h tags
:h cscope

6

मेरा GrepCommands प्लगइन अंतर्निहित :vimgrepकमांड के वेरिएंट को परिभाषित करता है जो सभी तर्कों, सूचीबद्ध बफ़र्स, वर्तमान टैब पृष्ठ में विंडोज़ या इसकी खोज के लिए सभी टैब पृष्ठों को लक्षित करता है। असल में, @ jecxjo के जवाब का एक मजबूत प्लगइन कार्यान्वयन।


1

आज्ञा देता है :bufdoऔर:vimgrepadd

यह उत्तर /programming//a/11976158/1057593 पर आधारित है ।

हालाँकि, मैं कुछ बिट्स जोड़ना चाहता था। फिर से मूल आदेश है

:bufdo vimgrepadd pattern %

यदि आपकी क्विकफ़िक्स सूची खाली नहीं है, तो आप संभवतः इसे पहले साफ़ करना चाहते हैं (देखें /programming//q/27385970/1057593 )। इसके साथ किया जा सकता है

:cexpr []

vim-unimpaired मैपिंग प्रदान करता है ]qऔर [qमैचों के माध्यम से चक्र करने के लिए।

cmdline-इतिहास

अलग से खोज पैटर्न में प्रवेश करने के लिए यह एक अच्छा वर्कफ़्लो है /pattern। यह आपको वर्तमान खोज पैटर्न का उपयोग करके अपने कमांडलाइन इतिहास से एक सामान्य कमांड का उपयोग करने की अनुमति देता है। ऐसा लगेगा

/pattern
:bufdo vimgrepadd // %

एक विशिष्ट नई बफ़र विस्तृत खोज होगी

/pattern2
:bufdo<up><up>...

मैं उपयोग करने के लिए अपने vimrc के लिए निम्न मैपिंग जोड़ लिया है <C-N>और <C-P>बजाय तीर कुंजी का

cmap <C-P> <Up>
cmap <C-N> <Down>

कमांड हिस्ट्री का उपयोग करने के लिए सर्च करें q:, /bufdo<CR>और उसके साथ कमांड कमांड करें <CR>। अधिक जानकारी के लिए https://vim.fandom.com/wiki/Using_command-line_history और सहायता पृष्ठ :h historyऔर देखें :h cmdline-window

आप :copenनिम्न प्रकार से क्विकफिक्स सूची को तुरंत देखने के लिए पुन: प्रयोज्य कमांड में जोड़ सकते हैं :

:execute "bufdo vimgrepadd // %" | copen

स्टैकओवरफ़्लो के प्रस्ताव :bufdo vimgrepadd // % | copenने मेरे मामले में कई अनजाने खिड़कियां खोल दीं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.