次のgrepの結果に進む方法は?


7

grepプロジェクトで関数の出現箇所を見つけるために使用しています。

:grep "set_val" *

vimから出て、出力します。

code.py:68:        self._device.set_val('Level', new_level)
code.py:84:        self._device.set_val("Mode", "Remote")
Press ENTER or type command to continue

Enterキーを押すcode.py:68と、最初に発生した場所にいます。

他のオカレンスに移動するにはどうすればよいですか?


1
QFウィンドウを開いてみませんか?
ケント

回答:


21

:grep/ :vimgrepどちらもクイックフィックスリストを使用して場所を保存します。お気づきのとおり、vimは自動的に最初のオカレンスにジャンプします(!この動作を回避するために使用)。を使用:cnextして、クイックフィックスリストの次の場所に移動します。

Quickfixコマンド

  • :cnext/ :cpreviousクイックフィックスリストでクイックフィックスを前後にナビゲートする
  • :cfirst/ :clastクイックフィックスリストの最初と最後にジャンプする
  • :copenクイックフィックスウィンドウを開くために使用します。<cr>エントリにジャンプするために使用します
  • :ccloseクイックフィックスウィンドウを閉じるために使用します
  • :cc現在のエラーを表示するために使用します。
  • :colder/ :cnewer古い/新しいクイックフィックスリストにジャンプする

私はあなたのためのマッピングを作成することをお勧めします:cnext:cprevious。私は個人的に使用unimpaired.vim提供する]q[qのマッピング:cnext:cprevious

クイックフィックスウィンドウを自動的に開く場合は、以下をに追加しますvimrc

augroup autoquickfix
    autocmd!
    autocmd QuickFixCmdPost [^l]* cwindow
    autocmd QuickFixCmdPost    l* lwindow
augroup END

このトピックについてのVimcastsエピソードがあります::vimgrepで複数のファイルを検索してください

プロジェクト全体の検索と置換

使用している場合は:grep/を:vimgrep行うための方法として、プロジェクト全体の検索をし、置き換え、その後私はあなたが使用することをお勧め:cdo/ :cfdo(Vimの7.4.980+で)。

:grep 'foo'
:cfdo %s/foo/bar/g|w

Vimのバージョンに:cdo/ がない場合:cfdoは、次のコマンドをvimrcファイルに入れて、:Cdo/の:Cfdo代替コマンドを提供します。

if !exists(':cdo')
  command! -nargs=1 -complete=command Cdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cn | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry

  command! -nargs=1 -complete=command Cfdo try | sil cfirst |
        \ while 1 | exec <q-args> | sil cnf | endwhile |
      \ catch /^Vim\%((\a\+)\)\=:E\%(553\|42\):/ |
      \ endtry
endif

代替プログラムを使用する :grep

場合によってgrepは、検索のニーズに対して十分ではありません。設定:grepからプログラムを変更できます'grepprg'(変更する必要がある場合もあり'grepformat'ます)。個人的には、ripgrepを使用して、のマニュアルページのvimrc指示に従って、ファイルに以下を追加しrgます。

set grepprg=rg\ --vimgrep
set grepformat^=%f:%l:%c:%m

注:「スマートケース」検索(すべて小文字の場合は大文字と小文字を区別しない検索)を使用する場合-Sなどset grepprg=rg\ -S\ --vimgrep、フラグを使用することができます。

今度:greprg検索に使用します。例えば:grep foo -t js

彼女は調査するいくつかの代替grepプログラムです:ackagripgrep、およびgit grepFugitive.vim:Ggrepラッパーを提供します)

詳細については、以下を参照してください。

:h :grep
:h 'grepprg'
:h quickfix
:h :cnext
:h :copen
:h :ccl
:h :cc
:h :colder
:h :cdo
:h :cfdo

すばらしい答えをありがとう。クイックフィックスウィンドウを自動的に開くためのコードは機能しますが、私にとってはそれが開き、コマンドを使用してそこにジャンプする必要があります(ctr + wおよび下矢印)。自動的に開いた後、カーソルをクイックフィックスウィンドウに自動的にジャンプする行を追加できますか?ありがとうございました。
アサフ

autocmdイベント内で:cwindow/ を使用すると:copenQuickFixCmdPost起動後に現在のバッファが復元されます。:wincmd bまたは必要なウィンドウコマンドをに追加できますautocmdが、ウィンドウは復元されます。これはでほのめかされてい:h autocmd-useます。これについて考えると、イベントに複数のautocmdがアタッチされている可能性があるため、この動作は理にかなっています。この問題を強制する方法は、これをquickfixコマンドにラップすることだと思います。例:command! Grep -nargs=+ grep <args> | cwindow
ピーターリンカー、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.