第69章 Zed Elixir 扩展支持介绍:语言服务器与模板语法
通过 Elixir 扩展 可获得 Elixir 语言支持。
- Tree-sitter 语法解析器:
- 语言服务器:
- 调试适配器:ElixirLS
此外,该扩展还支持 EEx(嵌入式 Elixir)模板和 HEEx 模板。HEEx 是 HTML 和 EEx 的混合体,常用于 Phoenix LiveView 应用。
语言服务器
Elixir 扩展为 ElixirLS、Expert、Dexter、Next LS 和 Lexical 提供语言服务器支持。默认情况下仅启用 ElixirLS。你可以通过设置({#kb zed::OpenSettings})中 Languages > Elixir/EEx/HEEx 路径下的选项来更改或禁用启用的语言服务器,也可以直接在设置文件中修改。
该扩展会尝试在 $PATH 中查找并使用已启用语言服务器的本地二进制文件。如果未找到,则会自动为你安装这些依赖。
或者,你也可以在设置文件中通过 lsp.{language-server-id}.binary.path 和 lsp.{language-server-id}.binary.arguments 分别指定自定义二进制文件的路径和参数;请注意,某些语言服务器需要特定参数才能正常工作。如需了解详细信息,请阅读下文关于你希望使用的自定义二进制文件对应语言服务器的说明。
部分语言服务器还支持初始化或工作区配置选项。下文将概述各服务器支持的配置项。这些配置可通过设置文件中的 lsp.{language-server-id}.initialization_options 和 lsp.{language-server-id}.settings 分别传入。
如需了解如何编辑设置文件,请查阅 配置 Zed 指南。
使用 ElixirLS
ElixirLS 支持接收工作区配置选项。
以下示例展示了如何禁用 Dialyzer:
"lsp": {
"elixir-ls": {
"settings": {
"dialyzerEnabled": false
}
}
}
有关所有可用选项,请参阅 ElixirLS 配置选项 官方列表。
使用 Expert
Expert 是 Elixir 的官方语言服务器。它整合了 ElixirLS、Next LS 和 Lexical 的功能。支持的特性包括:跳转定义、查找引用、悬停文档、自动补全、代码操作、编译器诊断以及保存时格式化。
通过在设置文件中添加以下内容来启用 Expert:
"languages": {
"Elixir": {
"language_servers": ["expert", "!elixir-ls", "!dexter", "!next-ls", "!lexical", "..."]
},
"EEx": {
"language_servers": ["expert", "!elixir-ls", "!dexter", "!next-ls", "!lexical", "..."]
},
"HEEx": {
"language_servers": ["expert", "!elixir-ls", "!dexter", "!next-ls", "!lexical", "..."]
}
}
Expert 支持接收工作区配置选项。
以下示例设置了项目符号搜索返回结果所需的最小字符数:
"lsp": {
"expert": {
"settings": {
"workspaceSymbols": {
"minQueryLength": 0
}
}
}
}
所有可用选项请参阅 Expert 配置页面。
要使用自定义的 Expert 二进制文件,在设置文件中加入以下内容:
"lsp": {
"expert": {
"binary": {
"path": "/path/to/expert",
"arguments": ["--stdio"]
}
}
}
使用 Dexter
Dexter 是一个快速、功能完备的 Elixir 语言服务器,专为大型代码库优化。它直接解析源码文件,无需编译。支持的功能包括:跳转到定义、查找引用、悬停文档、自动补全、重命名以及保存时格式化。
在设置文件中加入以下内容即可启用 Dexter:
"languages": {
"Elixir": {
"language_servers": ["dexter", "!expert", "!elixir-ls", "!next-ls", "!lexical", "..."]
},
"EEx": {
"language_servers": ["dexter", "!expert", "!elixir-ls", "!next-ls", "!lexical", "..."]
},
"HEEx": {
"language_servers": ["dexter", "!expert", "!elixir-ls", "!next-ls", "!lexical", "..."]
}
}
Dexter 可以接受初始化选项。
下面的示例会禁用跟踪 defdelegate 到目标函数:
"lsp": {
"dexter": {
"initialization_options": {
"followDelegates": false
}
}
}
所有可用选项请参阅官方的 Dexter 初始化设置列表。
要使用自定义的 Dexter 二进制文件,在设置文件中加入以下内容:
使用 Next LS
在设置文件中添加以下配置即可启用 Next LS:
"languages": {
"Elixir": {
"language_servers": ["next-ls", "!expert", "!elixir-ls", "!dexter", "!lexical", "..."]
},
"EEx": {
"language_servers": ["next-ls", "!expert", "!elixir-ls", "!dexter", "!lexical", "..."]
},
"HEEx": {
"language_servers": ["next-ls", "!expert", "!elixir-ls", "!dexter", "!lexical", "..."]
}
}
Next LS 支持初始化选项。
代码补全属于 Next LS 的实验性功能,在 Zed 中默认开启。若需禁用,请在设置文件中添加以下配置:
"lsp": {
"next-ls": {
"initialization_options": {
"experimental": {
"completions": {
"enable": false
}
}
}
}
}
Next LS 还集成了 Credo 扩展,默认处于启用状态。若需禁用,请在设置文件中添加以下部分:
"lsp": {
"next-ls": {
"initialization_options": {
"extensions": {
"credo": {
"enable": false
}
}
}
}
}
Next LS 还支持直接向 Credo 传递 CLI 选项。以下示例传递了 --min-priority high 参数:
"lsp": {
"next-ls": {
"initialization_options": {
"extensions": {
"credo": {
"cli_options": ["--min-priority high"]
}
}
}
}
}
有关更多 CLI 选项,请参阅 Credo 命令行开关 页面。
若要使用自定义的 Next LS 二进制文件,请在设置文件中添加以下内容:
"lsp": {
"next-ls": {
"binary": {
"path": "/path/to/next-ls",
"arguments": ["--stdio"]
}
}
}
使用 Lexical
在设置文件中添加以下内容以启用 Lexical:
"languages": {
"Elixir": {
"language_servers": ["lexical", "!expert", "!elixir-ls", "!dexter", "!next-ls", "..."]
},
"EEx": {
"language_servers": ["lexical", "!expert", "!elixir-ls", "!dexter", "!next-ls", "..."]
},
"HEEx": {
"language_servers": ["lexical", "!expert", "!elixir-ls", "!dexter", "!next-ls", "..."]
}
}
不通过语言服务器进行格式化
如果你希望在不使用语言服务器的情况下工作,但仍希望获得来自 Mix 的代码格式化功能,可以将其配置为外部格式化器,只需在设置文件中添加以下内容:
"languages": {
"Elixir": {
"enable_language_server": false,
"format_on_save": "on",
"formatter": {
"external": {
"command": "mix",
"arguments": ["format", "--stdin-filename", "{buffer_path}", "-"]
}
}
},
"EEx": {
"enable_language_server": false,
"format_on_save": "on",
"formatter": {
"external": {
"command": "mix",
"arguments": ["format", "--stdin-filename", "{buffer_path}", "-"]
}
}
},
"HEEx": {
"enable_language_server": false,
"format_on_save": "on",
"formatter": {
"external": {
"command": "mix",
"arguments": ["format", "--stdin-filename", "{buffer_path}", "-"]
}
}
}
}
调试
Elixir 扩展还通过 ElixirLS 提供了调试适配器。与语言服务器一样,扩展会尝试在 $PATH 中查找并使用本地的二进制文件,如果找不到,则回退为自动安装。
你也可以使用自己的二进制文件,只需在设置文件中分别通过 dap.ElixirLS.binary 和 dap.ElixirLS.args 指定路径和参数。
关于 Zed 中调试功能的更多细节,请参阅 Debugger 文档。
使用 ElixirLS
下面的示例可以调试项目的测试文件:
[
{
"label": "Debug tests",
"adapter": "ElixirLS",
"request": "launch",
"projectDir": "$ZED_WORKTREE_ROOT",
"task": "test",
"taskArgs": ["--trace"],
"requireFiles": ["test/**/test_helper.exs", "test/**/*_test.exs"]
}
]
以下示例可以帮你调试 Phoenix 服务器:
[
{
"label": "Debug Phoenix server",
"adapter": "ElixirLS",
"request": "launch",
"projectDir": "$ZED_WORKTREE_ROOT",
"task": "phx.server",
"debugAutoInterpretAllModules": false,
"debugInterpretModulesPatterns": ["MyApp*", "MyAppWeb*"],
"exitAfterTaskReturns": false
}
]
更多详情见ElixirLS 官方文档。
在 HEEx 模板中使用 Tailwind CSS Language Server
要在 HEEx 模板中启用 Tailwind CSS language server 的全部功能(自动补全、Lint、悬停文档),请在设置文件中添加以下配置:
"lsp": {
"tailwindcss-language-server": {
"settings": {
"includeLanguages": {
"elixir": "html",
"heex": "html"
},
"experimental": {
"classRegex": ["class=\"([^\"]*)\"", "class='([^']*)'"]
}
}
}
}
设置以上配置后,你就能在 HEEx 模板中获取 Tailwind CSS 类名的补全。例如:
<%!-- 标准 class 属性 --%>
<div class="flex items-center <completion here>">
<p class="text-lg font-bold <completion here>">Hello World</p>
</div>
<%!-- 带 Elixir 表达式 --%>
<div class={"flex #{@custom_class} <completion here>"}>
Content
</div>
<%!-- 带 Phoenix 函数 --%>
<div class={class_list(["flex", "items-center", "<completion here>"])}>
Content
</div>