【FreeBSD】dein.vimではじめるNeovimプラグイン管理

NeovimはVim同様にプラグインを通して様々な機能を拡張できる。

でもプラグインを手動でインストールするのはめんどい。

dein.vimというプラグインを管理する為のプラグインを使おう。

確認環境

   
PC Thinkpad X1 Carbon 2nd Gen
OS FreeBSD 12.1-RELEASE-p1
Neovim NVIM v0.4.3
Python Python 3.7.6
Ruby ruby 2.6.5p114
Node.js v13.3.0

やること

ここでは、以下について説明する。

dein.vimを入れる前に、プラグインの開発によく使われる言語の実行環境を入れておく。
これは実際に使うプラグインで必要になったときに実施すればOK。

ただ、今回お試しでインストールするdeopleteにはPython3が必要。
deopleteを入れてみたい人は、下の2つの手順は実施してね。

  • 1.1 Pythonのインストール
  • 1.4 Neovimとの連携確認

1. よく使われる開発言語の実行環境インストール

1. Pythonのインストール

下のコマンドを管理者権限で実行してね。

> pkg install python27 python37     # Python本体
> pkg install py27-pip py37-pip     # Python2のパッケージ管理ツール
> pip-2.7 install pynvim            # Neovimとの通信ライブラリ(Python2)
> pip-3.7 install pynvim            # Neovimとの通信ライブラリ(Python3)

ちなみに通信ライブラリのアップデートは下のコマンド。

> pip-2.7 install -U pynvim
> pip-3.7 install -U pynvim

2. Rubyのインストール

下のコマンドを管理者権限で実行してね。

> pkg install ruby ruby-gem26   # Rubyとパッケージ管理ツール
> gem install neovim            # Neovimとの通信ライブラリ

ちなみに通信ライブラリのアップデートは下のコマンド。

> gem update neovim

3. Node.jsのインストール

下のコマンドを管理者権限で実行してね。

> pkg install node           # Node.js(パッケージ管理ツールもセット)
> npm install -g neovim      # Neovimとの通信ライブラリ

ちなみに通信ライブラリのアップデートは下のコマンド。

> npm update -g neovim

4. Neovimとの連携確認

各実行環境をインストールしたら、Neovimを起動して:checkhealthを実行しよう。
参考までに僕の環境での実行結果は以下。

## Python 2 provider (optional)
  - INFO: `g:python_host_prog` is not set.  Searching for python2.7 in the environment.
  - INFO: Executable: /usr/local/bin/python2.7
  - INFO: Python version: 2.7.17
  - INFO: pynvim version: 0.4.1
  - OK: Latest pynvim is installed.

## Python 3 provider (optional)
  - INFO: `g:python3_host_prog` is not set.  Searching for python3.7 in the environment.
  - INFO: Executable: /usr/local/bin/python3.7
  - INFO: Python version: 3.7.6
  - INFO: pynvim version: 0.4.1
  - OK: Latest pynvim is installed.

## Ruby provider (optional)
  - INFO: Ruby: ruby 2.6.5p114 (2019-10-01 revision 67812) [amd64-freebsd12]
  - INFO: Host: /usr/local/bin/neovim-ruby-host
  - OK: Latest "neovim" gem is installed: 0.8.1

## Node.js provider (optional)
  - INFO: Node.js: v13.3.0
  - INFO: Neovim node.js host: /usr/local/lib/node_modules/neovim/bin/cli.js
  - OK: Latest "neovim" npm/yarn package is installed: 4.8.0

もし、インストールしたPythonやRubyが見つからない旨のERRが出ていたら、
init.vimで下のような設定を追記すればいいかも。
(パスは各環境に合わせて変更してね)

let g:python_host_prog='/usr/local/bin/python2.7'
let g:python3_host_prog='/usr/local/bin/python3.7'
let g:ruby_host_prog='/usr/local/bin/ruby'
let g:node_host_prog='/usr/local/bin/node'

もし、対象言語のサポートを無効にしたい場合は、下の設定で良さげ。

let g:loaded_python_provider=0      # Pythno2のサポート無効化
let g:loaded_python3_provider=0     # Pythno3のサポート無効化
let g:loaded_ruby_provider=0        # Rubyのサポート無効化
let g:loaded_node_provider=0        # Node.jsのサポートを無効化

いずれもinit.vimの最初の方に追記すること。
追記したらNeovimを再起動して、もう一度:checkhealthを実行して確認しよう。

2. dein.vimの設定とインストール

それではdein.vim本体をインストールする。

と、その前にgitは予めインストールしておいてね。
(管理者権限で実行してね)

> pkg intall git

1. init.vimの修正

下のコードを~/.config/nvim/init.vimに追記して、Neovimを再起動すればOK。

