rcmdnk's blog

20171116_deoplete_200_200

一ヶ月位前にVimのプラグインの1つである neocomplete の開発終了のアナウンスがありました。

これはNeovim用の同様のプラグインとして開発されている deoplete がVim 8に対応したということからです。

アナウンスされた当初はバグ?があったりで上手く動かなかったので様子をみてましたが、 色々アップデートがて使える様になったので使える場所ではdeopleteを使うようにしてみました。

deopleteとは

deopleteはVimの(Dark poweredな)補完機能を強化してくれるプラグインです。

別途補完ソース用のプラグインを追加することで 補完候補を加えることも出来ます。

元々はNeovim専用でVimには neocompleteという同様のプラグインがありましたが、 deopleteの方がVim 8対応になったので 今後はバグフィックスだけで開発はしない、とのこと。

neocomplete development is over · Issue #600 · Shougo/neocomplete.vim

neocmpleteはLuaを使ったプラグインでしたが、 deopleteはPython 3を使っています。 (Neovimでは0.2以前ではLuaが使えず現状も徐々に対応している様な状態のため。)

その前に neocomplcache という外部言語を使わない?ものもありました。 (これはもうメンテナンスもされてません。)

deopleteの導入に必要なこと

ということでdeopleteはVimでも使える様になりましたが、 条件としてPython 3付きでコンパイルされている必要があります。

vim --version+python3となってるか確認。 もしくはVim起動後:echo has('python3')が1になることを確認。

そうでなければソースからビルドするなら configure--enable-python3interpを渡してビルド。

MacでHomebrewなら

brew install vim --with-python3

勿論Python 3がシステムにインストールされている必要があります。

加えてneovimというPython 3のパッケージがシステムに導入されてる必要があります。 ないとdepleteを起動する時に

Messages maintainer: Bram Moolenaar <[email protected]>
[vim-hug-neovim-rpc] failed executing: pythonx import neovim
[vim-hug-neovim-rpc] Vim(pythonx):Traceback (most recent call last):
[deoplete] [vim-hug-neovim-rpc] requires `:pythonx import neovim` command to work
[deoplete] function deoplete#enable[1]..deoplete#initialize[1]..deoplete#init#_initialize[11]..deoplete#init#_channel[10]..yarp#core#notify[1]..yarp#core#wai
t_channel[5]..yarp#core#jobstart[2]..yarp#pyx#init[13]..yarp#core#serveraddr[1]..neovim_rpc#serveraddr, line 15

みたいなエラーがおきます。 この場合にはpip3

$ pip3 install --upgrade neovim

の様にインストールしてあげる必要があります。(neovimパッケージが古い場合にもエラーが出るのでその場合にも同様のコマンドでバージョンアップグレードが必要。)

Neovimでは元々python3が無効な状態でも このneovimパッケージを入れると自動で有効になります(再コンパイルとか必要なし)。

Neovimでdeopleteを使う場合にはpython3が有効であればOKですが、 Vimの場合にはさらに roxma/nvim-yarproxma/vim-hug-neovim-rpc という2つのプラグインが必要になります。

また、VimではVim 8から導入されたtimersという機能が入っている必要がありますが(python3同様にvim --versionで確認)、 通常のビルドなら入っているはずです。 これが必要なのでVim 7とかでは使えません。

deopleteの導入

Python 3とかは入ってない環境があるので.vimrcではまだneocompleteも残す形で導入しました。

プラグインの導入は同じ作者のShougoさんの dein を使って

.vimrc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
if dein#load_state(s:dein_dir) ; s:dein_dir: path to dein plugin
  call dein#begin(s:dein_dir)
  call dein#add('Shougo/dein.vim')

  ...

  if ((has('nvim')  || has('timers')) && has('python3')) && system('pip3 show neovim') !=# ''
    call dein#add('Shougo/deoplete.nvim')
    if !has('nvim')
      call dein#add('roxma/nvim-yarp')
      call dein#add('roxma/vim-hug-neovim-rpc')
    endif
  elseif has('lua')
    call dein#add('Shougo/neocomplete.vim')
  endif

  ...

  call dein#end()
  call dein#save_state()
