任务

Zed 支持使用其集成终端生成(并重新运行)命令以输出结果。这些命令可以读取 Zed 状态的有限子集(例如当前正在编辑的文件的路径或选定的文本)。

[
  {
    "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 terminal pane, add and focus the corresponding task's tab in it (default)
    // * `never` — avoid changing current terminal pane focus, but still add/reuse the task's tab there
    "reveal": "always"
  }
]

有两种操作驱动使用任务的工作流:task: spawntask: rerun task: spawn 打开一个模态窗口,其中包含当前文件中所有可用的任务。task: rerun 重新运行最近生成的 task。你还可以从任务模态窗口重新运行任务。

任务模板

任务可以定义

  • 在全局 tasks.json 文件中;此类任务可在所有你处理的 Zed 项目中使用。此文件通常位于 ~/.config/zed/tasks.json。你可以使用 zed: open tasks 操作对其进行编辑。
  • 在特定于工作树(本地)的 .zed/tasks.json 文件中;此类任务仅在处理包含该工作树的项目时可用。你可以使用 zed: open local tasks 编辑特定于工作树的任务。
  • 使用 一次性任务 随时进行。
  • 通过语言扩展。

变量

Zed 任务就像你的 shell;这也意味着你可以通过类似 sh 的 $VAR_NAME 语法引用环境变量。为了你的方便,设置了一些其他环境变量。这些变量允许你从当前编辑器中提取信息并在任务中使用它。以下变量可用

  • 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_STEM: 当前打开的文件的主干(不带扩展名的文件名)(例如:main
  • ZED_SYMBOL: 当前选中的符号;应与符号面包屑中显示的最后一个符号匹配(例如:mod tests > fn test_task_contexts
  • ZED_SELECTED_TEXT: 当前选中的文本
  • ZED_WORKTREE_ROOT: 当前工作树根目录的绝对路径。(例如:/Users/my-user/path/to/project
  • ZED_CUSTOM_RUST_PACKAGE: (Rust 特有)$ZED_FILE 源文件的父包的名称。

要在任务中使用变量,请在其前面加上美元符号 ($)

{
  "label": "echo current file's path",
  "command": "echo $ZED_FILE"
}

您还可以使用详细语法,该语法允许在给定变量不可用时指定默认值:${ZED_FILE:default_value}

这些环境变量还可以在任务 cwdargslabel 字段中使用。

一次性任务

通过 task: spawn 打开的相同任务模式支持任意类似 bash 的命令执行:在模式文本字段内输入一个命令,然后使用 opt-enter 来生成它。

任务模式将为当前 Zed 会话保留这些命令的列表,task: rerun 还会重新运行这些任务,如果它们是最后生成的。

您还可以在模式中调整当前选定的任务(opt-e 是默认键绑定)。这样做会将其命令放入一个提示符中,然后可以对其进行编辑和生成,作为一次性任务。

临时任务

您可以在通过模式生成任务时使用 cmd 修饰符;这样生成的任务不会增加其使用计数(因此,它们不会使用 task: rerun 重新生成,并且它们在任务模式中不会有很高的排名)。临时任务的预期用途是与连续的 task: rerun 使用保持一致。

任务的自定义键绑定

您可以通过 task::Spawn 的附加参数为任务定义自己的键绑定。如果您想将上述 echo current file's path 任务绑定到 alt-g,您可以在 keymap.json 文件中添加以下代码段

{
  "context": "Workspace",
  "bindings": {
    "alt-g": ["task::Spawn", { "task_name": "echo current file's path" }]
  }
}

将可运行标签绑定到任务模板

Zed 支持通过具有以下优先级层次结构的工作区本地和全局 tasks.json 文件覆盖内联可运行指示符的默认操作

  1. 工作区 tasks.json
  2. 全局 tasks.json
  3. 语言提供的标签绑定(默认)。

要标记任务,请将可运行标签名称添加到任务模板上的 tags 字段

{
  "label": "echo current file's path",
  "command": "echo $ZED_FILE",
  "tags": ["rust-test"]
}

这样,您就可以更改在可运行指示器中显示的任务。