Comme je me suis souvent retrouvé à faire cela, j'ai mélangé un script (améliorable).
Vous ou quelqu'un d'autre pourriez trouver cela utile.
Brève explication:
Fondamentalement, il recherche la liste des tampons et affiche le résultat dans la fenêtre de correction rapide.
Deux commandes de base sont ajoutées.
Search <pattern>
: Recherche tous les tampons <pattern>
.
Search1 <pattern>
: Recherche tous les tampons <pattern>
, mais n'affiche que le premier résultat pour chaque tampon. Généralement utile pour répertorier tous les tampons où la fonction, la variable foo
est utilisée (ou quoi que ce soit).
Utilisez bang ( :Search! foo
) pour ajouter aux résultats.
De plus GSearch
et GSearch1
est ajouté là où la différence est qu'avec Search
le script, ajoutez un délimiteur d'expression régulière, par exemple:
foo -> /foo/
Où, comme GSearch
prévu, il doit être enfermé.
Le j
drapeau est toujours ajouté pour empêcher le saut.
Code:
Il existe des hacks pour empêcher la liste des erreurs tout en gardant le code court. try / catch
était un peu encombrant 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)