endif

...

if dein#tap('deoplete.nvim')
  let g:deoplete#enable_at_startup = 1
elseif dein#tap('neocomplete.vim')
  let g:neocomplete#enable_at_startup = 1
endif

...

こんな感じで導入しています。

Neovimでの設定も含めてNeovim(nvim)で無い場合はVimとして timersを要求しています。 python3はいずれにしろ必要。

さらにはpip3でneovimパッケージが入ってるかどうかをチェックしています。 これに関してはシステムによってはちょっと起動に時間がかかる可能性がありますが 入れてみてもそれ程体感が変わらなかったので入れてます。

これらがそろってる環境ではdeopleteを使います。

nvimで無い場合(Vimの場合)には必要な2つのプラグインも追加。

python3とかがそろってない場合にluaが使えればneocompleteを。

その昔はそうでもない場合にneocomplcacheを使う様にしてましたが 今はもうメンテもされてないのでそういった場合は何も使わないように。

2つとも初期状態ではVim起動時に有効になってないので 起動時に有効にするenable_at_startupと言う値を1にしてあげます。

deopleteを使ってみて

neocompleteも特に不満は無いので deopleteにしても体感的にはあまり違いを感じませんが、 大きな違いは依存してる言語がLuaかPython 3か、という部分。

個人的にLuaというものを他では使いませんし、 Vimとしてもneocompleteだけで使っているので これだけのためにLuaをインストールし、Lua付きなVimをインストールする必要がありました。

一方、Python 3はまだデフォルトで入っていない環境も多いですが 直接使うこともありますし元々入っている環境も結構あります。

機能的な面ではありませんがこれは人によっては結構嬉しいことだと思います。 逆な人もいるかもしれませんが。

deoplete用補完ソースプラグイン

上にも書いた様に、Vimのオリジナル機能で補完出来るバッファ内にある文字列等に加え、 プラグインを追加することでプログラム言語の中で定義されてる 名前などが補完出来る様になります。

今は以下の様なものを入れています。 (実際には上の.vimrc例の中のdeopleteやneocompleteを追加する所に一緒に記述。)

.vimrc
1
2
3
call dein#add('Shougo/neco-vim')
call dein#add('Shougo/neco-syntax')
call dein#add('ujihisa/neco-look')

neco-vimはVimスクリプトを書く時に補完をしてくれます。

neco-syntaxは各filetypeのsyntaxファイルの中にある記述を見て 補完候補を追加してくれます。

neco-lookはlookコマンドを用いて入力した文字列から始まる英単語を表示してくれます。 コマンドラインからlook abとかやれば

$ look ab
Ab
aba
Ababdeh
Ababua
abac
abaca
...

となると思いますがこの内容を補完候補に。 lookコマンドが入ってないと使えませんがほとんどのUnixシステムには入ってます。

これらはdeopleteでもneocompleteでも使用可能です。

他にも色々な補完ソースを以下から見つけることが出来ます。

Completion Sources · Shougo/deoplete.nvim Wiki

各言語のチェッカーなどを使ったもの(そのツールがインストールされてる必要がある) などもあって、特に使うものについては準備して入れると便利になるかと。

上で入れてるnecoシリーズは元々neocompleteの時代からあったもので deopleteにも対応するようにアップデートが加えられてますが、 上記のページにあるdeoplete-的なプラグインは基本的にはdeopleteでしか使えないものです。

neocomplete用の同様のものも探せば沢山あるので必要ならば探して。

この辺の補完ソースの違いも2つのプラグインの使い勝手を変えると思いますが、 今後はdeopleteの方のものが増えていくのでdeopleteの使い勝手が上がっていくでしょう。

Sponsored Links
Sponsored Links

« Firefox Quantum 57リリース: Vimperatorは無事死亡 GNU screen/tmux内でNeovimを使う時に必須な設定 »

}