¿Cómo buscar la palabra actual en todas las pestañas abiertas en Vim?


16

He comenzado a aprender la búsqueda de palabras Vim usando *y #mientras el cursor está sobre la palabra actual. Pero esta búsqueda se limita al búfer de archivo actual.

¿Hay un comando o un atajo para extender esta búsqueda a:

  1. todas las pestañas abiertas?
  2. todos los tampones abiertos?

1
Puede encontrar esta explicación de pestañas frente a buffers interesante y útil.
Comodín el

Respuestas:


4

No tengo una solución exacta para su problema, espero que aparezca una respuesta mejor que la mía. Pero así es como abordé el problema de encontrar una palabra en todos los 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

La primera línea crea un comando Searchcon el patrón de búsqueda como argumento, que escribe los resultados en una lista de soluciones rápidas. Las otras dos líneas asignan las teclas de flecha inútiles (al menos para mí) a algo útil; se asignan para saltar a la búsqueda siguiente / anterior o al error de compilación siguiente / anterior, etc., simplemente avanzan por la lista de soluciones rápidas. Puede usar esto de la siguiente manera:

:Search foobar
<right>
<right>
…

Me encanta este comando, pero agregué algunas cosas para que pueda escapar mejor de los términos de búsqueda y forzar un nuevo dibujo. (el uso de silencio con divisiones puede hacer que vim ui se salga con la suya). ¡mando! -nargs = 1 Buscar llamada setqflist ([]) | silencioso ejecutar "bufdo grepadd! '<args>'%" | redibujar!
Igorio

También puede simplemente escribir :cno :cpcambiar al siguiente documento.
phyatt

7

En realidad, es el comportamiento predeterminado, aunque puede ser difícil de notar: intente *cambiar a otra pestaña y use nans Nen el modo de comando para saltar hacia adelante y hacia atrás entre los resultados de búsqueda.

Esto puede tener más sentido si primero activa el resaltado para todos los éxitos:

:set hlsearch

1
+1 solo por hlsearcheso no lo sabía, y cuál habría buscado un día u otro :-). Sin embargo, por defecto he intentado * #, ny N, y no salta a otros búferes de archivos ...
Stephane Rolland

No, ny Nno salte buffers (se envuelven), pero el término al que se dirigen se busca en todas las pestañas; golpe *con el que destaca el ciclo de entonces a través de sus pestañas - todos ellos se resaltará con el mismo plazo, lo que puede utilizar ny Nno localmente sin una nueva búsqueda.
Ricitos de oro

2
El punto NO es tener que recorrer las pestañas para encontrar todas las coincidencias.
Magnus

1
@Magnus Si bien eso puede ser preferible, en realidad no se menciona explícitamente en la pregunta, que pregunta cómo "extender esta búsqueda a ... todos los buffers" -> se extiende a todos los buffers. El punto de mi respuesta fue aclarar esto, ya que podría no serlo, especialmente si no lo ha hlsearchconfigurado.
Ricitos


1

Como me he encontrado haciendo esto frecuentemente, combiné un script (mejorable).

Usted u otra persona pueden encontrarlo útil.


Breve explicación:

Básicamente, busca en la lista de búfer y muestra el resultado en la ventana quickfix.

Se agregan dos comandos básicos.

  1. Search <pattern> : Buscar todos los buffers para <pattern>.
  2. Search1 <pattern>: Busca todos los búferes <pattern>, pero solo muestra el primer resultado para cada búfer. Típicamente útil para enumerar todos los buffers donde foose usa la función, variable (o lo que sea).

Use bang ( :Search! foo) para agregar a los resultados.

Además GSearchy GSearch1se agrega donde la diferencia es que con Searchel script agregue delimitador de expresiones regulares, por ejemplo:

foo -> /foo/

Donde como se GSearchespera que esté encerrado.

La jbandera siempre se agrega para evitar el salto.


Código:

Hay algunos hacks para evitar la lista de errores y al mismo tiempo mantener el código corto. try / catchfue un poco engorroso 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)
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.