You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Neovim集成ElixirLS仅单个Phoenix项目可用,求助排查原因

问题:ElixirLS仅在单个Phoenix项目中正常工作,跨Neovim实例失效

我使用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

排查步骤

  1. 手动初始化ElixirLS环境
    进入项目B根目录,执行mix deps.get确保依赖已拉取,再手动运行elixir-ls启动语言服务器,观察是否有报错,强制生成.elixir_ls/build目录。

  2. 确认Neovim工作目录
    启动项目B的Neovim时,必须从项目根目录打开(如nvim .或先进入根目录再启动),ElixirLS依赖mix.exs识别项目结构,工作目录错误会导致缓存生成失败。

  3. 清理ElixirLS缓存
    删除项目B的.elixir_ls目录,重新启动Neovim打开项目文件,让ElixirLS重新初始化缓存。

  4. 调整格式化异步设置
    将vim.lsp.buf.format({ async = false })改为async = true,或取消自动格式化,手动执行vim.lsp.buf.format()测试是否能正常格式化,排查同步格式化导致的请求ID冲突问题。

  5. 检查ElixirLS进程隔离
    用ps aux | grep elixir-ls查看进程,确认每个Neovim实例对应独立的ElixirLS进程,避免进程冲突。

内容的提问来源于stack exchange,提问作者Jan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 16:35:12