読者です 読者をやめる 読者になる 読者になる

grep 結果に quickfix からジャンプできない

職場の Windows マシンで混乱した話。

結論

  • vimgrep 結果の quickfix から該当箇所にジャンプするには grepprg を "grep -n" とする必要がある。*1

知ってるよって人には、ここから先に新しい発見はないと思います。

.vimrc の設定をこうすれば OK。
Windows 以外だとデフォルトがこの設定なので気にすることがないかも。

grepprg=grep\ -n

調べた経緯

職場では Windows に香り屋さんの Vim を入れて使っています。
私の環境では grepprg のデフォルトが "findstr /n" となっているのですが、やっぱ grep 使いたい!ということで GOW*2 をインストール。

とりあえず .vimrc に下記のように設定。

grepprg=grep

これで grep 使えるぜ!と喜んだのもつかの間、grep 結果が quickfix に反映されるものの、該当箇所にジャンプできない…
vimgrep では問題なし。

grepprg を疑ってヘルプを見る。

:help grepprg

抜粋
default "grep -n "
Unix: "grep -n $* /dev/null",
Win32: "findstr /n" or "grep -n",

"-n" オプション?
grep の項目を読むと、どうやら grep 結果が grepformat 形式でないとだめらしい。

:help grepformat

抜粋
'grepformat' 'gfm'	string	(default "%f:%l%m,%f  %l%m")

書式 f とか l とかは、"errorformat" に書いてある。

:help errorformat

抜粋
	%f		file name (finds a string)
	%l		line number (finds a number)
	%m		error message (finds a string)

現在の設定を確認。

:set grepformat

grepformat=%f:%l:%m,%f:%l%m,%f  %l%m

つまり、該当箇所の前に、ファイル名、行番号が必要ということですね。

ってことで、vimgrep 結果の quickfix から該当箇所にジャンプするには "grep -n" としなければなりません。
最初から grep コマンド入ってれば、こんなことしなくて済んだのに…

おまけ

このエントリ書く途中で知った、コマンドの結果をクリップボードにコピーする方法。

:redir @*>
:set grepformat
:redir END

*1:もちろん "-I" とかオプションの追加はできます

*2:https://github.com/bmatzelle/gow