## 事象
[[Neovim]]で[[coc.nvim]]を使って[[coc-elixir]]を起動すると失敗する。
```error
[coc.nvim] elixir client: couldn't create connection to server.
```
[[Erlang]]のバージョンは25.3.2.4。
```console
$ scoop list erlang
Installed apps matching 'erlang':
Name Version Source Updated Info
---- ------- ------ ------- ----
erlang 25.3.2.4 main 2023-07-28 18:32:37
```
[[coc-elixir]]のバージョンは0.7.0。
## 原因
[[ElixirLS]]のコンパイル時に期待される[[Erlang]]のバージョンが異なるから。
[[ElixirLS]]を起動すると、[[Erlang]]のビルドバージョン25でコンパイルされるべきことが期待される。
```console
$ cd "C:\Users\syoum\AppData\Local\coc\extensions\node_modules\coc-elixir"
$ .\els-release\language_server
03:48:56.580 [error] beam\beam_load.c(551): Error loading function 'Elixir.ElixirLS.Utils.OutputDevice':child_spec/1: op put_tuple u x:
please re-compile this module with an Erlang/OTP 25 compiler
03:48:56.580 [error] Loading of c:/Users/syoum/AppData/Local/coc/extensions/node_modules/coc-elixir/els-release/elixir_ls_utils-0.7.0.ez/elixir_ls_utils-0.7.0/ebin/Elixir.ElixirLS.Utils.OutputDevice.beam failed: :badfile
** (UndefinedFunctionError) function ElixirLS.Utils.OutputDevice.get_opts/0 is undefined (module ElixirLS.Utils.OutputDevice is not available)
ElixirLS.Utils.OutputDevice.get_opts()
lib/wire_protocol.ex:33: ElixirLS.Utils.WireProtocol.intercept_output/2
lib/language_server/cli.ex:6: ElixirLS.LanguageServer.CLI.main/0
(stdlib 4.3.1.2) erl_eval.erl:744: :erl_eval.do_apply/7
(elixir 1.15.4) lib/code.ex:543: Code.validated_eval_string/3
```
これは、ローカルの[[Erlang]]がバージョン25だから。
## 解決方法
[[ElixirLS]]をローカルでビルドしなおす。
```console
$ cd ~
$ git clone https://github.com/elixir-lsp/elixir-ls.git .elixir-ls
...
$ cd .elixir-ls
$ mix deps.get && mix compile && mix elixir_ls.release -o release
==> language_server
* creating c:/Users/syoum/.mix/archives/hex-2.0.6
* Getting elixir_sense (https://github.com/elixir-lsp/elixir_sense.git - 3aea5e26d71d00c160033bd86451b11a69424b9d)
remote: Enumerating objects: 10935, done.
remote: Counting objects: 100% (2463/2463), done.
remote: Compressing objects: 100% (756/756), done.
remote: Total 10935 (delta 1791), reused 2156 (delta 1692), pack-reused 8472
* Getting erl2ex (https://github.com/dazuma/erl2ex.git)
remote: Enumerating objects: 1431, done.
remote: Total 1431 (delta 0), reused 0 (delta 0), pack-reused 1431
* Getting dialyxir_vendored (https://github.com/elixir-lsp/dialyxir.git - 7e908b4d760c7329046e0ee3076be9156cd784e1)
remote: Enumerating objects: 3198, done.
remote: Counting objects: 100% (386/386), done.
remote: Compressing objects: 100% (172/172), done.
remote: Total 3198 (delta 180), reused 362 (delta 176), pack-reused 2812
* Getting jason_v (https://github.com/elixir-lsp/jason.git - c81537e2a5e1acacb915cf339fe400357e3c2aaa)
remote: Enumerating objects: 1553, done.
remote: Counting objects: 100% (206/206), done.
remote: Compressing objects: 100% (96/96), done.
remote: Total 1553 (delta 136), reused 130 (delta 110), pack-reused 1347
* Getting path_glob_vendored (https://github.com/elixir-lsp/path_glob.git - origin/vendored)
remote: Enumerating objects: 395, done.
remote: Counting objects: 100% (395/395), done.
remote: Compressing objects: 100% (200/200), done.
remote: Total 395 (delta 179), reused 361 (delta 149), pack-reused 0
* Getting mix_task_archive_deps (https://github.com/elixir-lsp/mix_task_archive_deps.git)
remote: Enumerating objects: 265, done.
remote: Counting objects: 100% (57/57), done.
remote: Compressing objects: 100% (27/27), done.
remote: Total 265 (delta 20), reused 57 (delta 20), pack-reused 208
Resolving Hex dependencies...
Resolution completed in 0.019s
Unchanged:
benchee 1.1.0
deep_merge 1.0.0
erlex 0.2.6
nimble_parsec 1.1.0
patch 0.12.0
statistex 1.0.0
stream_data 0.5.0
* Getting stream_data (Hex package)
* Getting patch (Hex package)
* Getting benchee (Hex package)
* Getting deep_merge (Hex package)
* Getting statistex (Hex package)
* Getting nimble_parsec (Hex package)
* Getting erlex (Hex package)
==> stream_data
Compiling 3 files (.ex)
Generated stream_data app
==> deep_merge
Compiling 2 files (.ex)
Generated deep_merge app
==> jason_v
Compiling 10 files (.ex)
Generated jason_v app
==> nimble_parsec
Compiling 4 files (.ex)
Generated nimble_parsec app
==> path_glob_vendored
Compiling 2 files (.ex)
Generated path_glob_vendored app
==> mix_task_archive_deps
Compiling 5 files (.ex)
Generated mix_task_archive_deps app
==> statistex
Compiling 3 files (.ex)
Generated statistex app
==> elixir_sense
Compiling 56 files (.ex)
Generated elixir_sense app
==> patch
Compiling 41 files (.ex)
Generated patch app
==> erl2ex
Compiling 22 files (.ex)
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_forms.ex:265:16
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_expressions.ex:251:7
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_expressions.ex:258:7
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_expressions.ex:605:20
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_expressions.ex:610:20
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_expressions.ex:616:20
warning: atom ::: must be written between quotes, as in :"::", to avoid ambiguity
lib/erl2ex/convert/erl_expressions.ex:616:57
warning: :erl_syntax.comment_text/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/convert/ext_forms.ex:17: Erl2ex.Convert.ExtForms.conv_form/3
warning: :erl_syntax.arity_qualifier_argument/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:115: Erl2ex.Pipeline.ErlSyntax.on_arity_qualifier_list/3
warning: :erl_syntax.comment/1 is undefined (module :erl_syntax is not available or is yet to be defined)
Invalid call found at 2 locations:
lib/erl2ex/pipeline/inline_includes.ex:66: Erl2ex.Pipeline.InlineIncludes.do_include/5
lib/erl2ex/pipeline/inline_includes.ex:67: Erl2ex.Pipeline.InlineIncludes.do_include/5
warning: :erl_syntax.arity_qualifier_body/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:114: Erl2ex.Pipeline.ErlSyntax.on_arity_qualifier_list/3
warning: :erl_syntax.atom_value/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:55: Erl2ex.Pipeline.ErlSyntax.on_atom/3
warning: :erl_syntax.attribute_arguments/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:158: Erl2ex.Pipeline.ErlSyntax.on_attribute/3
warning: :erl_syntax.function_arity/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/analyze.ex:148: Erl2ex.Pipeline.Analyze.handle_form_for_funcs/2
warning: :erl_syntax.attribute_name/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:157: Erl2ex.Pipeline.ErlSyntax.on_attribute/3
warning: :erl_syntax.function_name/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/analyze.ex:149: Erl2ex.Pipeline.Analyze.handle_form_for_funcs/2
warning: :erl_syntax.integer_value/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:79: Erl2ex.Pipeline.ErlSyntax.on_integer/3
warning: :erl_syntax.is_list_skeleton/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:30: Erl2ex.Pipeline.ErlSyntax.on_list_skeleton/3
warning: :erl_syntax.list_elements/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:31: Erl2ex.Pipeline.ErlSyntax.on_list_skeleton/3
warning: :erl_syntax.string_value/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:89: Erl2ex.Pipeline.ErlSyntax.on_string/3
warning: :erl_syntax.tuple_elements/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:100: Erl2ex.Pipeline.ErlSyntax.on_tuple/3
warning: :erl_syntax.tuple_size/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/erl_syntax.ex:100: Erl2ex.Pipeline.ErlSyntax.on_tuple/3
warning: :erl_syntax.type/1 is undefined (module :erl_syntax is not available or is yet to be defined)
Invalid call found at 2 locations:
lib/erl2ex/pipeline/erl_syntax.ex:42: Erl2ex.Pipeline.ErlSyntax.on_type/4
lib/erl2ex/pipeline/erl_syntax.ex:156: Erl2ex.Pipeline.ErlSyntax.on_attribute/3
warning: :erl_syntax.type/1 is undefined (module :erl_syntax is not available or is yet to be defined)
lib/erl2ex/pipeline/convert.ex:60: Erl2ex.Pipeline.Convert.conv_form/2
warning: Macro.to_string/2 is deprecated. Use Macro.to_string/1 instead
lib/erl2ex/pipeline/codegen.ex:505: Erl2ex.Pipeline.Codegen.expr_to_string/1
warning: :epp_dodger.parse/1 is undefined (module :epp_dodger is not available or is yet to be defined)
lib/erl2ex/pipeline/parse.ex:207: Erl2ex.Pipeline.Parse.parse_ext_forms/2
warning: :erl_comment_scan.string/1 is undefined (module :erl_comment_scan is not available or is yet to be defined)
lib/erl2ex/pipeline/parse.ex:202: Erl2ex.Pipeline.Parse.parse_ext_forms/2
Generated erl2ex app
==> erlex
Compiling 1 file (.yrl)
src/parser.yrl: Warning: conflicts: 27 shift/reduce, 0 reduce/reduce
Compiling 1 file (.xrl)
Compiling 2 files (.erl)
Compiling 1 file (.ex)
Generated erlex app
==> dialyxir_vendored
Compiling 64 files (.ex)
Generated dialyxir_vendored app
==> benchee
Compiling 44 files (.ex)
Generated benchee app
==> elixir_ls_utils
Compiling 8 files (.ex)
Generated elixir_ls_utils app
==> elixir_ls_debugger
Compiling 13 files (.ex)
Generated elixir_ls_debugger app
==> language_server
Compiling 235 files (.ex)
warning: Macro.to_string/2 is deprecated. Use Macro.to_string/1 instead
Invalid call found at 2 locations:
lib/language_server/providers/execute_command/manipulate_pipes/ast.ex:75: ElixirLS.LanguageServer.Providers.ExecuteCommand.ManipulatePipes.AST.ast_to_string/1
lib/language_server/providers/execute_command/manipulate_pipes/ast.ex:149: ElixirLS.LanguageServer.Providers.ExecuteCommand.ManipulatePipes.AST.interpolate/4
warning: :dialyzer_cplt.from_file/1 is undefined (module :dialyzer_cplt is not available or is yet to be defined)
Invalid call found at 2 locations:
lib/language_server/dialyzer/manifest.ex:134: ElixirLS.LanguageServer.Dialyzer.Manifest.load_elixir_plt/0
lib/language_server/dialyzer/manifest.ex:187: ElixirLS.LanguageServer.Dialyzer.Manifest.build_elixir_plt/0
Generated language_server app
warning: This task is deprecated. Consider switching to release2
(elixir_ls_utils 0.15.1) lib/mix.tasks.elixir_ls.release.ex:9: Mix.Tasks.ElixirLs.Release.run/1
(mix 1.15.4) lib/mix/task.ex:447: anonymous fn/3 in Mix.Task.run_task/5
(mix 1.15.4) lib/mix/cli.ex:92: Mix.CLI.run_task/2
c:/Users/syoum/scoop/apps/elixir/current/bin/mix:2: (file)
(elixir 1.15.4) src/elixir_compiler.erl:67: :elixir_compiler.dispatch/4
(elixir 1.15.4) src/elixir_compiler.erl:52: :elixir_compiler.compile/3
==> language_server
warning: :dialyzer_cplt.from_file/1 is undefined (module :dialyzer_cplt is not available or is yet to be defined)
lib/language_server/dialyzer/manifest.ex:134
warning: :dialyzer_cplt.from_file/1 is undefined (module :dialyzer_cplt is not available or is yet to be defined)
lib/language_server/dialyzer/manifest.ex:187
warning: Macro.to_string/2 is deprecated. Use Macro.to_string/1 instead
lib/language_server/providers/execute_command/manipulate_pipes/ast.ex:75
warning: Macro.to_string/2 is deprecated. Use Macro.to_string/1 instead
lib/language_server/providers/execute_command/manipulate_pipes/ast.ex:149
Generated archive "c:/Users/syoum/.elixir-ls/release/deep_merge-1.0.0.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/jason_v-1.4.0.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/path_glob_vendored-0.1.1.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/statistex-1.0.0.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/elixir_sense-2.0.0.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/erl2ex-0.0.10.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/erlex-0.2.6.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/elixir_ls_utils-0.15.1.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/elixir_ls_debugger-0.15.1.ez" with MIX_ENV=dev
Generated archive "c:/Users/syoum/.elixir-ls/release/language_server-0.15.1.ez" with MIX_ENV=dev
```
[[coc-settings.json]]で[[ElixirLS]]のパスを指定する。
```json
// Windowsでなければ language_server.sh を指定する
{
"elixir.pathToElixirLS": "~/.elixir-ls/release/language_server.bat"
}
```
[[Neovim]]で[[Elixir]]のファイルを開けば認識するはず。
## 参考
- [elixir\-lsp/coc\-elixir: Elixir language server extension based on elixir\-ls for coc\.nvim](https://github.com/elixir-lsp/coc-elixir#server-fails-to-start)