coc.nvim で JSON/YAML Schema による YAML ファイルの補完を行う方法


はじめに

私は普段 neovim 上で coc.nvim を使ったコード補完を行っている。仕事で JSON Schema もしくは YAML Schema を使って YAML ファイルの記入を補完したくなったので neovim + coc.nvim 環境上で、JSON Schema もしくは YAML Schema を使った YAML ファイル上での補完をセットアップする方法を解説する。

セットアップ方法

本稿では coc.nvim は既にセットアップされているものとする。coc.nvim をセットアップしていない人は適当な記事を参照してセットアップされたし。

coc 上で yaml をインストールする

最初に coc-yaml をインストールする。リンク先にある通り、

:CocInstall coc-yaml

と neovim のコマンドで叩くだけである。

YAML ファイルのスキーマを指定する

スキーマの指定方法には何種類かがある。

(1) mode line に記述する

対象の YAML ファイルに対して mode line に以下の様な内容を記述する。<urlToTheSchema> の部分をスキーマファイルの URL に置き換える。

# yaml-language-server: $schema=<urlToTheSchema>

(2) 特定パターンのファイル名に対して特定のスキーマを常に使う

coc の設定ファイルに記述しておくと、coc-yaml は特定パターンのファイル名に対して特定のスキーマを常に(デフォルトで)使うように設定することができる。
coc のプラグインは CocConfig で設定を書く決まりなので neovim から

:CocConfig

と打つ。以下の様なパターンで、用いる JSON Schema の URI を書いていく。個人的には左右逆になってくれる方が分かりやすいのだが、現在編集中の YAML ファイルが右側(リスト)のどれかにヒットしたとき、左側のスキーマ(JSON Schema ファイルもしくは YAML Schema ファイル)を使ってバリデーションや補完を行う。

"yaml.schemas": {
    "http://json.schemastore.org/composer": ["/*"],
    "file:///home/johnd/some-schema.json": ["some.yaml"],
    "../relative/path/schema.json": ["/config*.yaml"],
    "/Users/johnd/some-schema.json": ["some.yaml"],
}

上記の例で下から2つ目の相対パス記載だが、相対パスで記載するとプロジェクトルートディレクトリ(git リポジトリのルートとか)からの相対パスになるようだ。(「なるようだ」というのは、ドキュメントを読んでもそのような記載はされていないように思えるが、手元で数例試した限りではここに解釈が正しそうに私には思える。)