第5章 在 Zed 中编辑代码
Zed 提供了多种工具,帮助你更高效地编写和修改代码。本节将介绍与你使用的 language server 协同工作的核心编辑功能。
本节内容
- 代码补全 — 来自 language server 的自动补全以及由 AI 驱动的编辑预测
- 代码片段(Snippets) — 插入包含标签停靠点(tab stops)的可复用代码模板
- 格式化与 Linting — 配置自动代码格式化及 linter 集成
- 诊断与快速修复 — 查看错误、警告,并应用 language server 提供的修复建议
- 多缓冲区(Multibuffers) — 使用多光标同时编辑多个文件
功能协同方式
在编辑代码时,Zed 会结合来自多个来源的信息:
- Language server 根据项目的类型和结构提供补全、诊断和快速修复
- 编辑预测 在你输入时建议多字符或多行变更
- 多缓冲区 允许你在一次操作中跨文件应用更改
例如,你可以:
- 使用 language server 的重构功能重命名函数
- 在多缓冲区中查看结果,其中会显示所有受影响的文件
- 利用多光标在所有位置进行额外的编辑
- 如果代码出现错误,立即获得诊断反馈
相关功能
代码补全 - Zed
Zed 支持两种补全来源:
- 由语言服务器(LSP)提供的“代码补全”。这些服务器由 Zed 自动安装或通过 Zed 语言扩展 集成。
- 由 Zed 自研的 Zeta 模型或外部提供商(如 GitHub Copilot)提供的“编辑预测”。
语言服务器代码补全
当有合适的语言服务器可用时,Zed 会提供当前文件中变量名、函数及其他符号的补全建议。你可以将以下内容添加到 Zed 的 settings.json 文件中来禁用此功能:
"show_completions_on_input": false
你可以通过按下 ctrl-space 或在命令面板中触发 editor::ShowCompletions 操作来手动触发补全。
注意:在 Zed 中使用
ctrl-space需要禁用 macOS 的全局快捷键。请打开 系统设置 > 键盘 > 键盘快捷键 > 输入源,然后取消勾选 选择上一个输入源。
更多信息,请参见:
编辑预测
Zed 内置支持通过 Zeta 一次性预测多处编辑,Zeta 是 Zed 的开源且基于开放数据训练的模型。
随着你的输入,编辑预测会自动出现,大多数情况下,你可以按 tab 键接受它们。
有关如何设置和配置 Zed 编辑预测的更多信息,请参阅编辑预测文档。
代码片段 - Zed
使用 {#action snippets::ConfigureSnippets} 操作可以新建或编辑指定作用域的代码片段文件。
代码片段存放在 ~/.config/zed/snippets 目录下,你可以通过 {#action snippets::OpenFolder} 操作直接打开该目录。
配置示例
{
// 每个片段必须有 name 和 body,prefix 和 description 可选。
// prefix 用于触发片段,省略时则使用 name。
// 使用 $1、$2 或 ${1:defaultValue} 这样的占位符来定义 Tab 停靠点。
// $0 决定光标的最终位置。
// 值相同的占位符会相互联动。
// 如果片段中在占位符之外使用了 $ 符号,必须用两个斜杠转义(如 \\$var)。
"Log to console": {
"prefix": "log",
"body": ["console.info(\"Hello, ${1:World}!\")", "$0"],
"description": "Logs to console"
}
}
作用域
作用域由语言名的小写形式决定,例如 Python 对应 python.json,Shell Script 对应 shell script.json,但也有以下例外:
| 作用域 | 文件名 |
|---|---|
| Global | snippets.json |
| JSX | javascript.json |
| Plain Text | plaintext.json |
JSX 的代码片段需要写在 javascript.json 而不是 jsx.json 中;TSX 和 TypeScript 则遵循上述通用规则。
文件名中会移除路径分隔符(/ 和 \),因此名为 PL/X 的语言对应 plx.json。
已知限制
- 传入多个 prefix 时,只有第一个会生效。
- 目前仅支持
json格式的片段文件。
诊断 - Zed 中的错误与警告
Zed 的诊断信息来自语言服务器,同时支持 LSP 的 push 和 pull 两种模式,因此兼容所有现有的语言服务器。
常规诊断
默认情况下,Zed 会在编辑器和滚动条中以带下划线的文本形式显示所有诊断信息。
编辑器诊断信息可通过
"diagnostics_max_severity": null
编辑器设置进行过滤(可选值:"off"、"error"、"warning"、"info"、"hint" 以及 null(默认,显示所有诊断))。
滚动条上的诊断显示由
"scrollbar": {
"diagnostics": "all",
}
配置项控制(可选值:"none"、"error"、"warning"、"information" 以及 "all"(默认))。
将鼠标悬停在诊断信息上,可显示包含完整渲染诊断消息的提示框。
此外,可以使用 editor::GoToDiagnostic 和 editor::GoToPreviousDiagnostic 在编辑器中的诊断之间导航,并针对当前选中的诊断显示弹出框。
内联诊断(错误透镜)
Zed 支持以透镜形式在代码右侧显示诊断信息。 此功能默认禁用,但可以通过编辑器菜单临时开启(或关闭),或者通过
"diagnostics": {
"inline": {
"enabled": true,
"max_severity": null, // 与编辑器设置中的 `diagnostics_max_severity` 取值相同
}
}
进行永久配置。
其他 UI 位置
项目面板
项目面板可以根据文件中的诊断严重程度对条目进行着色。
请通过以下方式进行配置:
"project_panel": {
"show_diagnostics": "all",
}
配置项(可选值:"off"、"errors" 以及 "all"(默认))。
编辑器标签页
类似项目面板,编辑器标签页也可以通过
"tabs": {
"show_diagnostics": "off",
}
配置项进行着色(可选值:"off"(默认)、"errors" 以及 "all")。
多缓冲区 - 在 Zed 中同时编辑多个文件
Zed 的一项强大能力是允许你同时编辑多个文件。结合多光标功能,可以显著提升大规模重构的效率。
在多缓冲区中编辑
编辑多缓冲区与普通文件无异。所做的更改会同步到编辑器中该文件的其他打开副本,你可以使用 {#action workspace::Save}(在 macOS 上绑定 cmd-s,在 Windows/Linux 上绑定 ctrl-s,在 Vim 模式下为 :w)保存所有文件。
在多缓冲区中,使用多光标同时编辑所有文件通常非常有用。若要编辑几个特定实例,可以用鼠标选择它们(macOS 上是 option-click,Windows/Linux 上是 alt-click),也可以用键盘操作。在 macOS 上按 cmd-d,在 Windows/Linux 上按 ctrl-d,或在 Vim 模式下输入 gl,即可选中光标下单词的下一个匹配项。
若要编辑所有匹配项,可以执行 {#action editor::SelectAllMatches} 命令来选择它们(macOS 上是 cmd-shift-l,Windows/Linux 上是 ctrl-shift-l,Vim 模式下是 g a)。
导航至源文件
虽然可以在多缓冲区中轻松编辑文件,但直接跳转到源文件往往更有益处。你可以点击摘录之间的任何分隔线,或者将光标放在摘录中并执行 {#action editor::OpenExcerpts} 命令来实现这一点。需要注意的是,如果正在使用多光标,该命令将打开源文件,并定位到多缓冲区中每个光标下的位置。
另外,如果你习惯用鼠标,想通过双击某个摘录来打开它,可以在设置中启用该功能:"double_click_in_multibuffer": "open"。
项目搜索
运行 {#action pane::DeploySearch} 命令即可开始搜索(macOS 上是 cmd-shift-f,Windows/Linux 上是 ctrl-shift-f,Vim 模式下是 g/)。搜索完成后,结果会显示在一个新的 multibuffer 中,整个项目里每一行匹配结果都会对应一个摘录。
诊断
如果安装了 language server,诊断面板可以显示整个项目中的所有错误。点击状态栏中的图标,或运行 {#action diagnostics::Deploy} 命令(macOS 上是 cmd-shift-m,Windows/Linux 上是 ctrl-shift-m,Vim 模式下是 :clist)即可打开。
查找引用
如果安装了 language server,可以通过 {#action editor::FindAllReferences} 命令查找光标所在符号的所有引用(macOS 上是 cmd-click,Windows/Linux 上是 ctrl-click,Vim 模式下是 g A)。
取决于所用的 language server,{#action editor::GoToDefinition} 和 {#action editor::GoToTypeDefinition} 等命令在存在多个可能的定义时,也会打开一个 multibuffer。