Neovim集成ElixirLS仅单个Phoenix项目可用,求助排查原因
我使用Neovim搭配ElixirLS,现有两个结构相近的Phoenix项目,但只有其中一个能正常使用ElixirLS。单独启动Neovim打开项目B时,保存文件会报错且无法格式化;但在打开项目A的同一Neovim实例中打开项目B的文件,ElixirLS又能正常工作。
我的nvim-lspconfig配置
return { "neovim/nvim-lspconfig", config = function() local lspconfig = require("lspconfig") lspconfig.elixirls.setup({ cmd = { "elixir-ls" }, on_attach = function(client, buffer) vim.api.nvim_create_autocmd("BufWritePre", { buffer = buffer, callback = function() vim.lsp.buf.format({ async = false }) end }) end, elixirLS = { dialyzerEnabled = false, fetchDeps = false } }) end }
日志与错误信息
打开项目A的Elixir文件时,~/.local/state/nvim/lsp.log显示ElixirLS安装完成;打开项目B文件时日志也显示安装完成,但保存项目B文件时出现以下错误:
[ERROR][2025-07-17 16:29:16] ...m/lsp/client.lua:619 "LSP[elixirls]" "Cannot find request with id 2 whilst attempting to cancel"
项目与环境信息
- 项目差异:项目A的
.elixir_ls目录包含build文件夹,项目B的该目录为空 - 两个项目使用相同的Erlang/Elixir版本:
$ cat .tool-versions erlang 27.3 elixir 1.18.3-otp-27
- Neovim版本:
$ nvim --version NVIM v0.11.2 Build type: Release LuaJIT 2.1.1741730670 Run "nvim -V1 -v" for more info
排查步骤
手动初始化ElixirLS环境
进入项目B根目录,执行mix deps.get确保依赖已拉取,再手动运行elixir-ls启动语言服务器,观察是否有报错,强制生成.elixir_ls/build目录。确认Neovim工作目录
启动项目B的Neovim时,必须从项目根目录打开(如nvim .或先进入根目录再启动),ElixirLS依赖mix.exs识别项目结构,工作目录错误会导致缓存生成失败。清理ElixirLS缓存
删除项目B的.elixir_ls目录,重新启动Neovim打开项目文件,让ElixirLS重新初始化缓存。调整格式化异步设置
将vim.lsp.buf.format({ async = false })改为async = true,或取消自动格式化,手动执行vim.lsp.buf.format()测试是否能正常格式化,排查同步格式化导致的请求ID冲突问题。检查ElixirLS进程隔离
用ps aux | grep elixir-ls查看进程,确认每个Neovim实例对应独立的ElixirLS进程,避免进程冲突。
内容的提问来源于stack exchange,提问作者Jan

