LinuxとかOSSのこととか

Linux (主にNixOS) や OSS に関する取り組みを記述するブログ。

NixOS で Vim プラグイン deoplete.nvim を使えるようにする

TL;DR

  deoplete.nvim のインストールには, vim の Python3 サポートだけではなく, pynvim も必要です. そのため, 以下のように configuration.nix を追記してビルドしました.

environment.systemPackages = with pkgs; [
  ...
  (vim_configurable.override { python = python39.withPackages (ps: with ps; [ pynvim ]); }) 
  ...
];

しかし, pynvim を vim から見つけられず, エラーになってしまいました.

[vim-hug-neovim-rpc] requires one of `:pythonx import [pynvim|neovim]` command to work 

この問題を解決するために, python3 のパッケージも追加でインストールし, deoplete.nvim を使えるようにしました.

environment.systemPackages = with pkgs; [
 ...
 (python39.withPackages (ps: with ps; [ pynvim ]))
 (vim_configurable.override { python = python39; }) 
 ...
];

説明すること

  • NixOS での Vim のインストール方法
  • Python3 サポートされた Vim のインストール方法
  • deoplete.nvim を入れた際のエラーとその解消方法

NixOSでのVimのインストール方法

システムに vim をインストールしたい場合は, /etc/nixos/configuration.nix を編集して, nixos-rebuild でビルドしてシステム設定を切り替えます. 一方, ユーザーの場合は nix-env 等でインストールします. 本記事では, 便宜的にシステムにインストールする場合の話に限定します.

vim インストールは他のパッケージと同様に, 以下のように environment.systemPackages にパッケージ名を追加すればできます. 自分のインストールしたいパッケージがあるかを調べたい場合は, ここで調べると良いです. vim パッケージは他にも vimHugeX, vim_configurable といくつか種類がありますが, 設定をいじることができる vim_configurable がおすすめです. また, vimHugeX は vim_configurable のエイリアスです.

environment.systemPackages = with pkgs; [
  vim_configurable
];

Python3サポートされたVimのインストール方法

NixOS WikiのVimの記事を参考に, 以下のように記述します.

environment.systemPackages = with pkgs; [
  ...
  (vim_configurable.override { python = python3; })
  ...
];

インストールできたかの確認は以下の方法で確認できます.

  • vim --version を入力して, +python3 が表示される
  • vim を起動して :echo has("python3") を実行し, 1 が返る

deoplete.nvim を入れた際のエラーとその解消方法

deoplete.nvim は入力補完用のプラグインです. deoplete.nvim のインストールには, vim の python3 サポートと pynvim が必要になります. そこで, NixOS WikiのPythonの記事を参考に, 以下のように記述しました.

with pkgs;
let
  packages = python-packages: with python-packages; [
    pynvim
  ]; 
  python-with-my-packages = python3.withPackages my-python-packages;
in 

...

environment.systemPackages = with pkgs; [
 ...
 (vim_configurable.override { python = python-with-my-packages; }) 
 ...
];

そして, 以下のプラグインをインストールしました. 下2つは deoplete.nvim を使うのに必要なプラグインです. ちなみに, プラグインのインストール方法は省略します. 私は vim-plug を使用しました.

これで無事 deoplete.nvim が使えるようになっていれば御の字ですが, 実際は, 以下のエラーメッセージがでてしまいました.

[vim-hug-neovim-rpc] requires one of `:pythonx import [pynvim|neovim]` command to work...

調べたところ, 上記でインストールした pynvim は, /nix/store 直下にパッケージとしてインストールされている一方, pythonサードパーティライブラリが保存される site-packages にはインストールされていないようでした.

このエラーを解決するために色々と格闘した結果, 以下のように追加で python もインストールすることで解消されました.

environment.systemPackages = with pkgs; [
 ...
 (python39.withPackages (ps: with ps; [ pynvim ]))
 (vim_configurable.override { python = python39; }) 
 ...
];

以下で vimpython は, 新しくインストールされた python パッケージをみることが確認できました.

vim上で :pythonx import sys; print(sys.path)
[
 '/nix/store/qmaczi731dgiip22am4js0b0k574z6wl-python3-3.9.2-env/lib/python39.zip',
 '/nix/store/qmaczi731dgiip22am4js0b0k574z6wl-python3-3.9.2-env/lib/python3.9', 
 '/nix/store/qmaczi731dgiip22am4js0b0k574z6wl-python3-3.9.2-env/lib/python3.9/lib-dynload',
 '/nix/store/qmaczi731dgiip22am4js0b0k574z6wl-python3-3.9.2-env/lib/python3.9/site-packages', 
 '_vim_path_'
]

端末上で readlink `which python`
/nix/store/qmaczi731dgiip22am4js0b0k574z6wl-python3-3.9.2-env/bin/python