Vim'deki tüm açık sekmelerde geçerli kelimeyi nasıl arayabilirim?


16

Vim sözcük aramayı öğrenmeye başladım *ve #imleç geçerli sözcüğün üzerindeyken. Ancak bu arama, geçerli dosya arabelleği ile sınırlıdır.

Bu aramayı genişletmek için bir komut veya kısayol var mı:

  1. tüm açık sekmeler?
  2. tüm açık arabellekler?

1
Sen bulabilir tamponların vs. sekmelerin bu açıklamayı ilginç ve yararlı.
Joker

Yanıtlar:


4

Sorununuz için kesin bir çözümüm yok, umarım benimkinden daha iyi bir cevap gelir. Ancak tüm arabelleklerde bir kelime bulma sorununu bu şekilde ele aldım.

" 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

İlk satır Search, sonuçları bir hızlı düzeltme listesine yazan argüman olarak arama deseni ile bir komut oluşturur . Diğer iki çizgi (en azından benim için) işe yaramaz ok tuşlarını yararlı bir şeyle eşleştirir; bir sonraki / önceki aramaya veya bir sonraki / önceki derleme hatasına vb. atlamak için eşlenirler, sadece hızlı düzeltme listesine adım atarlar. Bunu aşağıdaki gibi kullanabilirsiniz:

:Search foobar
<right>
<right>
…

Bu komutu seviyorum, ancak arama terimlerinden daha iyi kaçmak ve yeniden çizmeyi zorlamak için birkaç şey ekledim. (böler ile sessiz kullanmak vim ui'nin hata yapmasına neden olabilir). Komut! -nargs = 1 Arama araması setqflist ([]) | sessiz yürütme "bufdo grepadd! '<args>'%" | yeniden çizme!
Igorio

ayrıca bir sonraki belgeye geçmek için yazabilir :cnveya yazabilirsiniz :cp.
phyatt

7

Fark edilmesi zor olsa da aslında varsayılan davranıştır: *daha sonra başka bir sekmeye geçin ve arama isabetleri arasında ileri ve geri atlamak için komut modunda nans kullanın N.

Öncelikle tüm isabetler için vurgulamayı açarsanız, bu daha anlamlı olabilir:

:set hlsearch

1
+1 sadece hlsearchbu yüzden bilmiyordum ve hangi bir gün ya da başka bir arama olurdu :-). Ancak, varsayılan olarak * #, n ve N'yi denedim ve diğer dosya tamponlarına atlamıyor ...
Stephane Rolland

Hayır nve Narabellekleri atlamazlar (etrafına sarılırlar), ancak hedefledikleri terim tüm sekmelerde aranır; isabet *Sekmelerinizin aracılığıyla sonra döngüsünde vurgu bulunan - kullanabilirsiniz yüzden hepsi aynı terimle vurgulanır nve Ntaze bir arama olmadan yerel orada.
goldilocks

2
Bütün mesele, tüm eşleşmeleri bulmak için sekmeleriniz arasında dolaşmak zorunda DEĞİLDİR.
Magnus

1
@Magnus Bu tercih edilebilir olsa da, aslında bu aramada "bu aramayı ... tüm arabelleklere genişletme " -> tüm arabelleklere nasıl genişletileceğini soran açıkça belirtilmemiştir . Cevabımın amacı bunu açıklığa kavuşturmaktı, çünkü özellikle hlsearchayarlamadıysanız olmayabilir .
goldilocks


1

Kendimi sık sık bunu yaparken buldum gibi (geliştirilebilir) bir komut dosyası ezilmiş.

Siz veya bir başkası faydalı olabilir.


Kısa açıklama:

Temel olarak arabellek listesini arar ve sonucu quickfix penceresinde gösterir.

İki temel komut eklenir.

  1. Search <pattern> : Tüm arabellekleri ara <pattern>.
  2. Search1 <pattern>: Tüm arabellekleri ara <pattern>, ancak her arabellek için yalnızca ilk sonucu göster. Genellikle işlev, değişkenin fookullanıldığı (veya ne olursa olsun) tüm arabellekleri listelemek için kullanışlıdır .

:Search! fooSonuçlara eklemek için bang ( ) kullanın .

Ek olarak GSearchve komut dosyası GSearch1ile Searchregex sınırlayıcı ekleyin, örneğin:

foo -> /foo/

Nereye eklenirse GSearchbeklenir.

jBayrak hep atlamayı önlemek için eklenir.


Kod:

Hata listelemesini önlemek ve aynı zamanda kodu kısa tutmak için bazı hack'ler vardır. try / catchbiraz hantal 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)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.