53

現在vimで開いているすべてのファイルでテキストを検索し、すべての結果を1か所に表示したいと思います。2つの問題があると思います:

  • 開いているファイルのリストを:grep/:vimに渡すことができません。特に、ディスク上にないファイルの名前です。
  • の結果は:grep -C 1 text、クイックフィックス ウィンドウで見栄えがよくありません。

Sublime Text 2 での複数ファイル検索の良い例を次に示します。ここに画像の説明を入力

何か案は?

4

6 に答える 6

57

または

:bufdo vimgrepadd threading % | copen

クイックフィックス ウィンドウは見栄えがよくないかもしれませんが、ST2 の「結果パネル」よりもはるかに機能的です。それは、場所にジャンプしている間、ウィンドウを開いて表示したままにして、そこにない場合に操作できるからです。

于 2012-08-15T19:47:54.283 に答える
8

ackAck.vimは、この問題を見事に処理します。も使用できます:help :vimgrep。例えば:

:bufdo AckAdd -n threading

カーソル位置にジャンプできる便利なクイックフィックス ウィンドウが作成されます。

于 2012-08-15T18:47:10.133 に答える
4

Wazの回答のように、そのためのカスタム コマンドを作成し、GrepCommands プラグインで公開しました。:BufGrepバッファ ( )、表示されているウィンドウ ( :WinGrep)、タブ、および引数を検索できます。

(ただし、他のすべての回答と同様に、名前のないバッファーはまだ処理されません。)

于 2012-08-16T07:42:48.517 に答える
2

私はずっと前にこの関数を作成しましたが、おそらく最もクリーンなソリューションではないと思いますが、私にとっては役に立ちました:

" Looks for a pattern in the open buffers.
" If list == 'c' then put results in the quickfix list.
" If list == 'l' then put results in the location list.
function! GrepBuffers(pattern, list)
    let str = ''

    if (a:list == 'l')
        let str = 'l'
    endif

    let str = str . 'vimgrep /' . a:pattern . '/'

    for i in range(1, bufnr('$'))
        let str = str . ' ' . fnameescape(bufname(i))
    endfor

    execute str
    execute a:list . 'w'
endfunction

" :GrepBuffers('pattern') puts results into the quickfix list
command! -nargs=1 GrepBuffers call GrepBuffers(<args>, 'c')

" :GrepBuffersL('pattern') puts results into the location list
command! -nargs=1 GrepBuffersL call GrepBuffers(<args>, 'l')
于 2012-08-15T22:49:34.757 に答える
0

より良いバッファ検索と特別なケースの処理を備えた、Wazの回答の改善された(強化された)バージョンを以下に示します(モデレーターは、Wazの回答を更新させてくれませんでした:D)。QuickFix リストをナビゲートするための矢印キーと QuickFix ウィンドウを閉じるための F3 キーのバインドを備えた、より肉付けされたバージョンは、https://pastebin.com/5AfbY8sm ( プラグインの作成方法を理解したいと思ったときにこの回答を更新します.今のところ共有を促進したかったのです)

" Looks for a pattern in the buffers.
" Usage :GrepBuffers [pattern] [matchCase] [matchWholeWord] [prefix]
" If pattern is not specified then usage instructions will get printed.
" If matchCase = '1' then exclude matches that do not have the same case. If matchCase = '0' then ignore case.
" If prefix == 'c' then put results in the QuickFix list. If prefix == 'l' then put results in the location list for the current window.
function! s:GrepBuffers(...)
    if a:0 > 4
        throw "Too many arguments"
    endif

    if a:0 >= 1
        let l:pattern = a:1
    else
        echo 'Usage :GrepBuffers [pattern] [matchCase] [matchWholeWord] [prefix]'
        return
    endif

    let l:matchCase = 0
    if a:0 >= 2
        if a:2 !~ '^\d\+$' || a:2 > 1 || a:2 < 0
            throw "ArgumentException: matchCase value '" . a:2 . "' is not in the bounds [0,1]."
        endif
        let l:matchCase = a:2
    endif

    let l:matchWholeWord = 0
    if a:0 >= 3
        if a:3 !~ '^\d\+$' || a:3 > 1 || a:3 < 0
            throw "ArgumentException: matchWholeWord value '" . a:3 . "' is not in the bounds [0,1]."
        endif
        let l:matchWholeWord = a:3
    endif

    let l:prefix = 'c'
    if a:0 >= 4
        if a:4 != 'c' && a:4 != 'l'
            throw "ArgumentException: prefix value '" . a:4 . "' is not 'c' or 'l'."
        endif
        let l:prefix = a:4
    endif

    let ignorecase = &ignorecase
    let &ignorecase = l:matchCase == 0
    try
        if l:prefix == 'c'
            let l:vimgrep = 'vimgrep'
        elseif l:prefix == 'l'
            let l:vimgrep = 'lvimgrep'
        endif

        if l:matchWholeWord
            let l:pattern = '\<' . l:pattern . '\>'
        endif

        let str = 'silent ' . l:vimgrep . ' /' . l:pattern . '/'

        for buf in getbufinfo()
            if buflisted(buf.bufnr) " Skips unlisted buffers because they are not used for normal editing
                if !bufexists(buf.bufnr)
                    throw 'Buffer does not exist: "' . buf.bufnr . '"'
                elseif empty(bufname(buf.bufnr)) && getbufvar(buf.bufnr, '&buftype') != 'quickfix'
                    if len(getbufline(buf.bufnr, '2')) != 0 || strlen(getbufline(buf.bufnr, '1')[0]) != 0
                        echohl warningmsg | echomsg 'Skipping unnamed buffer: [' . buf.bufnr . ']' | echohl normal
                    endif
                else
                    let str = str . ' ' . fnameescape(bufname(buf.bufnr))
                endif
            endif
        endfor

        try
            execute str
        catch /^Vim\%((\a\+)\)\=:E\%(683\|480\):/ "E683: File name missing or invalid pattern --- E480: No match:
            " How do you want to handle this exception?
            echoerr v:exception
            return
        endtry

        execute l:prefix . 'window'
    "catch /.*/
    finally
        let &ignorecase = ignorecase
    endtry
endfunction
于 2017-08-09T00:21:43.480 に答える