NeoVim
新世代のVimその名もNeoVim
今までVimからの移行が面倒で使っていなかったのですが、使ってみると高速でちょっと嬉しいような機能も盛りだくさんでした。
Vimとの相違点を踏まえて、手早く移行するための記事になれば幸いです。
dein.vim
プラグインマネージャーです。
何やらneobundle.vimはバグフィックスのみになるらしく、今後はdein.vimを使って欲しいとのことでした。
こちらもめちゃくちゃ高速に動作します。
VimmerはShougo氏に足向けて寝ちゃいけない
これ一番言われてきてますから(私だけ)
Install
brew install neovim/neovim/neovim # mac
他のOSの方はインストール方法をみてください。
NeoVimはwikiにいろんな情報があって良いですぞこれ
Settings
# 省略...export XDG_CONFIG_HOME=$HOME/.config
# 省略...
NeoVimはXDG configurationというのをサポートしていまして、そのHOME_PATHを決められます。
私はテキトーに~/.config
にしましたが、これはお好みで変更してください。
また私は設定ファイルが増えすぎることを極端に嫌うので、Vimと共用しています。
実際は今までのVimの設定ファイルなどにシンボリックリンク貼れば良いです。
ln -snfv ${HOME}/.vim ${HOME}/.config/nvim/
ln -snfv ${HOME}/.vimrc ${HOME}/.config/nvim/init.vim
VimとNeoVimで設定を分けたい場合は${XDG_CONFIG_HOME}/nvim/init.vim
だけ作成すれば良いかと思います。
またターミナルのtrue colorを使用する場合は以下の設定を入れましょう。
" シンボリックリンクを使わない人は${XDG_CONFIG_HOME}/nvim/init.vimif has('nvim')let $NVIM_TUI_ENABLE_TRUE_COLOR=1endif
これでNeoVimの設定は終わりです。
厳密に言うと
- if_ruby
- if_lua
- if_perl
- if_mzscheme
- if_tcl
がなくなっており、依存しているプラグインは動かなくなりますので別のプラグインを使用する必要があります。(これについては後述)
Vimとの違いはvim_diffにまとめられていますので、慎重に移行したい方は目を通しておくと良いのではないでしょうか。
Plugins Settings
どちらかというとdein.vim
の方をメインに書きたかったので、ここからの方が長いです。
まずは設定を見てもらうのが良いでしょう。
" dein settings {{{if&compatiblesetnocompatibleendif" dein.vimのディレクトリlets:dein_dir = expand('~/.cache/dein')lets:dein_repo_dir =s:dein_dir . '/repos/github.com/Shougo/dein.vim'" なければgit cloneif!isdirectory(s:dein_repo_dir)
execute '!git clone https://github.com/Shougo/dein.vim's:dein_repo_dir
endif
execute 'set runtimepath^=' . s:dein_repo_dir
call dein#begin(s:dein_dir)" 管理するプラグインを記述したファイルlets:toml ='~/.dein.toml'lets:lazy_toml ='~/.dein_lazy.toml'" 読み込み、キャッシュは :call dein#clear_cache() で消せますif dein#load_cache([expand('<sfile>',s:toml,s:lazy_toml)])call dein#load_toml(s:toml, {'lazy': 0})call dein#load_toml(s:lazy_toml, {'lazy': 1})call dein#save_cache()endifcall dein#end()" vimprocだけは最初にインストールしてほしいif dein#check_install(['vimproc'])call dein#install(['vimproc'])endif" その他インストールしていないものはこちらに入れるif dein#check_install()call dein#install()endif" }}}
はい、プラグインはtoml形式で記述できるようになりました。
[[plugins]]repo='Shougo/dein.vim'[[plugins]]repo='Shougo/vimproc'[plugins.build]windows='tools\\update-dll-mingw'cygwin='make-fmake_cygwin.mak'mac='make-fmake_mac.mak'linux='make'unix='gmake'[[plugins]]repo='Shougo/neosnippet-snippets'
基本的にはこの書き方になります。
遅延読み込みする方はこちらへ
[[plugins]]repo='Shougo/neomru.vim'on_path='.*'[[plugins]]repo='jiangmiao/auto-pairs'on_i=1[[plugins]]repo='Shougo/neoyank.vim'on_path='.*'on_i=1[[plugins]]repo='Shougo/neosnippet'depends=['neosnippet-snippets']on_i=1on_ft=['snippet'][[plugins]]repo='Shougo/neocomplete'if='has("lua")'on_i=1[[plugins]]repo='Shougo/deoplete.nvim'if='has("nvim")'on_i=1[[plugins]]repo='Shougo/unite.vim'depends='neomru.vim'
neobundle.vim
と同様にプラグインの読み込みタイミングには多くのオプションをつけることができます。
on_i
1を指定すると、インサートモードに入った時に読み込まれますon_ft
指定したファイルタイプの時に読み込まれますon_path
バッファ名が一致した時に読み込まれます。.*
を指定すると何かのファイルを開いた時に読み込まれるので、filerなどのプラグインで使うと便利ですon_source
記載されたプラグインが読み込まれた後に読み込まれますon_cmd
コマンドが実行された時に読み込まれます。['Unite', 'UniteResume']
のようなプラグインのコマンドを指定するかと思いますon_map
on_cmd
のマッピング版で['<Plug>(neosnippet_expand_or_jump)']
のように指定しますdepends
プラグイン間で依存性がある場合に使います。ここに記述しても自動的にインストールされるわけじゃない点はneobundle.vim
とは少し挙動が違うので要注意の人もいるかもしれませんif
'has("nvim")
などのように書いて条件に一致した場合のみ読み込まれます
多分よく使うのはここら辺かと思います。
オプションは他にもあるのでdein-optionsで見るか:help dein-options
を参照してください。
先ほど記述した通り、一部のプラグインはNeoVimでは動きません。
有名なneocomplete
はdeoplete.nvim
に置き換えられます。if
オプションなどでうまいことVimと分けてみだくさい。
Pythonは3のみをサポートしています。
以下のコマンドでpythonを有効化してください。
pip install neovim
dein.vim on_source
neobundleではプラグインが読み込まれた際に実行する挙動が書けました。
lets:hooks = neobundle#get("unite.vim")function!s:bundle.hooks.on_source(bundle)lets:ignore_globs = ['**/node_modules/**','**/vendor/bundle/**','**/bower_components/**','**/tmp/cache/**']
call unite#custom#source('file_rec,file_rec/async','ignore_globs',s:ignore_globs)endfunction
これは以下のように書き換えられます。
" ...
augroup rc_autocmd
autocmd!
augroup END
" ...call dein#begin(s:dein_dir)" ...if dein#tap('unite.vim')function!s:unite_ignore() abort
lets:ignore_globs = ['**/node_modules/**','**/vendor/bundle/**','**/bower_components/**','**/tmp/cache/**']
call unite#custom#source('file_rec,file_rec/async','ignore_globs',s:ignore_globs)endfunction
execute 'autocmd rc_autocmd User''dein#source#' . g:dein#name 'call s:unite_ignore()'endif" ...call dein#end()" ...
autocmdというVimの機能を使います。rc_autocmd
は自分んで好きな名前に変換してください。
最後に
NeoVimとdein.vimとの出会いによって私のエディター生活はかなり高速になりました。
設定はそれほど時間がかからないと思うので使ってみてください。
P.S.
今まで使っていなかったけど:Unite file_rec/async:!
が良すぎる、なぜ今まで気づかなかったのか...プロジェクト内のファイル一瞬で見つけられますやん。
あとneoyank.vim
の:Unite history/yank
も優秀すぎる。
Shougo氏、本当にありがとうございます。