केवल मिलान रेखाएँ दिखाएँ?


31

एक लंबी फ़ाइल में, मैं एक ऐसे पैटर्न की खोज करना चाहूंगा जो लगभग 200 लाइनों या इसी तरह मेल खाएगा। मिलान की गई पंक्तियाँ फ़ाइल में यादृच्छिक स्थानों पर हैं।
जब कोई रेखा मेल खाती है, तो केवल रेखा ही प्रासंगिक होती है, ऊपर या नीचे कोई संदर्भ नहीं।

आम तौर पर, मैं के साथ /मैचों के माध्यम से खोज और कूद जाएगा n
लेकिन इसका मतलब है कि एक समय में स्क्रीन पर केवल एक या दो प्रासंगिक लाइनें हैं।

क्या परिणाम रेखाओं की सूची से गुजरते हुए, सभी लाइनों को छिपाने का कोई तरीका नहीं है?


एक ब्रूट फोर्स एप्रोच सभी गैर-मिलान लाइनों को हटाने के लिए होगी, और बाद में डिलीट करने के लिए। लेकिन यह विभिन्न तरीकों से बदसूरत है, भले ही यह लगातार पूर्ववत में समाप्त नहीं होगा ...

जवाबों:


34
:vimgrep pattern %
:cwin

vimgrepवर्तमान फ़ाइल ( %), या आपके द्वारा निर्दिष्ट फ़ाइलों में अपने पैटर्न की खोज करेंगे ।

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


1
:vimgrepको संक्षिप्त किया जा सकता है:vim
डी बेन Knoble

मैं फिर से बफर में कैसे जा सकता हूं?
पाशा

यह भी कि मैं बफर को कैसे बंद करूं? अग्रिम धन्यवाद
पाशा

Quickfix (cwindow) बफर से आप मूल बफर में उस स्थान पर कूदने के लिए किसी भी लाइन पर रिटर्न मार सकते हैं। आप के साथ कहीं से भी cwindow बफर को बंद कर सकते हैं :ccl[ose]या फिर आप सामान्य रूप से एक बफर को बंद कर सकते हैं (जैसे, इसे स्विच करें और :bd)। आप फिर से चलाकर क्विकफ़िक्स बफर को फिर से खोल सकते हैं :cw[indow], और यह आपके अंतिम विमग्रैप परिणामों का उपयोग करेगा।
जैच इंग्ब्रटेनसन

15

आप सभी मिलान लाइनों को सूचीबद्ध कर सकते हैं

:g/{pattern}

( :printकमांड को छोड़ा जा सकता है; यह इसके लिए डिफ़ॉल्ट है :g।)


1
यह "मूल grep" ( g/REgexp/p) है ... समस्या यह है कि आप आसानी से मैचों में से एक के लिए कूद नहीं सकते, हालांकि ...
मार्टिन टूरनोइज

@Carpetsmoker: आप सही कह रहे हैं; उसके लिए, मेरे पास एक प्लगइन है, मेरे दूसरे उत्तर को देखें।
इंगो करकट

यह कई मामलों के लिए उपयोगी हो सकता है। क्या आउटपुट को एक नए बफर पर पुनर्निर्देशित किया जा सकता है? यह अभी भी लाइनों पर सिंटैक्स हाइलाइटिंग की अनुमति देगा। (हम्म ... जो एक और सवाल उठाता है, एक सेकंड रुको ...)
वोल्कर सेगेल

@IngoKarkat अर्थ क्या है g। मैं मानता हूं कि यह एक वैश्विक पैटर्न है। मैं आमतौर पर एक स्लैश के साथ VI खोज करता हूं /patternऔर यह सभी घटनाओं को ढूंढेगा। अक्षर को दबाकर कोई भी उन्हें नेविगेट कर सकता हैn
अलेक्जेंडर सेस्का

@AlexanderCska: नहीं, यह खोज के लिए एक संशोधक नहीं है, लेकिन एक अलग कमांड :g[lobal]जो एक तर्क के रूप में एक पैटर्न लेता है। आपको सभी विवरण मिल जाएंगे :help :global
इंगो करकट

12

आप अप्रासंगिक लाइनों को मोड़ने के लिए foldmethodऔर foldexprविकल्पों का उपयोग कर सकते हैं ।

