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


16

カーソルを現在の単語の上に置いて*、Vimの単語検索を学び始めました#。ただし、この検索は現在のファイルバッファーに限定されます。

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

  1. 開いているすべてのタブ?
  2. すべての開かれたバッファ?

1
タブとバッファのこの説明は興味深く、役に立つと思うでしょう。
ワイルドカード

回答:


4

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

" 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>
…

私はこのコマンドが大好きですが、検索用語をよりよくエスケープし、再描画を強制するためにいくつかのことを追加しました。(スプリットでサイレントを使用すると、vim uiがバグアウトする可能性があります)。コマンド!-nargs = 1検索呼び出しsetqflist([])| サイレント実行 "bufdo grepadd! '<args>'%" | 再描画!
イゴリオ14

また、単に入力する:cn:cp、次のドキュメントに切り替えることもできます。
-phyatt

7

気づくのは難しいかもしれませんが、実際はデフォルトの動作です。*別のタブに切り替えて、コマンドモードでnans を使用Nして、検索ヒット間で前後にジャンプします。

最初にすべてのヒットの強調表示をオンにすると、これはより意味があります。

:set hlsearch

1
+1しかhlsearch分からなかったので、いつの日か検索する必要がありました:-)。ただし、デフォルトでI nは、*#を試してみましたが、N、としているが、他のファイルバッファにジャンプしません ...
ステファン・ロラン

いや、nN(彼らはラップアラウンド)バッファをジャンプしますが、していない、彼らはすべてのタブで検索されたターゲット用語。ヒット*あなたのタブスルー、その後のサイクルでハイライトを持つ-あなたが使用できるように、それらはすべて、同じ用語で強調表示されますnN、新鮮な検索せずにローカルであり。
goldilocks

2
全体のポイントは、すべての一致を見つけるためにタブを循環する必要がないことです。
マグナス14年

1
@Magnusそれは望ましいかもしれませんが、実際には「この検索を...すべてのバッファに拡張する方法を尋ねる質問には明示的に記載されていません->すべてのバッファに拡張されます。私の答えのポイントは、特にあなたがhlsearch設定していない場合はそうではないかもしれないので、これを明確にすることでした。
goldilocks 14年


1

これを頻繁に行っていることに気付いたので、(改善可能な)スクリプトをマッシュアップしました。

あなたや他の誰かが役に立つかもしれません。


簡単な説明:

基本的には、バッファリストを検索し、quickfix-windowに結果を表示します。

2つの基本的なコマンドが追加されました。

  1. Search <pattern> :すべてのバッファを検索します<pattern>
  2. Search1 <pattern>:すべてのバッファでを検索しますが<pattern>、各バッファの最初の結果のみを表示します。通常、関数、変数fooが使用されている(または何でも)すべてのバッファーをリストするのに役立ちます。

bang(: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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.