विम में सभी खुले हुए टैब में वर्तमान शब्द को कैसे खोजें?


16

मैंने Vim शब्द-खोज का उपयोग सीखना शुरू कर दिया है *और #जबकि कर्सर वर्तमान शब्द से अधिक है। लेकिन यह खोज वर्तमान फ़ाइल बफर तक सीमित है।

क्या इस खोज को बढ़ाने के लिए कोई कमांड या शॉर्टकट है:

  1. सभी खुले हुए टैब?
  2. सभी खोले गए बफ़र्स?

1
आपको टैब बनाम बफ़र्स की यह व्याख्या रोचक और उपयोगी लग सकती है।
वाइल्डकार्ड

जवाबों:


4

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

" enables to search in all open buffers with :Search <pattern>
command! -nargs=1 Search call setqflist([]) | silent bufdo grepadd! <args> %

nnoremap <left>  :cprev<cr>zvzz
nnoremap <right> :cnext<cr>zvzz

पहली पंक्ति Searchतर्क के रूप में खोज पैटर्न के साथ एक कमांड बनाती है , जो परिणाम को एक उपसर्ग सूची में लिखती है। दो अन्य पंक्तियाँ (कम से कम मेरे लिए) बेकार तीर कुंजियों को कुछ उपयोगी बनाती हैं; उन्हें अगली / पिछली खोज में या अगले / पिछले संकलन त्रुटि आदि के लिए कूदने के लिए मैप किया जाता है, वे बस क्विकफिक्स सूची में कदम रखते हैं। आप इसका उपयोग इस प्रकार कर सकते हैं:

:Search foobar
<right>
<right>
…

मुझे यह आदेश बहुत पसंद है, लेकिन कुछ चीजें जोड़ दी हैं ताकि यह खोज शब्दों को बेहतर तरीके से बचा ले, और एक redraw को मजबूर कर सके। (स्प्लिट्स के साथ साइलेंट का उपयोग करके विम यूआई को बग से बाहर किया जा सकता है)। आदेश! -नरग्स = 1 सर्च कॉल सेटक्फलिस्ट ([]) | साइलेंट एग्जीक्यूटिव "बुफ़डो ग्रेपड! '<args>'%" | पुनः बनाने!
इगोरियो जूल

आप बस टाइप भी कर सकते हैं :cnया :cpअगले दस्तावेज़ पर जा सकते हैं।
फिएट

7

यह वास्तव में डिफ़ॉल्ट व्यवहार है, हालांकि यह नोटिस करना मुश्किल हो सकता है: *फिर दूसरे टैब में बदलें और खोज हिट के बीच आगे और पीछे कूदने के लिए कमांड मोड में nans Nका उपयोग करें।

यदि आप पहले सभी हिट के लिए हाइलाइटिंग चालू करते हैं तो यह और अधिक समझ में आता है:

:set hlsearch

1
+1 केवल इस वजह से hlsearchकि मुझे पता नहीं था, और जिसे मैं एक दिन या किसी और :-) के लिए खोज रहा होगा। हालाँकि, डिफ़ॉल्ट रूप से मैंने * #, n और N को आज़माया है, और यह अन्य फ़ाइल बफ़र्स पर नहीं जाता है ...
स्टीफन रोलैंड

नहीं, nऔर Nबफ़र्स कूदो नहीं (वे चारों ओर लपेटते हैं), लेकिन उनके द्वारा लक्षित शब्द को सभी टैब में खोजा जाता है; हिट *अपने टैब के माध्यम से फिर चक्र पर प्रकाश डाला साथ - वे सभी, एक ही शब्द के साथ प्रकाश डाला जाएगा, ताकि आप उपयोग कर सकते हैं nऔर Nएक नई खोज के बिना स्थानीय स्तर पर वहाँ।
सुनिलॉक

2
पूरे मैच को खोजने के लिए पूरे बिंदु को आपके टैब के माध्यम से चक्र करना नहीं है।
मैग्नस

