在 Zed 中运行与测试代码:终端、任务、调试器与 REPL 全流程指南
Zed 编辑器提供了"运行 — 测试 — 调试"的完整闭环能力:内置终端、可感知编辑器上下文的任务系统、基于 Debug Adapter Protocol(DAP)的调试器,以及基于 Jupyter kernel 的 REPL 交互执行。本篇指南围绕 Zed 文档中 Running & Testing 这一核心章节展开,结合仓库中的默认键位映射(default-macos.json、default-linux.json)与 crates/task、crates/terminal_view、crates/repl、crates/dap 等相关 crate,系统讲解在不离开编辑器的情况下完成构建、运行脚本、单测与交互式探索的实战方案。读完你即可上手配置属于自己的任务与调试场景,并理解其底层键位绑定和模块设计。
Zed 的"运行与测试"工具箱概览
Zed 将四类执行能力整合进编辑器,全部聚焦于"无需切换到外部终端/IDE"这一目标:
- 终端(Terminal):内置终端模拟器,支持多实例、自定义 Shell,且与编辑器深度集成。任务(Task)与普通命令都在这里输出结果。
- 任务(Tasks):以 Shell 命令为核心,可读取当前文件路径、选中文本、符号等编辑器上下文,用于构建、lint、运行脚本或任何可重复的工作流。
- 调试器(Debugger):基于 DAP 协议,支持断点、单步、变量检视,覆盖 C、C++、Go、JavaScript、Python、Rust、TypeScript 等语言。
- REPL:借助 Jupyter kernel 交互式运行代码,可对选中内容或
# %%Cell 执行并内联查看结果。
从源码结构看,Zed 将上述能力拆分为独立的 Rust crate:crates/terminal_view 负责终端视图与面板,crates/task 承载任务定义与解析,crates/repl 实现 REPL 会话,crates/dap 与 crates/debugger_ui 分别实现 DAP 客户端协议与调试 UI。四个模块通过工作区(Workspace)层协同,这也解释了为何任务结果会出现在终端面板、调试场景能复用任务定义。
推荐阅读路径
四个子主题在文档树中各有独立页面,互为补充:
- 终端完整指南 —— 开终端、配置 Shell、工作目录、外观与面板布局
- 任务完整指南 —— 任务模板、变量、钩子、Git 命令与 VS Code 任务兼容
- 调试器完整指南 —— 配置、断点、构建任务、适配器自定义
- REPL 完整指南 —— Kernel 安装、Cell 模式、各语言指令
快速上手(Quick Start)
以下是 Zed 官方文档给出的四条最常用入口,也是上手"运行与测试"的最短路径:
| 操作 | 快捷键(macOS) | 快捷键(Linux/Windows) | 说明 |
|---|---|---|---|
| 切换终端面板 | Ctrl+` |
Ctrl+` |
显示/隐藏底部终端面板 |
| 打开新终端 | Ctrl+~ |
Ctrl+~ |
新建一个终端标签页 |
| 打开任务选择器并执行命令 | Cmd+Shift+R |
Ctrl+Shift+R |
键入任意 Shell 命令即可运行 |
| 打开调试面板选择配置 | Cmd+Shift+D |
Ctrl+Shift+D |
或按 F4(debugger::Start)直接启动调试 |
| 在 REPL 中执行代码 | Ctrl+Shift+Enter |
Ctrl+Shift+Enter |
在 Python/TypeScript 等文件中选中代码后执行 |
这些快捷键可以在仓库的默认键位文件中得到验证,例如 macOS 下:
Ctrl+`→terminal_panel::Toggle(default-macos.json);Cmd+Shift+R→task::Spawn,Cmd+Alt+R→task::Rerun(default-macos.json);Cmd+Shift+D→debug_panel::ToggleFocus(default-macos.json);Ctrl+Shift+Enter→repl::Run(default-macos.json)。
Linux/Windows 的默认绑定与之对应,见 default-linux.json。也就是说,上表本质上是这些 action 的别名映射,熟悉 action 名后你可以按需自定义。
终端:从打开到深度集成
打开终端与两种布局
| 操作 | macOS | Linux/Windows |
|---|---|---|
| 切换终端面板 | Ctrl+` |
Ctrl+` |
| 打开新终端 | Ctrl+~ |
Ctrl+~ |
| 在中央打开终端 | 命令面板 | 命令面板 |
除了快捷键,也可以从命令面板搜索 terminal_panel::Toggle(切换面板)或 workspace::NewTerminal(新建终端)触发。
终端有两种打开位置,需根据场景选择:
- 终端面板(Terminal Panel):默认停靠在工作区底部,也可停靠左侧或右侧;用
Ctrl+`切换。 - 中央面板(Center Pane):作为普通标签页与代码文件并排打开,适合需要大屏观察输出的终端型应用(如
lazygit、htop)。通过命令面板中的workspace::NewCenterTerminal打开。
多终端管理
当焦点在终端面板中时:
Cmd+N(macOS)/Ctrl+N(Linux/Windows):新建终端,每个终端以标签页形式呈现在面板中;Cmd+D(macOS)/Ctrl+Shift+5(Linux/Windows):水平拆分终端。
自定义 Shell
默认情况下 Zed 使用系统默认 Shell(Unix 上取自 /etc/passwd)。如需切换到指定程序:
{
"terminal": {
"shell": {
"program": "/bin/zsh"
}
}
}
如需为 Shell 传参(例如登录 Shell 以读取 .bash_profile):
{
"terminal": {
"shell": {
"with_arguments": {
"program": "/bin/bash",
"args": ["--login"]
}
}
}
}
控制终端启动目录
terminal.working_directory 决定新终端从哪里启动:
| 取值 | 行为 |
|---|---|
"current_file_directory" |
当前文件所在目录;回退到项目目录,再回退到工作区首个项目 |
"current_project_directory" |
当前文件所属项目目录(默认值) |
"first_project_directory" |
工作区中第一个项目的目录 |
"always_home" |
总是从 home 目录启动 |
{ "always": { "directory": "~/projects" } } |
总是从指定目录启动 |
示例:
{
"terminal": {
"working_directory": "first_project_directory"
}
}
注入环境变量
terminal.env 可以为所有终端会话注入环境变量:
{
"terminal": {
"env": {
"EDITOR": "zed --wait",
"MY_VAR": "value"
}
}
}
提示:单个变量需要追加时用
:分隔多段值,例如"PATH": "/custom/path:$PATH"。
Python 虚拟环境自动激活
Zed 打开终端时会自动探测并激活 Python 虚拟环境,默认搜索 .env、env、.venv、venv 目录。可自定义目录与激活脚本类型:
{
"terminal": {
"detect_venv": {
"on": {
"directories": [".venv", "venv"],
"activate_script": "default"
}
}
}
}
activate_script 支持 "default"、"csh"、"fish"、"nushell"。若想完全关闭探测:
{
"terminal": {
"detect_venv": "off"
}
}
外观、滚动与更多面板配置
终端字体可与编辑器字体分离配置;光标、最小对比度、滚动行为均有独立设置项。此外,终端面板还支持以下高级能力(详见 terminal.md 对应小节):
- 复制粘贴:支持"选中即复制"(Copy on Select)与复制后保持选区;
- 搜索与 Vi 模式:终端内搜索历史输出,并支持 Vim 风格的移动键位;
- 清除终端 / Option-as-Meta:一键清屏,macOS 上可把
Option映射为 Meta 键; - 交替滚动与路径超链接:滚动性能优化,并将输出中的文件路径渲染为可点击链接;
- 面板配置:Dock 停靠位置、默认尺寸、工具栏按钮显隐;
- 与任务集成:任务本质上是"在终端里跑命令",终端会话复用 Shell 初始化文件;
- AI 辅助与发送文本:支持向终端发送文本与按键序列,可结合 AI 面板编排命令流。
任务系统:把编辑器上下文变成命令变量
Zed 的任务(Task)是其运行/测试体系的核心枢纽:它以终端为输出载体,却比普通 Shell 命令多出"编辑器上下文"这一维度。官方文档 tasks.md 是该子系统的权威说明。
一个最小任务模板
[
{
"label": "Example task",
"command": "for i in {1..5}; do echo \"Hello $i/5\"; sleep 1; done",
//"args": [],
// Env overrides for the command, will be appended to the terminal's environment from the settings.
"env": { "foo": "bar" },
// Current working directory to spawn the command into, defaults to current project root.
//"cwd": "/path/to/working/directory",
// Whether to use a new terminal tab or reuse the existing one to spawn the process, defaults to `false`.
"use_new_terminal": false,
// Whether to allow multiple instances of the same task to be run, or rather wait for the existing ones to finish, defaults to `false`.
"allow_concurrent_runs": false,
// What to do with the terminal pane and tab, after the command was started:
// * `always` — always show the task's pane, and focus the corresponding tab in it (default)
// * `no_focus` — always show the task's pane, add the task's tab in it, but don't focus it
// * `never` — do not alter focus, but still add/reuse the task's tab in its pane
"reveal": "always",
// What to do with the terminal pane and tab, after the command has finished:
// * `never` — Do nothing when the command finishes (default)
// * `always` — always hide the terminal tab, hide the pane also if it was the last tab in it
// * `on_success` — hide the terminal tab on task success only, otherwise behaves similar to `always`
"hide": "never",
// Which shell to use when running a task inside the terminal.
// May take 3 values:
// 1. (default) Use the system's default terminal configuration in /etc/passwd
// "shell": "system"
// 2. A program:
// "shell": { "program": "sh" }
// 3. A program with arguments:
// "shell": {
// "with_arguments": { "program": "/bin/bash", "args": ["--login"] }
// }
"shell": "system",
// Whether to show the task line in the output of the spawned task, defaults to `true`.
"show_summary": true,
// Whether to show the command line in the output of the spawned task, defaults to `true`.
"show_command": true,
// Which edited buffers to save before running the task:
// * `all` — save all edited buffers
// * `current` — save currently active buffer only
// * `none` — don't save any buffers
"save": "none"
// Represents the tags for inline runnable indicators, or spawning multiple tasks at once.
// "tags": []
}
]
需要重点理解的关键字段:
command+args:命令本体与参数数组。推荐把动态值放args,可避免路径空格导致的转义问题(见下文"变量引号")。use_new_terminal:每次运行是否新建终端标签(默认复用)。allow_concurrent_runs:是否允许同一任务并行多实例(默认false,即等待旧实例结束)。reveal/hide:控制任务启动后与结束后的终端面板表现。reveal取值always(默认,聚焦)/no_focus(显示不聚焦)/never(不改变焦点);hide取值never(默认)/always/on_success。shell:可覆盖任务所用 Shell(见下文 Shell 初始化)。save:运行前保存哪些编辑过的缓冲区:all/current/none。tags:绑定到内联 Runnable 指示器(例如rust-test),实现"点击行号旁的 ▶ 直接跑测试"。
任务定义在哪些位置
- 全局任务文件:
tasks.json(通常位于~/.config/zed/tasks.json),对所有 Zed 项目生效,可用zed::OpenTasksaction 编辑; - 项目级(worktree 级)任务文件:
.zed/tasks.json,仅对包含该 worktree 的项目生效,用zed::OpenProjectTasks编辑; - 临时(One-shot)任务:在任务面板直接键入命令,会话级存在,不跨会话持久化;
- 语言扩展提供的任务:由语言扩展声明。
从源码看,任务定义与解析集中在 crates/task crate:它负责解析 JSON 模板、展开变量、根据上下文过滤任务,并把展开后的命令交由终端会话执行,这也正是任务"结果出现在终端标签页里"的原因。
任务变量:读取编辑器上下文
任务的行为与 Shell 一致:可用 sh 风格的 $VAR_NAME 引用环境变量。在此基础上 Zed 预置了一批 ZED_* 变量,把"当前编辑状态"注入命令:
| 变量 | 含义与示例 |
|---|---|
ZED_COLUMN / ZED_ROW |
当前光标所在列 / 行 |
ZED_FILE |
当前打开文件的绝对路径,如 /Users/my-user/path/to/project/src/main.rs |
ZED_FILENAME |
当前文件名,如 main.rs |
ZED_DIRNAME |
当前文件所在目录(去掉文件名),如 /Users/my-user/path/to/project/src |
ZED_RELATIVE_FILE |
相对 ZED_WORKTREE_ROOT 的文件路径,如 src/main.rs |
ZED_RELATIVE_DIR |
相对 ZED_WORKTREE_ROOT 的文件目录,如 src |
ZED_STEM |
去掉扩展名的文件名,如 main |
ZED_SYMBOL |
当前选中的符号,与面包屑中最后显示的符号一致,如 mod tests > fn test_task_contexts |
ZED_SELECTED_TEXT |
当前选中文本 |
ZED_LANGUAGE |
当前缓冲区语言,如 Rust、Python、Shell Script |
ZED_WORKTREE_ROOT |
当前 worktree 根目录的绝对路径 |
ZED_MAIN_GIT_WORKTREE |
主 Git worktree 的工作目录;普通 checkout 下等于 ZED_WORKTREE_ROOT,链接 worktree 下指向原仓库目录 |
ZED_CUSTOM_RUST_PACKAGE |
(Rust 专属)$ZED_FILE 所在源码文件所属父 package 名 |
变量不仅可用于 command,也可用于 cwd、args 与 label 字段。使用示例:
{
"label": "echo current file's path",
"command": "echo $ZED_FILE"
}
支持带默认值的冗长语法:${ZED_FILE:default_value}。
变量引号:避免路径空格陷阱
路径中含空格等特殊字符时,务必正确转义。以下写法在路径含空格时会失败:
{
"label": "stat current file",
"command": "stat $ZED_FILE"
}
应改用参数数组:
{
"label": "stat current file",
"command": "stat",
"args": ["$ZED_FILE"]
}
或显式带引号:
{
"label": "stat current file",
"command": "stat \"$ZED_FILE\""
}
推荐优先使用 args 数组形式——Zed 负责把每个元素安全地交给 Shell,避免手工转义。
基于变量的任务过滤
任务列表中,若某任务引用了"当前不可用"的变量,该任务会被自动过滤。例如下面的任务只在存在文本选区时出现在任务面板:
{
"label": "selected text",
"command": "echo \"$ZED_SELECTED_TEXT\""
}
给变量设置默认值即可让任务始终显示:
{
"label": "selected text with default",
"command": "echo \"${ZED_SELECTED_TEXT:no text selected}\""
}
One-shot 任务与重跑控制
task::Spawn 打开的任务面板本身就是一个小型命令行:直接键入 bash 风格命令,按 opt-enter(macOS)/alt-enter(Linux/Windows)即可执行。这类临时命令在会话期间被保留,task::Rerun 会重跑最后一次生成的任务。在面板中按 tab 可把选中的现有任务命令"回填"到输入框,编辑后作为 one-shot 任务运行。
- 临时(Ephemeral)任务:生成任务时按住
cmd(macOS)/ctrl(Linux/Windows)修饰键,任务不会累计使用计数(因此不会被task::Rerun重跑、在面板中排名也不会提升),适合需要连续重跑的沉浸式循环。 - 重跑上下文控制:默认任务只解析一次变量并缓存为"已解析任务"反复重跑。若每次运行前都要重新求值上下文,可传入
reevaluate_context: true:
{
"context": "Workspace",
"bindings": {
"alt-t": ["task::Rerun", { "reevaluate_context": true }]
}
}
仓库默认键位中,Cmd+Alt+R 绑定 task::Rerun 且保持 reevaluate_context: false 的行为(default-macos.json)。
自定义任务的键位绑定
通过给 task::Spawn 增加参数即可把某任务绑定到自定义快捷键。例如把上述 echo current file's path 绑定到 alt-g:
{
"context": "Workspace",
"bindings": {
"alt-g": ["task::Spawn", { "task_name": "echo current file's path" }]
}
}
还可以通过 reveal_target 控制任务输出落在哪里。若要在中央区域启动交互式终端应用(如 lazygit):
// 在 tasks.json 中
{
"label": "start lazygit",
"command": "lazygit -p $ZED_WORKTREE_ROOT"
}
// 在 keymap.json 中
{
"context": "Workspace",
"bindings": {
"alt-g": [
"task::Spawn",
{ "task_name": "start lazygit", "reveal_target": "center" }
]
}
}
reveal_target 与上面模板字段的 reveal 语义相互补充,分别控制"目标位置"与"聚焦策略"。
Hooks:让任务响应 Zed 事件
任务模板可声明 hooks,当对应事件发生时自动解析并运行。目前支持:
create_worktree—— Zed 创建新的链接 Git worktree 后触发(无论是通过 CLI 还是从 worktree 选择器)。触发时ZED_WORKTREE_ROOT指向新 worktree,ZED_MAIN_GIT_WORKTREE指向原仓库工作目录,非常适合把未跟踪文件(如.env)拷入新 worktree,或执行每个 worktree 的初始化命令。
Hook 任务同样从全局与项目级 tasks.json 解析;多个任务可注册同一 hook,事件触发时全部运行。Hook 任务可正常使用 cwd、env、reveal、hide 等字段控制终端 UI 的可见程度:
[
{
"label": "copy .env into new worktree",
"command": "cp",
"args": ["$ZED_MAIN_GIT_WORKTREE/.env", "$ZED_WORKTREE_ROOT/.env"],
"hooks": ["create_worktree"],
"reveal": "no_focus",
"hide": "on_success"
}
]
声明了 hooks 的任务仍会出现在任务面板中,同一模板可手动复用。
Git Graph 自定义 Git 命令
Git Graph(提交图)支持从提交的右键菜单运行自定义 Git 命令任务。方式是在全局 tasks.json 中定义带 git-command 标签的任务(暂不支持项目级任务文件)。从某次提交的上下文菜单触发时,任务会基于该提交与仓库解析、默认在选中仓库根目录运行;右键 ref 标签(分支、远程 ref、标签)会额外通过 ZED_GIT_REF 注入被点击的 ref。
Git Graph 命令任务专属变量(仅此类任务解析时提供,其他变量如 ZED_FILE 等除非设了默认值否则不可用):
ZED_GIT_SHA:选中提交的完整 SHA;ZED_GIT_SHA_SHORT:选中提交的短 SHA;ZED_GIT_REPOSITORY_NAME:选中 Git 仓库名;ZED_GIT_REPOSITORY_PATH:选中仓库工作目录的绝对路径;ZED_GIT_REF:被点击 ref 的名称(仅从 ref 标签菜单触发时提供)。
示例:
[
{
"label": "Branches containing commit: $ZED_GIT_SHA_SHORT",
"command": "git",
"args": ["branch", "-a", "--contains", "$ZED_GIT_SHA"],
"tags": ["git-command"]
},
{
"label": "Check out $ZED_GIT_REF",
"command": "git",
"args": ["checkout", "$ZED_GIT_REF"],
"tags": ["git-command"]
}
]
兼容 VS Code 任务格式
从 .vscode/tasks.json 导入任务时可以省略 label,Zed 会根据类型自动生成:
- npm 任务:
npm: <script>(如npm: start); - gulp 任务:
gulp: <task>(如gulp: build); - shell 任务:直接使用
command字符串(如echo hello),命令为空时使用shell; - 无类型任务:
Untitled Task。
示例:
{
"version": "2.0.0",
"tasks": [
{
"type": "npm",
"script": "start"
},
{
"type": "shell",
"command": "cargo build --release"
}
]
}
导入后任务会以 npm: start、cargo build --release 形式出现在任务面板;提供显式 label 可覆盖自动生成的名称。
Runnable 标签与内联运行指示器
Zed 支持通过 tags 字段覆盖"内联可运行指示器"(代码行号旁的 ▶ 按钮)的默认行为。覆盖优先级为:
- 项目级
tasks.json - 全局
tasks.json - 语言提供的标签绑定(默认)
示例——把 rust-test runnable 绑定到自定义任务:
{
"label": "echo current file's path",
"command": "echo $ZED_FILE",
"tags": ["rust-test"]
}
绑定后可通过 Code Actions 快速运行:触发 editor::ToggleCodeActions(或 cmd-. / ctrl-.),该任务会排在列表第一位;若该行没有其他 Code Action,任务会直接运行。仓库中调试器相关的内联调试场景("从 gutter 自动创建调试场景")同样是复用这套标签绑定体系实现的。
直接运行 Bash 脚本
Zed 能自动识别 .sh / .bash 脚本为可运行项并加入任务面板:
command_palette::Toggle打开命令面板;- 搜索 "task" 选择 task: spawn;
- 从列表中选择脚本。
脚本带有 bash-script 标签,可在任务配置中引用或过滤。如需传参或定制执行环境,在 .zed/tasks.json 添加:
[
{
"label": "run my-script.sh with args",
"command": "./my-script.sh",
"args": ["--verbose", "--output=results.txt"],
"tags": ["bash-script"]
}
]
Shell 初始化与登录 Shell
Zed 在登录 Shell(login shell)中启动任务,确保 .bash_profile、.zshrc 等初始化文件先被加载——任务因此能访问你配置过的环境变量、alias 与 PATH 修改。若某命令在普通终端可用、在任务里却找不到,请先检查 Shell 配置文件是否就绪。
任务所用的 Shell 可通过 terminal.shell 设置覆盖:
{
"terminal": {
"shell": {
"program": "/bin/zsh"
}
}
}
完整选项见 terminal.md。
调试器:DAP 客户端一统多语言调试
Zed 的调试器实现的是 Debug Adapter Protocol(DAP)的客户端侧,由各类 debug adapter 充当服务端。DAP 是编辑器/IDE 与调试器之间的标准化协议,这让 Zed 不必为每种语言各自实现调试逻辑,即可获得一致的断点、单步与变量检视体验。协议层实现在 crates/dap,交互 UI 位于 crates/debugger_ui。
受支持的语言
Zed 需要为对应语言找到 debug adapter:部分由 Zed 内置提供,部分由语言扩展提供。目前可用的语言如下:
- C(内置)、C++(内置)、Go(内置)
- Java(扩展提供)
- JavaScript(内置)
- PHP(内置)、Python(内置)
- Ruby(扩展提供)
- Rust(内置)、Swift(扩展提供)
- TypeScript(内置)
语言不在列表内时,可按扩展机制自行接入调试器(详见 debugger.md)。
开始调试
对多数语言,最快路径是直接运行 debugger::Start(默认键 F4,见 default-macos.json)。它会打开 new process modal,列出当前项目上下文中预配置的调试任务——这些任务由测试、入口点(如 main 函数)等自动生成。调试面板右上角的"+"按钮会打开同一对话框。
对没有预配置任务的语言(含 C、C++ 及部分扩展支持语言),可在项目根目录的 .zed/debug.json 中定义调试配置,文件是配置对象数组:
[
{
"adapter": "CodeLLDB",
"label": "First configuration"
// ...
},
{
"adapter": "Debugpy",
"label": "Second configuration"
// ...
}
]
若 .zed/debug.json 中没有配置,Zed 还会加载 .vscode/launch.json 中的配置并展示在 new process modal 中。
全局调试配置:多个项目共用同一套启动配置时,可用 zed::OpenDebugTasks 打开全局 debug.json(位于用户设置旁,调试器 UI 的改动会自动同步):
- macOS:
~/Library/Application Support/Zed/debug.json - Linux/BSD:
$XDG_CONFIG_HOME/zed/debug.json(回退~/.config/zed/debug.json) - Windows:
%APPDATA%\Zed\debug.json
填入与 .zed/debug.json 相同的对象数组即可;其中的场景会合并进每个工作区,自动出现在"New Debug Session"对话框中。
Launch 与 Attach 两种模式
- Launch(启动新实例):由 Zed 与底层 adapter 全程控制程序生命周期,通常能更可靠地拾取调试信息,适合跑单测或应用的 debug 构建。
- Attach(附加到已有进程):程序已在运行且无法重启时(例如 bug 只在生产环境复现),附加比重启更合适。
调试配置详解
所有调试任务必须提供 adapter 与 label。此外 build 字段用于在调试器启动前执行必要的构建/设置步骤,tcp_connection 字段用于连接已有进程;其余字段由 adapter 决定,多数字段支持 任务变量。
[
{
// 配置标签,用于调试面板与 new process modal 中标识会话
"label": "Example Start debugger config",
// 使用的 debug adapter
"adapter": "Example adapter name",
// Request:
// - launch: 启动程序(未指定 program 时展示带正确配置的调试终端)
// - attach: 附加到运行中的程序(未指定 process_id 时展示进程选择器,目前仅 node 支持)
"request": "launch",
// 待调试程序,支持 ~ 或 . 路径解析
"program": "path_to_program",
// cwd 默认取项目当前工作目录($ZED_WORKTREE_ROOT)
"cwd": "$ZED_WORKTREE_ROOT"
}
]
Build 任务:把构建步骤嵌入调试配置,调试器启动前先执行:
[
{
"label": "Build Binary",
"adapter": "CodeLLDB",
"program": "path_to_program",
"request": "launch",
"build": {
"command": "make",
"args": ["build", "-j8"]
}
}
]
build 也能按未替换的标签引用已有任务:
[
{
"label": "Build Binary",
"adapter": "CodeLLDB",
"program": "path_to_program",
"request": "launch",
"build": "my build task" // 或 "my build task for $ZED_FILE"
}
]
自动创建调试场景:给定一个 Zed 任务,Zed 可自动为其生成调试场景(这也支撑了 gutter 内的场景创建)。目前 Rust、Go、Python、JavaScript、TypeScript 支持此能力。
断点与例外断点
点击编辑器行号左侧的 gutter 即可下断点。右键断点图标可进一步调整:
- 日志断点(Log):命中时输出一条日志消息;
- 条件断点(Conditional):仅当条件成立才暂停,条件语法由 adapter 决定;
- 命中计数(Hit Count):命中若干次之后才暂停;
- 禁用(Disable):暂停生效但保留在 gutter 中显示。
部分 adapter(如 CodeLLDB 与 JavaScript)会校验断点是否可能命中,不可命中的断点会在 UI 中更醒目地标出。所有断点(含例外断点)都会列在调试会话 UI 的 "Breakpoints" 项中,可通过它管理例外断点——当某种例外发生时,adapter 会暂停程序,支持的例外类型取决于具体 adapter。
其他调试设置与 UI 细节
- 支持分栏(Split Panes)工作区,可并排观察代码与调试状态;
- 面板停靠(Dock)位置、单步粒度(Stepping Granularity)、断点持久化(Save Breakpoints)均可配置;
- 会话按钮、请求超时(Timeout)、内联变量值(Inline Values)等可调;
- 排障时可开启 Log DAP Communications 记录协议原始报文,并可格式化 DAP 日志便于阅读;
- 可通过 DAP 自定义机制接入专属 adapter(详见 debugger.md);
- 主题与整体 UI 一致,可切换。
REPL:把脚本跑成"即时笔记本"
Zed 内置 REPL 使用 Jupyter kernels,可以在普通编辑文件中交互式运行代码。
安装 Kernel
支持的当前语言与内核:
- Python(ipykernel)
- TypeScript(Deno)
- R(Ark / Xeus)
- Julia
- Scala(Almond)
安装好内核后,若刚添加请运行 repl::RefreshKernelspecs 刷新可用内核列表。内核的发现与调度在 crates/repl 中实现,它通过 kernelspec 与语言模型选择器协作,把"某语言"映射到"某个内核"。
使用 REPL
打开对应语言的文件,执行 repl::Run(默认 Ctrl+Shift+Enter,macOS 与 Linux/Windows 相同)运行选中的块/选区/当前行;也可点击工具栏的 REPL 图标。执行结果会内联显示在选区下方;repl::ClearOutputs 或工具栏 REPL 菜单可清空输出。
# %% Cell 1
import time
import numpy as np
# %% Cell 2
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
from matplotlib import style
style.use('ggplot')
Cell 模式:Zed 支持"脚本即笔记本"(jupytext 格式)——Python 中用 # %%、TypeScript 中用 // %% 分隔。repl::Run 会把相邻分隔符之间的代码块当作独立 Cell 依次运行,让单文件获得笔记本式逐格执行体验。这在需要长时初始化(如重型 import)时尤其有用。
各语言安装指引
Python(全局环境):
pip install ipykernel
python -m ipykernel install --user
Conda 环境:
source activate myenv
conda install ipykernel
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
Virtualenv + pip:
source activate myenv
pip install ipykernel
python -m ipykernel install --user --name myenv --display-name "Python (myenv)"
注意:macOS 上系统 Python 不可用于 REPL,请使用 pyenv 或虚拟环境。Zed 对 Python 的 toolchain(用于诊断)与 REPL kernel 是两套独立选择;若诊断结果与 REPL 不一致,可用
toolchain::Select将 toolchain 对齐到 kernel。
R(Ark Kernel):下载对应平台的 Ark 发行版,macOS 上把 ark 解压到 /usr/local/bin 后执行 ark --install。
R(Xeus Kernel):见 repl.md 的安装说明。
TypeScript / Deno:使用 Deno 的 Jupyter 支持注册 Deno kernel。
Julia / Scala:分别注册 IJulia / Almond kernel 后即可在 .jl / .scala 文件运行。
内核选择与调试
- 切换语言所用内核:可用 REPL 菜单或相关命令更换某语言对应的内核;安装 ipykernel 后通常即可作为 Python 默认内核。
- 内核推荐逻辑:Zed 会结合语言映射与已安装内核给出推荐(详见 repl.md),也支持设置默认内核。
- 交互式输入:
input()之类的交互请求可在 REPL 界面处理。 - 调试 kernelspec:若内核未出现或启动失败,可用
repl::RefreshKernelspecs与调试命令检查 kernelspec 注册状态。
端到端工作流:从写代码到验证
把上述能力串成一条典型链路,即可体会"不离开编辑器"的价值:
- 用
Ctrl+`打开终端面板,先跑一次cargo build(或npm install)确认环境; - 在
.zed/tasks.json定义带$ZED_RELATIVE_FILE、$ZED_SELECTED_TEXT的任务,用Ctrl+Shift+R呼出并选择,例如"运行当前文件"或"构建当前 crate"; - 需要断点排查时按
F4(debugger::Start)从预配置场景中选择 launch 配置,或先写好.zed/debug.json,让build字段自动先编译再调试; - 若只是验证一段算法或数据结果,直接选中代码按
Ctrl+Shift+Enter走 REPL,把实验性代码与正式代码留在同一文件,用# %%组织成 Cell。
这套体系在仓库中由彼此协作的 crate 承载:终端能力与面板集中在 crates/terminal_view,任务定义、变量展开与上下文过滤在 crates/task,DAP 客户端协议与调试 UI 分别在 crates/dap 与调试相关 UI crate,REPL 的内核调度在 crates/repl。深入阅读这些 crate 的源码,可以进一步理解任务变量注入、内核发现等机制的具体实现细节。
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 StartedRust0629
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
HivisionIDPhotos⚡️HivisionIDPhotos: a lightweight and efficient AI ID photos tools. 一个轻量级的AI证件照制作算法。Python08
DragonOSDragonOS is an operating system developed from scratch using Rust, with Linux compatibility. It is designed for **Serverless** scenarios. 使用Rust从0自研内核,具有Linux兼容性的操作系统,面向云计算Serverless场景而设计。Rust00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00