Como procurar a palavra atual em todas as abas abertas no Vim?

15

Eu comecei a aprender a busca de palavras do Vim usando * e # enquanto o cursor estava sobre a palavra atual. Mas esta pesquisa é limitada ao buffer de arquivo atual.

Existe um comando ou um atalho para estender essa pesquisa para:

  1. todas as guias abertas?
  2. todos os buffers abertos?
por Stephane Rolland 03.01.2013 / 15:48

4 respostas

4

Eu não tenho uma solução exata para o seu problema, espero que seja uma resposta melhor do que a minha. Mas é assim que resolvi o problema de encontrar uma palavra em todos os buffers.

" 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

A primeira linha cria um comando Search com o padrão de pesquisa como argumento, que grava os resultados em uma lista de correções rápidas. As duas outras linhas mapeiam (pelo menos para mim) as teclas de seta inúteis para algo útil; eles são mapeados para pular para a próxima / anterior pesquisa ou para o próximo / anterior erro de compilação, etc., eles simplesmente passam pela lista de correcções rápidas. Você pode usar isso da seguinte maneira:

:Search foobar
<right>
<right>
…
    
por 03.01.2013 / 16:04
7

Na verdade, é o comportamento padrão, embora possa ser difícil perceber: tente * e depois mude para outra guia e use n ans N no modo de comando para avançar e retroceder entre os resultados da pesquisa.

Isso pode fazer mais sentido se primeiro você ativar o destaque para todos os hits:

:set hlsearch
    
por 03.01.2013 / 16:03
3
 :bufdo vimgrepadd yoursearchterm % | copen
    
por 26.06.2014 / 20:56
0

Como eu me encontrei freqüentemente fazendo isso, eu misturei um script (improvável).

Você ou alguém pode achar útil.

Explicação breve:

Basicamente, ele pesquisa a lista de buffers e mostra o resultado na janela quickfix.

Dois comandos básicos são adicionados.

  1. Search <pattern> : Pesquisar todos os buffers por <pattern> .
  2. Search1 <pattern> : procura todos os buffers por <pattern> , mas mostra apenas o primeiro resultado para cada buffer. Normalmente útil para listar todos os buffers onde a função, variável foo é usada, (ou o que nunca).

Use estrondo ( :Search! foo ) para acrescentar resultados.

Além disso, GSearch e GSearch1 são adicionados, onde a diferença é que, com Search , o script adiciona o delimitador regex, por exemplo:

foo -> /foo/

Onde GSearch espera que seja fechado.

O sinalizador j é sempre adicionado para evitar um salto.

Código:

Existem alguns hacks para evitar a listagem de erros e, ao mesmo tempo, manter o código curto. try / catch foi um pouco complicado em 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)
    
por 28.11.2014 / 19:49

Tags