1
@ मैग्नस हालांकि यह बेहतर हो सकता है, यह वास्तव में स्पष्ट रूप से प्रश्न में नहीं बताया गया है, जो पूछता है कि "इस खोज को ... सभी बफ़र्स" तक कैसे बढ़ाया जाए -> यह सभी बफ़र्स में विस्तारित है। मेरे जवाब का बिंदु यह स्पष्ट करना था, क्योंकि यह नहीं हो सकता है, खासकर यदि आपने hlsearchसेट नहीं किया है।
गोल्डीलॉक्स


1

जैसा कि मैंने खुद को अक्सर पाया है कि मैं एक (कामचलाऊ) स्क्रिप्ट को मैश कर चुका हूं।

आपको या किसी और को यह उपयोगी लग सकता है।


संक्षिप्त विवरण:

मूल रूप से यह बफर सूची खोजता है और क्विकफिक्स-विंडो में परिणाम दिखाता है।

दो बुनियादी कमांड जोड़े जाते हैं।

  1. Search <pattern> : सभी बफ़र्स के लिए खोजें <pattern>
  2. Search1 <pattern>: सभी बफ़र्स खोजें <pattern>, लेकिन केवल प्रत्येक बफ़र के लिए पहला परिणाम दिखाएं। आमतौर पर सभी बफ़र्स को सूचीबद्ध करने के लिए उपयोगी है जहाँ फ़ंक्शन, चर fooका उपयोग किया जाता है, (या कभी भी)।

:Search! fooपरिणाम के लिए संलग्न करने के लिए बैंग ( ) का उपयोग करें।

इसके अतिरिक्त GSearchऔर GSearch1जोड़ दिया जाता है जहां अंतर के साथ वह यह है कि Searchस्क्रिप्ट जोड़ने regex सीमांकक, जैसे:

foo -> /foo/

जहां GSearchउम्मीद है कि इसे संलग्न किया जाएगा।

jझंडा हमेशा कूद को रोकने के लिए जोड़ा गया है।


कोड:

कोड को छोटा रखते हुए त्रुटि प्रविष्टि को रोकने के लिए कुछ हैक हैं। try / catchथोड़ा बोझिल था bufdo

let s:not_idents = split("/!#$%&\"`´¨'¯()*+,-.:;<=>?¿@[\]^{|}µ¶·¸~±×÷®©«»¬­ª°º¹²³¼½¾", '\zs')
" Create a delimited pattern. "
fun! s:Parse_pat(pat)
    for c in s:not_idents
        if stridx(a:pat, c) == -1
            return c . a:pat . c
        endif
    endfor
    echohl Error
    echom "Could not delimit pattern '". a:pat ."'"
    echohl None
    return ''
endfun

fun! s:AllBufSearch(pat, bang, uno, isg)
    if a:isg
        let pat = a:pat
    else
        let pat = s:Parse_pat(a:pat)
    endif
    if pat == ''
        return
    endif
    cclose
    let [_buf, _view] = [bufnr("%"), winsaveview()]
    let _foldenable = &foldenable
    set nofoldenable

    " Copy of current qflist. "
    let qfc = getqflist()
    " Hack to prevent error if no matches. "
    call setqflist([{}])
    silent execute "bufdo vimgrepadd! " . pat . "j %"
    " Restore "
    exec "buffer " . _buf
    let &foldenable = _foldenable
    call winrestview(_view)
    " Fix "
    let qf = getqflist()
    call remove(qf, 0)
    " Only one listing per buffer. "
    if a:uno
        let bn = {}
        let i  = 0
        for m in qf
            if has_key(bn, m["bufnr"])
                call remove(qf, i)
            else
                let bn[m["bufnr"]] = 1
                call remove(qf[i], "valid")
                let i += 1
            endif
        endfor
    endif
    if a:bang == "!"
        let qf = qfc + qf
    endif
    " If any matches, copen. "
    if len(qf)
        call setqflist(qf)
        copen
    endif
endfun

command! -nargs=1 -bang Search   call s:AllBufSearch(<q-args>, "<bang>", 0, 0)
command! -nargs=1 -bang Search1  call s:AllBufSearch(<q-args>, "<bang>", 1, 0)
command! -nargs=1 -bang GSearch  call s:AllBufSearch(<q-args>, "<bang>", 0, 1)
command! -nargs=1 -bang GSearch1 call s:AllBufSearch(<q-args>, "<bang>", 1, 1)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.