आप विम की खोज के मैचों को कैसे सूचीबद्ध कर सकते हैं?


101

जब मैं हिट करूंगा, तो मैं मैचों की सूची बनाना चाहूंगा:

/example

ताकि मैं देख सकूं कि सभी मैच एक साथ कहां हुए हैं।

जवाबों:


3
    " put in your ~/.vimrc file
    " START search related configs and helps
    "
    " ignore case when searching
    set ignorecase

    " search as characters are entered, as you type in more characters, the search is refined
    set incsearch

    " highlight matches, in normal mode try typing * or even g* when cursor on string
    set hlsearch

    " yank those cheat commands, in normal mode type q: than p to paste in the opened cmdline
    " how-to search for a string recursively
    " :grep! "\<doLogErrorMsg\>" . -r
    "
    " how-to search recursively , omit log and git files
    " :vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`
    " :vimgrep /srch/ `find . -type f -name '*.pm' -o -name '*.pl'`
    "
    " how-to search for the "srch" from the current dir recursively in the shell
    " vim -c ':vimgrep /srch/ `find . -type f \| grep -v .git \| grep -v .log`'
    "
    " how-to highlight the after the search the searchable string
    " in normmal mode press g* when the cursor is on a matched string

    " how-to jump between the search matches - open the quick fix window by
    " :copen 22

    " how-to to close the quick fix window
    " :ccl

    " F5 will find the next occurrence after vimgrep
    map <F5> :cp!<CR>

    " F6 will find the previous occurrence after vimgrep
    map <F6> :cn!<CR>

    " F8 search for word under the cursor recursively , :copen , to close -> :ccl
    nnoremap <F8> :grep! "\<<cword>\>" . -r<CR>:copen 33<CR>

    " omit a dir from all searches to perform globally
    set wildignore+=**/node_modules/**

    " use perl regexes - src: http://andrewradev.com/2011/05/08/vim-regexes/
    noremap / /\v
    "
    " STOP  search related configs and helps

1
मुझे आपके F5-F8 विचार बहुत पसंद हैं। यहाँ उन कमांड के कुछ विज़ुअलाइज़ेशन / आउटपुट होना अच्छा होगा। F8 को काम करने के लिए कैसे बनाया गया है? यह केवल वर्तमान निर्देशिका खोजता है? - - डायर की लकीर एक प्रथा है - - क्यों node_modules? - - perl regexes विम के डिफ़ॉल्ट कार्यप्रणाली को कैसे बदलता है? - - निम्नलिखित यह है कि मैंने अपनी .ex फ़ाइलों की खोज को किस तरह से डिज़ाइन किया है Askubuntu.com/a/789769/25388 आपको यह सीखना अच्छा होगा कि इसे कैसे सुधारें । यह इतना सहज नहीं है इसलिए मैं खुद भी अक्सर तर्क भूल गया।
लेओ लेपोल्ड हर्ट्ज़ '27

अगर आप फ्रंट-एंड विकसित करेंगे तो नोड_मॉड्यूल npm मॉड्यूल से बहुत सारे js कोड है ... यह सिर्फ एक उदाहरण है ...
Yordan Georgiev

1
आप .vimrc का बैकअप बनाएं और उन सेटिंग्स को जोड़ें, उन्हें लोड करें: ताकि% और कमांड में "मदद" चलाने की कोशिश करें ... विम कठिन है - आपको उन हजारों बार दोहराना होगा, लेकिन एक बार जब आप उन्हें गुरु आप @everyone हँसते होगा, जो बताते हैं उनके gread नए UI आईडीई सुविधाओं ...
योर्डन जॉर्जियेव

226
:g//p

इसके लंबे रूप में:

:global/regular-expression/print

आप पैटर्न / रेगेक्स छोड़ सकते हैं और विम पिछले खोज शब्द का फिर से उपयोग करेंगे।

सामान्य ज्ञान: ग्रेप उपकरण इस आदेश अनुक्रम के नाम पर रखा गया था।


18
:g//- चूँकि p (rint) डिफ़ॉल्ट क्रिया है, आप इसे बाहर भी छोड़ सकते हैं।
डेकेगार्ड

6
:g/और भी छोटा है!
स्पार्कहॉक

2
क्या यहाँ संदर्भ देखना संभव है, जैसे grep में --context 9?
विटाली ज़डेनविच

@VitalyZdanevich प्रयास करें :%s/regular-expression//gn यह इन पंक्तियों के साथ कुछ का उत्पादन करेगा:X matches on Y lines
Alexej मगुरा

@AlexejMagura मेरा मतलब है - स्ट्रिंग से पहले और बाद में कुछ पंक्तियाँ कैसे देखें?
विटाली ज़डेनविच

50

आप यह भी कर सकते हैं:

g/pattern/#

यह आपके द्वारा वांछित पैटर्न और पंक्ति की संख्या को प्रिंट करेगा।


2
अच्छा है। लेकिन अगर आपके पास पहले से सक्षम संख्याएँ हैं, तो #आवश्यक नहीं है। यह डिफ़ॉल्ट रूप से लाइन नंबर दिखाता है
पावन मंजूनाथ

44

यदि आप इस सूची को देखना चाहते हैं और मैचों के बीच जल्दी से कूदना चाहते हैं, तो उपयोग करने पर विचार करें

:vimgrep example %

या

:grep example %

यह सभी मैचों के साथ "त्रुटि सूची" को पॉप्युलेट करेगा, ताकि आप उपयोग कर सकें :copen सूची में QuickFix बफर में उन सब को, प्रेस को बताया कि मैच, या की तरह उपयोग आदेशों के लिए कूद करने के लिए एक विशेष लाइन पर प्रवेश :cnऔर :cpआगे और पीछे जाने के लिए।

पूरी तरह से स्पष्टीकरण के लिए, एक समान प्रश्न के लिए मेरा उत्तर देखें


यह E499: Empty file name for '%' or '#', only works with ":p:h"
मैकविम

35

बस एक नया सीखा: एक Location List! वर्तमान फ़ाइल में खोजने के लिए
टाइप :lvim foo %करें fooऔर स्थान सूचीfoo में शामिल सभी मैचों को दर्ज करें । क्विकफ़िक्स विंडो में स्थान सूची खोलने के लिए टाइप करें, जो हमेशा की तरह पूरी तरह से नेविगेट करने योग्य है। सूची के माध्यम से उपयोग करें / ( सर्वोत्तम अनुभव के लिए tpope / unimpaired मैपिंग का उपयोग करें )
:lopen
:lnext:lprevious


2
अच्छी टिप! इसने मुझे इस मानचित्रण को बनाने के लिए प्रेरित किया जो स्वचालित रूप से कर्सर के नीचे शब्द का विस्तार करता है और एक स्वीप में लोपेन करता है: nnoremap <लीडर> f: lvim / <cr> = ("<cword>") <cr> / lt <cr>: लोपेन <cr>
Jörgen

16

एक और संभावना फ़ाइल खोज आदेशों को शामिल करने के लिए है।

[I

यह कर्सर के नीचे शब्द की सभी घटनाओं को सूचीबद्ध करेगा। यह आपकी आवश्यकता से अधिक हो सकता है, क्योंकि यह वर्तमान फ़ाइलों में शामिल किसी भी फ़ाइल को खोजेगा।

लेकिन इस कमांड के बारे में अच्छी बात यह है कि खोज परिणाम प्रदर्शन प्रत्येक मैच की लाइन संख्या के अलावा, मैचों की संख्या की संख्या को भी दर्शाता है।

:help include-search

बहुत सारे संस्करण देखने के लिए।

के बारे में एक नोट

:g//p

इसे और कम किया जा सकता है

:g//

क्योंकि, जैसा कि दूसरों ने कहा है, पी (रिंट) डिफ़ॉल्ट क्रिया है।


क्या [Iसंदर्भ से परिणाम प्राप्त करना संभव है , जैसे ग्रीप पर --context 9?
विटाली ज़डेनविच

10

आप quickfixमैचों के साथ एक अच्छी खिड़की प्राप्त कर सकते हैं जो आपके वर्तमान खोज पैटर्न का निर्माण करता है

:vim // %
:copen

सुपर आसान अगर आपने पहले सिर्फ एक जटिल खोज पैटर्न का उपयोग किया है /pattern

संपादित करें : अभी पता चला है कि यह सभी खुले बफ़र्स के लिए भी काम करता है

:bufdo vimgrepadd // %
:copen

10

उपयोग करने :set hlsearchसे पीले रंग के सभी मैच हाइलाइट हो जाएंगे जिससे आप मैचों के लिए आसानी से फाइल स्कैन कर सकते हैं। यह वह नहीं हो सकता जो आप चाहते हैं, हालांकि, खोज के बाद: जी // पी आपको सूचीबद्ध मैच देगा


2
होना चाहिए ': सेट hlsearch' नहीं ': hlsearch'।
बहुत अधिक php

:nohlहाइलाइट्स को खाली करने के लिए मैप करना भी उपयोगी है जब आपको उनकी आवश्यकता नहीं होती है।
कोस

9

इस पर विस्तार से ... के बजाय

/example
:g//p

आप सीधे भी लिख सकते हैं

:g/example/p

या, जैसा कि p (rint): g (lobal) कमांड के लिए डिफ़ॉल्ट क्रिया है, इसे छोटा किया जा सकता है

:g/example

और p (rint) के बजाय, अन्य क्रियाएं संभव हैं, जैसे d (elete)। देखें: सहायता: वैश्विक


6
g/pattern

यदि आपके पास है :set number, तो उपरोक्त कमांड लाइन संख्या को भी प्रदर्शित करता है।

यदि आपने नहीं किया है :set number, तो

g/pattern/#

लाइन नंबर प्रदर्शित करेगा।


0

मैंने इसके लिए एक कोड ऑफ कोड लिखा है। यह वास्तव में समस्याओं से बचा जाता है vimgrep। यह अनाम फ़ाइलों के साथ भी काम करता है। और इसका उपयोग करना आसान है।

function! Matches(pat)
    let buffer=bufnr("") "current buffer number
    let b:lines=[]
    execute ":%g/" . a:pat . "/let b:lines+=[{'bufnr':" . 'buffer' . ", 'lnum':" . "line('.')" . ", 'text': escape(getline('.'),'\"')}]"
    call setloclist(0, [], ' ', {'items': b:lines}) 
    lopen
endfunction

जब आप इसे एक पैटर्न के साथ कहते हैं, तो यह सभी मैचों के साथ लोकेशन विंडो खोलता है।

यह एक कमांड हो सकती है

command! -nargs=1 Mat call Matches(<f-args>)

तो आप सभी को टाइप करने की जरूरत है :Mat pattern

मैं वर्तमान दृश्य चयन के मैचों को प्राप्त करने के लिए निम्नलिखित मैपिंग का उपयोग करता हूं।

vnoremap Y "xy:call Matches(@x)<CR>

-1

सभी खोज परिणाम को सूचीबद्ध करने के लिए Ctrl-f:

nmap <C-f> :vimgrep /<C-r>//g %<CR> \| !:copen <Enter>
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.