Vimの開いているすべてのタブで現在の単語を検索するには?

Vimの開いているすべてのタブで現在の単語を検索するには?

カーソルが現在の単語にあるときとを使ってVimの単語検索を学び始めました*#ただし、この検索は現在のファイルバッファに制限されています。

この検索を次に拡張できるコマンドやショートカットはありますか?

  1. 開いているタブはすべて開いていますか?
  2. すべてのオープンバッファ?

答え1

これは実際にはデフォルトの動作ですが、気付くのは難しいかもしれません。*次に、別のタブに変更し、コマンドモードでnansを使用してN検索項目間を前後に移動します。

まず、すべてのヒットに対してハイライトをオンにすると、より意味がある可能性があります。

:set hlsearch

答え2

私はあなたの問題に対する正確な解決策を持っていないので、私よりも良い答えを見つけたいと思います。しかし、これがすべてのバッファで単語を見つける問題を解決した方法です。

" 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

最初の行は、Search検索パターンを引数として使用し、結果をクイックフィックスリストに記録するコマンドを作成します。他の2行は(少なくとも私にとっては)役に立たない矢印キーを便利な項目にマップし、次/前の検索または次/前のコンパイルエラーなどに移動するようにマップされ、リストを段階的に実行するための簡単な修正です。 。次のように使用できます。

:Search foobar
<right>
<right>

答え3

 :bufdo vimgrepadd yoursearchterm % | copen

答え4

私はこのことをたくさんしているので(改善可能な)スクリプトを混ぜました。

あなたや他の人が役に立つと思うかもしれません。


簡単な説明:

デフォルトでは、バッファリストを検索してクイック修正ウィンドウに結果を表示します。

基本命令2つが追加されました。

  1. Search <pattern>:すべてのバッファを検索します<pattern>
  2. Search1 <pattern>:すべてのバッファから検索します<pattern>が、各バッファの最初の結果のみを表示します。通常foo、関数、変数(またはその他の項目)を使用するすべてのバッファを一覧表示するのに役立ちます。

:Search! foo結果に追加するには、前髪()を使用してください。

GSearchまた、追加GSearch1、違いは、スクリプトがSearch正規表現の区切り文字を追加することです。たとえば、次のようになります。

foo -> /foo/

GSearch予想通り、その場は閉まっていました。

jジャンプを防ぐには、必ずこのフラグを追加してください。


パスワード:

コードを短く保ちながらエラーが表示されるのを防ぐいくつかのヒントがあります。try / catch少し面倒です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)

関連情報