ElixirLS 失效主因是本地 Erlang/Elixir 未就位或 VSCode 启动上下文错误:需在内置终端验证 elixir --version(≥1.14)、erl -version(≥25.0)、which elixir/erl 有路径;项目根须含 mix.exs 且已执行 mix deps.get;调试须用 type: "mix_task" 配置;仅保留 pguyot.erlang 和 elixir-lsp.elixir-ls 扩展并重启 VSCode。

装完 ElixirLS 插件却没反应、跳转失效、断点不命中——八成不是插件问题,而是本地 Erlang/Elixir 没真正就位,或 VSCode 没在正确上下文中启动语言服务。
elixir --version 和 erl -version 必须在 VSCode 集成终端里能跑通
VSCode 不继承你 shell 的 PATH 就是常见死因。别只在系统终端验证,必须打开 VSCode 内置终端(Ctrl+`),执行:
-
elixir --version→ 要输出 ≥1.14 的版本号 -
erl -version→ 要输出 ≥25.0 的 OTP 版本 -
which elixir和which erl→ 两者都得返回真实路径,不能是command not found
Mac 用户用 asdf 时,检查 asdf current erlang 和 asdf current elixir 是否匹配预期;Windows 用户注意 PowerShell/Git Bash 下的路径是否包含 erl.exe 和 mix.bat 所在目录。
项目根目录必须有 mix.exs,且已成功执行过 mix deps.get
ElixirLS 不是全局生效的编辑器功能,它只在检测到 mix.exs 的文件夹里才拉起完整语言服务器。常见失效场景:
- 用 VSCode 打开的是
lib/子目录,上层没有mix.exs→ 补全、跳转、hover 全部降级 -
mix.exs存在,但没跑过mix deps.get→ ElixirLS 卡在 “Starting ElixirLS…”,去Output → ElixirLS面板看第一行错误,大概率是依赖缺失或config/config.exs语法错 - Umbrella 项目必须打开顶层根目录(含顶层
mix.exs),不是某个子应用目录
Phoenix 项目同理:mix phx.new my_app 后,直接 code . 进入该目录,别手动建空文件夹再补 mix.exs —— 缺 .formatter.exs 或 config/ 结构会导致格式化按钮灰掉。
launch.json 调试配置必须用 type: "mix_task",且 task 字段要合法
Elixir 没有“单文件调试”概念,所有调试入口都必须是 Mix 任务。以下配置是有效起点:
{
"version": "0.2.0",
"configurations": [
{
"type": "mix_task",
"request": "launch",
"name": "phx.server",
"task": "phx.server",
"taskArgs": [],
"projectDir": "${workspaceFolder}"
}
]
}
关键点:
-
type必须是"mix_task",不是"elixir-ls"或"erlang" -
task值必须是真实存在的 Mix 任务(如"test"、"run"、"phx.server"),拼错或未定义会静默失败 - 断点只在
lib/和test/下生效;config/或priv/里设断点无效 - 若调试时
Node.self()返回:nonode@nohost,说明当前是单节点无名模式——这是 mix_task 的默认行为,符合预期;需要分布式调试请换用erlang类型配置
别同时启用 elixir-lsp.elixir-ls 和 erlang-ls 或旧版 vs-elixir
冲突扩展会直接导致跳转失效、hover 不出类型、甚至语言服务器反复崩溃。只保留这两个:
- Erlang 支持:扩展 ID
pguyot.erlang(图标是黄色齿轮) - Elixir 支持:扩展 ID
elixir-lsp.elixir-ls(GitHub 仓库为elixir-lsp/elixir-ls,作者 Jake Beacher)
装完必须重启 VSCode;首次打开 .ex 文件时若弹出“允许运行未签名的扩展”,务必点“允许”,否则进程被拦截,状态栏显示 ElixirLS: not connected。
最常被忽略的其实是 mix.exs 的存在时机和 mix deps.get 的执行状态——它们不是“装完插件后自动生效”的前提,而是每次打开项目前必须人工确认的硬性条件。


















