深酒とお昼寝で忘れる

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

深酒とお昼寝で忘れる

素面でも意図したことを忘れがちなしらふいとさんは、忘れる前に書き残せたらとても満足

重い腰を上げて Neovim ことはじめ ー ripgrep (rg) と fzf によるソースコード検索編

はじめに

Neovim への移行と共に実現したいことがありました。この 『コマンド一発でソースコード検索&表示できる「peco」改が凄い!』 というブログポストで紹介されているもの相当の機能を Vim 内で実現することです。記事でも『Vim にある grep とかも物色しながら「いいのないねー」……』とありますし、比較的素直な発想だと思います。さていきなりですが、これは 先日の記事 に書いた Neovim のニュースレターの 第6号 で紹介されている fzf を導入すればできる気がしたので、やってみました。

代替手段の調査

と、その前に、一応他の実現方法についても少し調べてみます。

まずは、元の記事にある peco の連携を少し調べてみましたが希望に沿うものはなさそうな雰囲気。記事の出発点が Vimgrep などを検討したが良いものがない、というものなので、もし peco との連携が可能なら記事で言及されますよね、きっと。

続いて考えたのが CtrlP を使う方法です。結構期待したのだけれど CtrlP はファイルのマッチングを念頭に作られたからかデフォルトでは所望の機能がないようです。CtrlP の拡張を少し探してみたもののすぐには見つからなかったので、次へ。

最後に、できる気がするのだけれど今回は手を出さなかったのが Denite.nvim を使う方法です。先代の Unite.vim の頃から、いつか使ってみたいと思っているプラグインなのですが……、なんかどうにも億劫で試してみるには至りませんでした。

fzf および fzf.vim のインストール

はい。ということで fzf です。fzfpeco のようないわゆる fuzzy matcher で、作者の方が Vim ユーザなこともあってか Vim との連携機能が強力です。同じ作者による fzf.vim プラグインを導入すると 幸せになれるそうです。色々と設定を試行錯誤して、そこそこ満足できる状態になりました。

インストールには TOML ファイルに fzf および fzf.vim のエントリを追加します。

[[plugins]]
repo = 'junegunn/fzf'
build = './install --bin'
merged = '0'

[[plugins]]
repo = 'junegunn/fzf.vim'
depends = 'fzf'

検索プログラムの選定

fzf.vim の設定の前に、fzf への入力を出力するプログラムを決めます。元の『「peco」改』のエントリは peco への入力に Ack を使っています。Ackfind+grep 相当のことが実行できるもので、同種のプログラムが多数開発されています。調べた結果、ripgrep というプログラムが性能が良く一番信頼できそうだな、という結論に至りました。興味のある方は、ripgrep の作者が性能比較を行なっている このブログポスト や、Hacker News での ag の作者との やり取り などを読んでみてください。

fzf.vim の設定

さてあとは fzf.vim の設定です。なるべく元の記事の アニメーション と似たような使用感になると良いなと思って設定しました。

該当する箇所の設定を抜き出してみました。

[[plugins]]
repo = 'junegunn/fzf.vim'
depends = 'fzf'
hook_add = '''
    command! -bang -nargs=* Rg
      \ call fzf#vim#grep(
      \   'rg --line-number --no-heading '.shellescape(<q-args>), 0,
      \   fzf#vim#with_preview({'options': '--exact --reverse'}, 'right:50%:wrap'))
'''

fzf.vimREADME にある :Rg というコマンドを設定している箇所を参考にして、以下の変更を加えています。ちなみに rg というのは ripgrep の実行ファイル名です。README では --column が有効で with_column1 に設定してありますが、どのような効果があるのか不明だったので無効にしました。:Rg! コマンドは使わないと思ったので除き、また --color=always があると速度が目に見えて遅くなってしまうのでこちらも除いてデフォルトの挙動(--color=auto)にしてあります。

fzf#vim#with_preview はとてつもなく素晴らしいので、デフォルトで有効にしました。長い行は wrap した方が好みです。また、fzf--exact--reverse を渡しています。前者はあいまい検索を無効に、後者は候補の表示をデフォルトのボトムアップからトップダウンに変更するオプションです。


追記(2017/04/29):--delimiter : --nth 3.. というオプションを追加しました。詳しくは こちら


あとはコマンドモードで :Rg を実行すれば良いです。

おわりに

f:id:someneat:20170308040647g:plain

