## 事象 [[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)