coc.nvimでDocker上のLanguagServerにアクセスしたい!!
結論から言います.
この記事でDocker上のLanguageServerにアクセスすることはできません.
できる方法が思いつきつつあるので出来たらまた記事にするかも...
動機
私はNeoVim + coc.nvimで環境を整えています.
coc.nvimで快適な補完生活を行っていますが,唯一問題があります.
それはDocker上で開発する際に同様の開発環境をローカルに構築しなければ補完が行われないという点です.
Docker内でNeovim + coc.nvimの環境を構築するのはこの問題を解決する最も安直な方法ですが,私はこの方法を取りたいとは思いません.
また,私のNeovim君を完全に動作させるにはNeovim 0.4以降のバージョンが必要です.
Debianのbuster以前を元にしているイメージではaptはNeovim 0.3.4を持ってきます.
つまりDocker内で環境構築することにすら苦労しなければならないのです.
このような問題から私はネイティブでNeovim+coc.nvimを動作させつつ,言語の環境だけをDocker内で構築したいのです.
私はWindowsマシンとLinuxマシンを両方使用しておりどちらでも動作することが必須条件です
やってみたこと
やってみたことは単純です
私は今Elixirを久しぶりに触りたいと考えていたためElixir用の環境を構築することを目標とします.
ElixirのLanguageServerはelixir-lsというものがあります
LanguageServerを動作させるDockerImageはdockerdlsp/elixir-lsを試した後,ソケット通信を行わないバージョン等自分でカスタムして様々な物を作成しました.(全部失敗したわけですが)
その際,coc.nvimでの設定は次の通り,
{
"languageserver": {
"elixirLS": {
"host": "127.0.0.1",
"port": 4567
"filetypes": ["elixir", "eelixir"]
}
}
}
{
"languageserver": {
"elixirLS": {
"command": "docker",
"args": ["run", "--rm", "-it", "dockeredlsp/elixir-ls:1.12.2-23.3.4"],
"filetypes": ["elixir", "eelixir"]
}
}
}
上記の設定で動きはします.
ですがエラーが出ているのかサーバがストップすることがわかりました.
ここで一度LSPの仕様を調べてみることにしました.
LSPの仕様を見て
LSPの仕様の詳細を見たわけではありませんが,こちらのサイトを見れば一目瞭然でした,fileのuriをjson-rpcとして送信しているわけです.
つまりDocker上のファイルシステムに同じ場所に同じファイルがないとアクセスできるわけもないわけです.
そのためLanguageServerがエラーを吐き,止まっているのではと考えられます.
この仕様を考えるとローカル上で動かすのが基本的に必須なのがわかると思います.
まとめにかえて
仕様を見たところ問題点が荒方見えてきた気がします.
つまり,Docker上に同じファイルが存在していればいいんですよね?
次回書くかどうか また,動くかどうかわかりませんがこの問題を解決する方法を紹介できればいいと思います.