今まで ag
The Silver Searcherを使っていたのだけど、業務のカクカクシカジカでShift_JISを使うことが増えてた。ag
でSjift_JISをgrepするには nkf
で変換を挟むなどの無理くり変換になりそうなので、他の方法を探すことにする。
Neovimを使っているので、fzf.vimでも使えるのが条件。
ripgrepならできそう
カクカクシカジカでripgrepならできそう。
名前だけ知っていた。
- 正規表現をオプションなしで使えるなど、フィーチャーしてる。
- 早い。体感的にも分かるくらい早い。
単純なベンチマークだとag
の1/5の値が出てるらしい。 - .gitignoreをデフォルトで読み込み、無視するファイルを無視する。
- オプションで数種のエンコーディングに対応する。
- Rust製
ripgrepをインストールする
brewで入る。
$ brew install ripgrep
テストしてみる
UTF-8のgrep
$ echo$LANG
ja_JP.UTF-8
$ echo こんにちは > utf8.txt
$ rg こん
utf8.txt
1:こんにちは
分かりにくいけど、カラーで出てる。
SJISのgrep
$ echo こんばんは | nkf -s> sjis.txt
$ rg --encoding Shift_JIS こん
sjis.txt
1:こんばんは
できてる!
文字コードが混在するgrep
$ ls
sjis.txt utf8.txt
$ rg こん
utf8.txt
1:こんにちは
$ rg --encoding Shift_JIS こん
sjis.txt
1:こんばんは
ここが少し惜しい。
文字コードの異なるファイルがあった場合、
オプションが指定されている方のみの結果になる。
fzf.vimの設定をする
Rgs
コマンドを追加して割り当てる。
fzf.vimの公式に書いてあるものを、とりあえずそのまま使ってる。
~/.vimrc
command!-bang -nargs=* Rgs
\call fzf#vim#grep( \'rg --encoding Shift_JIS --column --line-number --no-heading --color=always --smart-case '.shellescape(<q-args>),1, \<bang>0 ? fzf#vim#with_preview('up:60%') \: fzf#vim#with_preview('right:50%:hidden','?'), \<bang>0)
nnoremap <silent><Leader>ff :<C-u>Rg<CR>
nnoremap <silent><Leader>fs :<C-u>Rgs<CR>
これで :Rg
だとUTF-8のgrep、:Rgs
だとSJISのgrepができるようになった。
うれしい。