重い腰を上げて Neovim ことはじめ ー Neobundle から Dein.vim への移行編

Vimプラグイン管理には Neobundle というプラグイン(パッケージ)マネージャのお世話になっており、これといって不満はないんです。ただ Neobundle はもうバグ修正しかしないようですし、いつかは他のプラグインに乗り換えるのかな(面倒くさい……)とは考えていました。そんな折に Neovim へ移行することにしたので、これを機に見通しの悪い .vimrc を含め設定ファイルを見直して整理して、さらに Dein.vim に移行してみました、というのが今回の内容です。話が横道に逸れますが、Vimプラグインマネージャが浸透し始めたのは 2010 年頃 のようで、自身も pathogen.vimVundle と使ってみて 2012 年の終わり頃から NeoBundle を使ってきました。変化の早さに驚くばかりです。

さて話を戻して、このトピックに関しては日本語の情報がたくさんあります。ここここここここここここ……(たぶんまだまだある)。これらの情報に加えて、SpaceVim の設定と、Dein.vim の作者である Shougo さんの 環境 を参考に設定してみました。なるべく複雑にしないことを目標に。

結果、このような構成になりました。

~/.config/nvim/
├── config
│   ├── dein.toml
│   ├── dein.vim
│   ├── dein_lazy.toml
│   ├── dein_local.toml
│   ├── init.vim
│   ├── main.vim
│   └── settings.vim
├── init.vim

init.vimconfig/main.vim を読み込み、この config/main.vim は同じディレクトリにある init.vimdein.vimsettings.vim を順に読み込む、という感じです。dein.vimdein.tomldein_local.toml(ローカルに保存してあるプラグイン)、dein_lazy.toml をそれぞれ dein#load_toml() します。

基本的には、SpaceVim の init.vim および config/init.vim をほとんどそのままコピーして、.vimrc 内のプラグインに関する記述を TOML ファイルに、残った設定を settings.vim に移行しました。TOML ファイル内で、プラグインのインストール情報(repo キー)と共に関連する設定を hook_* というキーでまとめて書いておけるのがすっきりして良いなと思ってます。

例えば、こんな感じ。

[[plugins]]
repo = 'ctrlpvim/ctrlp.vim'
hook_add = '''
    let g:ctrlp_map = '<Leader>cp'
'''

ちなみに hook に関する情報は ここ が詳しそうです。

まとめ。Neobundle から Dein.vim へ移行しました。次回は、新しく導入したプラグインの紹介編です。

重い腰を上げて Neovim ことはじめ ー Vim 環境の移行編

Neovim は Vim の未来だ ということで、そろそろ Vim 環境を Neovim に移行してみます。作業のモチベーションを上げるため、環境の移行に加えて、プラグイン管理を Neobundle から Dein.vim へ移行すること、および Neovim ニュースレターの 第6号 で紹介されている Neovim ならではの新しいプラグインをインストールすること、も目標にします。

まずは Neovim 本体を Homebrew でインストールします。

$ brew install neovim/neovim/neovim

Neovim への移行のための情報は :help nvim-from-vim から。基本的には下記で OK です。

$ mkdir ~/.config
$ ln -s ~/.vim ~/.config/nvim
$ ln -s ~/.vimrc ~/.config/nvim/init.vim

Neovim は XDG Base Directory Specification という仕様に従っているらしく、上記の ~/.config$XDG_CONFIG_HOME のデフォルト値のようです。ちなみにデータの類は $XDG_DATA_HOME である ~/.local/share に、キャッシュの類は $XDG_CACHE_HOME である ~/.cache に保存すると良いようです。

あとは vim コマンドの代わりに nvim を実行すれば Neovim が起動します。驚くほどスムーズに移行できました。気持ち Vim よりもさくさくしているような印象です。

今時のツールは自己診断なんかもできます。Neovim 内で :CheckHealth コマンドを実行すると環境に問題がないかをチェックしてくれます。Homebrew を使っている人にはお馴染の brew doctor にあたる機能ですね。PythonRuby の環境に問題あり、と診断されたので言われたとおりに下記を実行します。

Python 2:

$ brew install python
$ pip install neovim

Python 3:

$ brew install python3
$ pip3 install neovim

Ruby

$ brew install ruby
$ gem install neovim

再度 :CheckHealth したところ診断結果は良好のようです。

まとめ。Vim から Neovim へ移行しました。次回は、Neobundle から Dein.vim への移行編です。