Comment rechercher le mot actuel dans tous les onglets ouverts dans Vim?

16

J'ai commencé à apprendre la recherche de mots Vim en utilisant *et #pendant que le curseur se trouve sur le mot courant. Mais cette recherche est limitée au tampon de fichiers actuel.

Existe-t-il une commande ou un raccourci pour étendre cette recherche à:

  1. tous les onglets ouverts?
  2. tous les tampons ouverts?
Stéphane Rolland
la source
1
Vous pourriez trouver cette explication des onglets par rapport aux tampons intéressante et utile.
Wildcard
buffers stackoverflow.com/questions/11975174/…
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

4

Je n'ai pas de solution exacte à votre problème, j'espère qu'une meilleure réponse que la mienne viendra. Mais c'est ainsi que j'ai abordé le problème de trouver un mot dans tous les tampons.

" 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 première ligne crée une commande Searchavec le motif de recherche comme argument, qui écrit les résultats dans une liste de correctifs. Les deux autres lignes mappent les touches fléchées inutiles (du moins pour moi) à quelque chose d'utile; ils sont mappés pour passer à la recherche suivante / précédente ou à l'erreur de compilation suivante / précédente, etc., ils parcourent simplement la liste des correctifs. Vous pouvez l'utiliser comme suit:

:Search foobar
<right>
<right>
…
Marco
la source
J'adore cette commande, mais j'ai ajouté quelques éléments pour qu'elle échappe mieux aux termes de recherche et force un nouveau tracé. (l'utilisation de silent with splits peut entraîner la sortie de l'interface utilisateur de vim). commander! -nargs = 1 Appel de recherche setqflist ([]) | exécution silencieuse "bufdo grepadd! '<args>'%" | redessiner!
Igorio
vous pouvez également taper :cnou :cppour passer au document suivant.
phyatt
7

Il s'agit en fait du comportement par défaut, même s'il peut être difficile à remarquer: essayez de *passer à un autre onglet et utilisez nans Nen mode commande pour sauter en avant et en arrière entre les résultats de recherche.

Cela peut avoir plus de sens si vous activez d'abord la mise en surbrillance pour tous les hits:

:set hlsearch
boucle d'or
la source
1
+1 uniquement à cause de hlsearchcela je ne savais pas, et que j'aurais cherché un jour ou l'autre :-). Cependant, par défaut, j'ai essayé * #, n et N, et il ne passe pas aux autres tampons de fichiers ...
Stephane Rolland
Non, net Nne sautez pas les tampons (ils s'enroulent), mais le terme qu'ils ciblent est recherché dans tous les onglets; a frappé *avec la surbrillance sur le cycle , puis à travers vos onglets - ils seront tous mis en évidence par le même terme, de sorte que vous pouvez utiliser net Nil localement sans une recherche frais.
goldilocks
2
Le tout n'est PAS de devoir parcourir vos onglets pour trouver toutes les correspondances.
Magnus
1
@Magnus Bien que cela puisse être préférable, ce n'est en fait pas explicitement indiqué dans la question, qui demande comment "étendre cette recherche à ... tous les tampons" -> elle est étendue à tous les tampons. Le but de ma réponse était de clarifier cela, car il se peut que ce ne soit pas le cas, surtout si vous ne l'avez pas fait hlsearch.
goldilocks
4
 :bufdo vimgrepadd yoursearchterm % | copen
Magnus
la source
1

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.

  1. Search <pattern> : Recherche tous les tampons <pattern>.
  2. 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 fooest utilisée (ou quoi que ce soit).

Utilisez bang ( :Search! foo) pour ajouter aux résultats.

De plus GSearchet GSearch1est ajouté là où la différence est qu'avec Searchle script, ajoutez un délimiteur d'expression régulière, par exemple:

foo -> /foo/

Où, comme GSearchprévu, il doit être enfermé.

Le jdrapeau 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)
Runium
la source