4,5行目は各自好きなパスを指定して下さいまし。

これでNeovim起動時に、dein.vim本体と指定のプラグインを自動でインストールしてくれる。

2. dein.vim関連のディレクトリ/ファイル構成

上のコードだと、下のようなディレクトリ/ファイル構成になる。

~/.config/nvim
|-- init.vim        # Neovim設定ファイル
|-- dein.toml       # プラグインの登録ファイル
|-- plugins/*.vim   # 各プラグインの設定ファイル(必要であれば)
~/.cache/nvim/dein/
|-- repos/*         # 各プラグインをインストールするディレクトリ
|-- repos/github.com/Shougo/dein.vim    # dein.vimプラグイン本体

3. プラグインの登録とインストール

プラグインをインストールするには、dein.tomlを編集して必要なプラグインを登録する。

ここでは、入力補完プラグインのdeopleteをインストールしてみる。

1. dein.tomlの修正

dein.tomlに下のコードを追記しよう。
deopletecontext_filetype.vimに依存しているので、こちらも一緒にインストールする。

追記したら、Neovimを再起動してみよう。
起動時に上の2つのプラグインがインストールされるはずだ。
インストールが終わったら、Neovimを再起動して、適当なファイルを開いてみよう。

deopleteがちゃんと動いていれば、Insertモードで2文字以上入力したときに、補完候補が表示されるはずだ。

2. 各プラグインの設定を別ファイルにする場合

プラグインが増えてくると、dein.tomlが長くなってゴチャゴチャしてくる。
それが嫌な人は、先程のhook_addに書いた設定を別ファイルにするといい。

まず下のように、sourceで任意のファイルを指定する。

hook_add = '''
source ~/.config/nvim/plugins/deoplete.rc.vim
'''

そして、sourceで読み込むファイルに対象プラグインの設定を書けばOK。

let g:deoplete#enable_at_startup = 2
let g:deoplete#auto_complete_delay = 0
let g:deoplete#auto_complete_start_length = 2
let g:deoplete#enable_camel_case = 0
let g:deoplete#enable_ignore_case = 0
let g:deoplete#enable_refresh_always = 0
let g:deoplete#enable_smart_case = 1
let g:deoplete#file#enable_buffer_path = 1
let g:deoplete#max_list = 1000

4. dein.tomlに記載するオプション

dein.tomlに指定するオプションでわりと見かけるものをご紹介。
repoは必須。
それ以外は、各プラグインのマニュアルを読んで必要に応じて指定する感じ。

設定項目 設定内容 設定値の例など
repo プラグインの公開リポジトリ repo='Shougo/deoplete.nvim'
depends 依存しているプラグイン depends='context_filetype.vim'
frozen 自動更新しない場合に1を指定(更新されない古いプラグインなど) frozen=1
build プラグインインストールコマンド bash install.sh
if プラグインを登録する条件を指定 if='has("nvim")'
if=0
on_event プラグインをロードするタイミング(Vimのイベント) on_event='InsertEnter'
on_event=['BufEnter','WinEnter']
on_ft プラグインをロードするFileType on_ft='rust'
on_ft=['css','html','php']
on_if プラグインロード時にロード条件を追加で指定
デフォルトはBufRead,BufNewFile,VimEnter,FileTypeイベント時、
on_event指定時はそのイベント発生時に判定とのこと
on_if='winnr("$")>1'
hook_add ロード時に実行するVimスクリプト hook_add='g:variiable=value'
hook_add='source path/to/file.vim'

その他のオプションについては、deinのマニュアルを見てね。

5. プラグインの更新

上で紹介したinit.vimの設定では、下のコードでプラグインの更新関数を割り当てている。

" Update plugins (bind keymap)
" ----------------------------
nnoremap <Leader>du :call dein#update()<CR>

各自好きに割り当てて下さいな。

6. プラグインの削除

dein.tomlから対象プラグインの記載をコメントアウトか削除すればい。
Neovim起動時に記載を削除したプラグインのインストールファイル(プラグインのコードなど)も削除するようにしている。

また、if=0オプションを指定した場合も同様に削除する。

自動でインストールファイルを自動で削除したくない場合は、init.vimの下のコードを削除するなり、関数化してキーに割り当てるなりしてねと。

" Remove plugins
" ----------------------------
let s:removed_plugins = dein#check_clean()
if len(s:removed_plugins) > 0
    call map(s:removed_plugins, "delete(v:val, 'rf')")
    call dein#recache_runtimepath()
endif

最後に

これで手動に比べるとだいぶ楽にパッケージ管理が出来るようになったと思う。

あとは下のサイトさんなどを参考に手始めに入れるプラグインを探してみてはいかがだろうか。

参考