Vì tôi thấy mình thường xuyên làm điều này nên tôi đã tạo ra một kịch bản (có thể ứng biến).
Bạn hoặc người khác có thể thấy nó hữu ích.
Giải thích ngắn gọn:
Về cơ bản, nó tìm kiếm danh sách bộ đệm và hiển thị kết quả trong cửa sổ quickfix.
Hai lệnh cơ bản được thêm vào.
Search <pattern>
: Tìm kiếm tất cả các bộ đệm cho <pattern>
.
Search1 <pattern>
: Tìm kiếm tất cả các bộ đệm cho <pattern>
, nhưng chỉ hiển thị kết quả đầu tiên cho mỗi bộ đệm. Thông thường hữu ích để liệt kê tất cả các bộ đệm trong đó chức năng, biến foo
được sử dụng, (hoặc những gì đã từng).
Sử dụng bang ( :Search! foo
) để nối vào kết quả.
Ngoài ra GSearch
và GSearch1
được thêm vào khi có sự khác biệt với Search
tập lệnh thêm dấu phân cách regex, ví dụ:
foo -> /foo/
Trường hợp như GSearch
mong đợi nó được bao quanh.
Các j
lá cờ luôn được bổ sung để ngăn chặn nhảy.
Mã số:
Có một số hack để ngăn chặn danh sách lỗi trong khi đồng thời giữ mã ngắn. try / catch
là một chút rườm rà trên 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)