LoginSignup
1
2

More than 3 years have passed since last update.

fzf.vimでShift_JISもgrepできるようにする

Posted at

今まで 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ができるようになった。
うれしい。

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2