Da ich dies oft gemacht habe, habe ich ein (verbesserungsfähiges) Skript zusammengestellt.
Sie oder jemand anderes könnten es nützlich finden.
Kurze Erklärung:
Grundsätzlich durchsucht es die Pufferliste und zeigt das Ergebnis im Quickfix-Fenster an.
Zwei grundlegende Befehle wurden hinzugefügt.
Search <pattern> : In allen Puffern nach suchen <pattern>.
Search1 <pattern>: Durchsucht alle Puffer nach <pattern>, zeigt aber nur das erste Ergebnis für jeden Puffer an. Dies ist in der Regel nützlich, um alle Puffer aufzulisten, in denen Funktion, Variable foo(oder was auch immer) verwendet wird.
Verwenden Sie bang ( :Search! foo), um an die Ergebnisse anzuhängen.
Zusätzlich GSearchund GSearch1wird hinzugefügt, wenn der Unterschied darin besteht, dass mit Searchdem Skript Regex-Trennzeichen hinzugefügt werden , zB:
foo -> /foo/
Wo, wie zu GSearcherwarten, wird es eingeschlossen.
Das jFlag wird immer hinzugefügt, um ein Springen zu verhindern.
Code:
Es gibt einige Hacks, um die Auflistung von Fehlern zu verhindern und gleichzeitig den Code kurz zu halten. try / catchwar etwas umständlich auf 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)