खोज करने के बाद, अंतिम खोज @/रजिस्टर में संग्रहीत की जाती है । तो, आप आसानी से सब कुछ बंद कर सकते हैं जो इस तरह से मेल नहीं खाता (केवल एक-लाइन मैचों के लिए):

:setlocal foldexpr=getline(v:lnum)=~@/?0:1 foldmethod=expr

अधिक उन्नत विधियाँ, जैसे आप संदर्भ रेखाओं को दिखाने या छिपाने के लिए कई गुना तह जोड़ सकते हैं, या कई पंक्तियों का मिलान कर सकते हैं, VK Tips Wiki पर पाया जा सकता है ।


लगता है जैसे कोई set foldlevel=0जरूरत है? लेकिन शायद वह डिफ़ॉल्ट है।
वोल्कर सेगेल

1
हाँ डिफ़ॉल्ट शून्य है, लेकिन अगर यह बिना काम नहीं करता है, तो इसे जोड़ना चोट नहीं पहुंचा सकता है। :-)
बेन

लेकिन अब ... इसे फिर से कैसे स्विच करें, बिना किसी निशान के?
वोल्कर सिएगल

सामान्य मोड में, आप बंद और चालू करने के लिए 'जि' का उपयोग कर सकते हैं।
जॉन ओ.एम.

ज्यादातर समय जब मैं ऐसा करता हूं तो मैं पहली बार :tab spफाइल पर एक नया थ्रो व्यू प्राप्त करता हूं । फिर वापस जाना :closeटैब को मारने के लिए या किसी अन्य तरीके से उतना ही सरल है ।
बेन

6

यदि ऑर्डर मायने नहीं रखता है तो बस लाइनों को स्थानांतरित करें।

:g/pat/m0

अधिक मदद के लिए देखें:

:h :g
:h :m

1
और :g/pat/m$(मिलान लाइनों को अंत तक स्थानांतरित करें) भी ठीक है,
लेनर झांग

6

[डी] सभी लाइनों को नहीं हटाएं (!) मिलान पैटर्न:

:g!/pattern/d

या इससे भी सरल ('लेयर' की टिप्पणियों के लिए धन्यवाद):

:v/pattern/d

हाँ, लेकिन इसके :vबजाय समकक्ष का उपयोग करना अधिक पारंपरिक है :g!। (मुझे याद नहीं है कि आखिरी बार मैंने बाद में इस्तेमाल किया था, टीबीएच!)
बी लेयर

2

सभी मिलते-जुलते लाइनों सूची (मेरे अन्य जवाब के रूप में), और फिर चाहते हैं कूद एक विशेष मैच के लिए, मेरे FindOccurrence प्लगइन एक प्रदान करता है [/(और उस के लिए मानचित्रण [nके बजाय एक के लिए क्वेरी की, पिछले खोज पैटर्न के लिए)। [/patternसूचियों की तरह :g/pattern, लेकिन फिर कूदने के लिए मैच की संख्या के लिए पूछता है।


0

एक और तरीका उपयोग करना है :h :ilist, मैं इसका उपयोग मैन पेज का अवलोकन प्राप्त करने के लिए करता हूं। यह परिणाम इस तरह दिखता है:

~/find.~
  1:    3 NAME
  2:    6 SYNOPSIS
  3:    9 DESCRIPTION
  4:   18 OPTIONS
  5:   93 EXPRESSION
  6:  779 EXAMPLES
  7:  877 HISTORY
  8:  931 BUGS

यहाँ एक छोटा सा कार्य है जो आपको अनुक्रमणिका द्वारा परिणाम पंक्ति में जाने का विकल्प देता है:

function! s:select_ilist(ilist_result)
  if empty(a:ilist_result) || a:ilist_result =~# '^\_s*Error'
    return
  endif

  let select = input(a:ilist_result . "\ngoto : ")
  if empty(select) | return | endif

  " ilist result starts with '\nfilename\n', filename can be empty
  let lines = split(a:ilist_result[stridx(a:ilist_result, "\n", 1) : ], "\n")
  if select <= 0 || select > len(lines) | return | endif

  exec matchstr(lines[select-1], '^\v\s*\d+\:\s+\zs\d+')
endfunction

इसका उपयोग इस तरह किया जा सकता है:

command! -buffer Section call s:select_ilist(execute('silent! ilist /\v\C^[A-Z][^a-z]+$/'))
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.