Zed 编辑器 HTML 语言支持配置指南:语言服务器、格式化与 Tailwind 补全集成
Zed 通过官方 HTML 扩展提供对 .html / .htm / .shtml 文件的完整语言支持,涵盖基于 Tree-sitter 的语法高亮与结构分析、基于 vscode-html-language-server 的智能补全/校验/格式化,以及可选接入 Prettier 与 Tailwind CSS 语言服务器的能力。本指南围绕该扩展在 Zed 中的配置方式展开,读完你将掌握:如何开关自动安装扩展、如何切换 Prettier 与 LSP 两种 HTML 格式化管线并细化其行为、如何让 Tailwind 类名补全在 HTML 属性中生效。
HTML 扩展的安装与语言支持架构
Zed 对 HTML 的语言支持由内置扩展仓库中的 HTML 扩展 提供,其能力由三层组成:
- 语法解析层:使用 Tree-sitter grammar(
tree-sitter/tree-sitter-html),在 extension.toml 中通过 commit 锁定具体版本; - 语言服务器层:接入微软
vscode-html-language-server(基于vscode-html-languageservice实现补全、诊断、跳转、格式化等 LSP 能力),见 extension.toml; - 语言配置层:在 config.toml 中声明文件关联、注释语法、括号自动闭合与 Prettier 解析器映射。
该扩展默认随 Zed 自动安装,这一点在 Zed 默认设置中直接体现:assets/settings/default.json 的 auto_install_extensions 字段将 "html" 置为 true。
若你希望使用自己维护的 HTML 扩展(例如本地安装的社区替代版本),可以在 settings.json 中显式禁用自动安装:
{
"auto_install_extensions": {
"html": false
}
}
文件关联与编辑体验的语言级定义
config.toml 定义了 HTML 作为 Zed 语言时的默认行为:
path_suffixes = ["html", "htm", "shtml"]:三种文件后缀自动以 HTML 语言打开;block_comment:以<!-- ... -->作为块注释,注释/取消注释(editor::ToggleComments)即使用它;brackets与autoclose_before = ">})":声明式编辑体验,输入{、(、<、"等会自动补全配对的闭合符号,输入>前会自动闭合;prettier_parser_name = "html":把该语言显式映射到 Prettier 的html解析器,这正是「默认用 Prettier 格式化 HTML」的底层依据。
语言服务器的自动获取机制
extensions/html/src/html.rs 揭示了语言服务器的真实拉起过程:Zed 不内置该服务器,而是优先使用环境变量 PATH 中已有的 vscode-html-language-server 可执行文件;若不存在,则通过 npm 安装 @zed-industries/vscode-langservers-extracted 包,并用内置 Node 以 --stdio 模式启动其中的服务器脚本(html.rs)。因此首次打开 HTML 文件时出现「下载语言服务器」的进度提示是正常现象。
值得注意的实现细节是:该扩展在初始化选项中主动声明了 {"provideFormatter": true}(html.rs),表示语言服务器本身具备格式化能力——这正是下文「LSP Formatting」配置选项存在的技术前提。而你在 settings.json 里写的 lsp.vscode-html-language-server.settings 会通过 language_server_workspace_configuration 原样转发给服务器进程(html.rs)。
格式化:Prettier 与 LSP 两套管线的选择
默认行为:Prettier 格式化
Zed 默认使用 Prettier 作为 HTML 的格式化工具,这是由 config.toml 中 prettier_parser_name = "html" 与全局默认 "formatter": "auto"(见 assets/settings/default.json)共同决定的。若你的项目根目录存在 Prettier 配置(.prettierrc、prettier.config.js 等)及依赖,Zed 会自动采用项目内版本。
关闭自动保存格式化
Zed 中 format_on_save 的默认值为 "off"(见 assets/settings/default.json)。若希望 HTML 文件保存时完全不做自动格式化,可在 Settings(zed::OpenSettings)中的 Languages > HTML 下配置,或直接写入 settings 文件:
"languages": {
"HTML": {
"format_on_save": "off",
}
}
关闭自动格式化后,你依然可以随时手动触发:执行 editor::Format 动作,或打开 command palette(command_palette::Toggle,详见 getting-started 一节)后选择 Format Document。
切换为 LSP 格式化
Zed 中 formatter 的可选值包括 "auto"、"language_server" 以及指定外部工具/代码操作的写法(见 assets/settings/default.json 注释)。由于 vscode-html-language-server 通过 provideFormatter 声明了格式化能力,你可以把 HTML 的格式化器显式切换为语言服务器:
"languages": {
"HTML": {
"formatter": "language_server",
}
}
这样一来,格式化的执行主体从 Prettier 变为语言服务器内置的 HTML 格式化器,二者对标签属性换行、内联内容缩进等细节的处理规则不同,可按团队规范取舍。
LSP 格式化选项详解
vscode-html-language-server 的格式化行为可通过 Zed 的 lsp 配置块逐项定制。以下是最常用的三个选项及其含义:
| 配置项 | 作用 | 默认值 |
|---|---|---|
format.indentInnerHtml |
是否在 <html>、<head> 内部进行缩进 |
false |
format.contentUnformatted |
逗号分隔的标签列表,这些标签内部的内容不做格式化 | pre,code,textarea |
format.extraLiners |
逗号分隔的标签列表,在这些标签之前额外插入一个空行 | head,body,/html |
将配置写入 settings 文件(写入后可在 Settings > LSP > vscode-html-language-server 下看到同样结构):
"lsp": {
"vscode-html-language-server": {
"settings": {
"html": {
"format": {
// 在 <html> 和 <head> 内部缩进(默认: false)
"indentInnerHtml": true,
// 禁止在 <svg> 或 <script> 内部进行格式化
"contentUnformatted": "svg,script",
// 在 <div> 和 <p> 之前额外加一个空行
"extraLiners": "div,p"
}
}
}
}
}
按上面示例配置后:HTML 顶层结构会被缩进得更清晰、<svg> 与 <script> 内手写的代码不会被重排,而连续的块级标签之间会自动出现分隔空行。settings 会被 html.rs 中实现的 language_server_workspace_configuration 原样下发,因此无需重启 Zed,改动随下一次格式化即时生效。
让 Tailwind CSS 语言服务器在 HTML 中提供类名补全
Tailwind CSS 的官方语言服务器默认需要知道「在哪些位置寻找类名」才能给出补全与错误提示。若你在 HTML 文件中已经能看到来自 tailwindcss-language-server 的补全但局限于模板内联样式以外的场景,可以通过 classRegex 把 HTML class 属性声明为类名扫描区域。
在 settings.json 中加入以下配置:
{
"lsp": {
"tailwindcss-language-server": {
"settings": {
"experimental": {
"classRegex": ["class=\"([^\"]*)\""]
}
}
}
}
}
其中正则 class=\"([^\"]*)\" 的含义是:匹配 class="...",并捕获双引号内被引号包裹的内容作为候选类名集合。配置生效后,在 HTML 的 class 属性中即可获得 Tailwind 工具类的实时补全,例如:
<div class="flex items-center <补全候选出现于此>">
<p class="text-lg font-bold <补全候选出现于此>">Hello World</p>
</div>
结合 contentUnformatted、缩进类规则与本项 classRegex,你可以在 Zed 中获得「HTML 结构格式化 + 模板中 Tailwind 智能提示」兼顾的开发体验。若项目中同时维护 JSX/TSX 与 HTML 模板,可在 classRegex 数组中追加针对框架语法的正则,使同一语言服务器覆盖多种文件形态。
相关语言参考
HTML 扩展往往与前端工具链中的其他语言协同工作,Zed 对应的语言支持文档如下,可对照配置:
核心配置与本指南相关的仓库文件一览:HTML 扩展元数据与语言服务器声明、HTML 语言行为配置、语言服务器启动与配置转发实现。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0625
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00