编辑预测

编辑预测是 Zed 通过 AI 预测您想要编写的代码的机制。每次按键都会向编辑预测提供程序发送新的请求,提供程序会返回单个或多行建议,您可以通过按 tab 快速接受。

默认提供程序是 Zeta,一个专有的开源和开放数据集模型,它需要登录 Zed。另外,您还可以使用 其他提供程序,例如 GitHub Copilot 和 Codestral。

配置 Zeta

Zed 的编辑预测最初通过标题栏上的横幅引入。点击它会弹出一个模态框,其中有一个按钮(“启用编辑预测”),它将 zed 设置为您的 edit_prediction_provider

Onboarding banner and modal

但是,如果您没有看到横幅,Zed 的编辑预测是默认的编辑预测提供程序,您应该会立即在状态栏中看到它。

切换模式

Zed 的编辑预测有两种不同的显示模式

  1. eager(默认):只要不与语言服务器补全冲突,预测就会以内联方式显示
  2. subtle:预测仅在按住修改键(默认 alt)时以内联方式出现

通过 mode 键在它们之间切换

"edit_predictions": {
  "mode": "eager" // or "subtle"
},

或者直接通过状态栏菜单通过 UI 切换

Edit Prediction status bar menu, with the modes toggle.

与其他 tab 操作冲突

默认情况下,当 tab 通常执行不同操作时,Zed 需要一个修改键来接受预测

  1. 当语言服务器补全菜单可见时。
  2. 当您的光标不在正确的缩进级别时。

在这些情况下,请使用 alt-tab 来接受预测。当语言服务器补全菜单打开时,首先按住 alt 会使其暂时消失,以便在缓冲区中预览预测。

在 Linux 上,alt-tab 通常被窗口管理器用于切换窗口,因此 alt-l 被提供为接受预测的默认绑定。tabalt-tab 也有效,但默认不显示。

editor: accept partial edit prediction (ctrl-cmd-right|alt-right) 可用于接受当前编辑预测直到下一个单词边界。

请参阅下面的配置 GitHub Copilot配置 Supermaven 部分,以了解其他提供程序的配置。这些提供程序仅支持当前光标处的文本插入,而 Zeta 模型提供包括删除在内的多种预测。

配置编辑预测键绑定

默认情况下,tab 用于接受编辑预测。您可以通过将其插入到您的键映射中使用其他键绑定

{
  "context": "Editor && edit_prediction",
  "bindings": {
    // Here we also allow `alt-enter` to accept the prediction
    "alt-enter": "editor::AcceptEditPrediction"
  }
}

当与 tab发生冲突时,Zed 使用不同的上下文来接受键绑定 (edit_prediction_conflict)。如果您想使用不同的键绑定,您可以将其插入到您的键映射中

{
  "context": "Editor && edit_prediction_conflict",
  "bindings": {
    "ctrl-enter": "editor::AcceptEditPrediction" // Example of a modified keybinding
  }
}

如果您的键绑定包含修改键(上面示例中的 ctrl),它也将用于预览编辑预测并暂时隐藏语言服务器补全菜单。

您还可以将此操作绑定到不带修改键的键绑定。在这种情况下,Zed 将使用默认修改键 (alt) 来预览编辑预测。

{
  "context": "Editor && edit_prediction_conflict",
  "bindings": {
    // Here we bind tab to accept even when there's a language server completion
    // or the cursor isn't at the correct indentation level
    "tab": "editor::AcceptEditPrediction"
  }
}

为了在有语言服务器补全菜单时保持使用修改键接受预测,但允许 tab 接受预测而不受光标位置影响,您可以使用 showing_completions 进一步指定上下文

{
  "context": "Editor && edit_prediction_conflict && !showing_completions",
  "bindings": {
    // Here we don't require a modifier unless there's a language server completion
    "tab": "editor::AcceptEditPrediction"
  }
}

键绑定示例:始终使用 Alt-Tab

下面的键绑定示例导致始终使用 alt-tab 而不是有时使用 tab。您可能希望这样做,以便只有一个键绑定可用于接受编辑预测,因为 tab 的行为因上下文而异。

  {
    "context": "Editor && edit_prediction",
    "bindings": {
      "alt-tab": "editor::AcceptEditPrediction"
    }
  },
  // Bind `tab` back to its original behavior.
  {
    "context": "Editor",
    "bindings": {
      "tab": "editor::Tab"
    }
  },
  {
    "context": "Editor && showing_completions",
    "bindings": {
      "tab": "editor::ComposeCompletion"
    }
  },

如果在 settings.json 中设置了 "vim_mode": true,则需要在上述内容之后添加额外的绑定才能将 tab 恢复到其原始行为

  {
    "context": "(VimControl && !menu) || vim_mode == replace || vim_mode == waiting",
    "bindings": {
      "tab": "vim::Tab"
    }
  },
  {
    "context": "vim_mode == literal",
    "bindings": {
      "tab": ["vim::Literal", ["tab", "\u0009"]]
    }
  },

键绑定示例:在 Linux 上显示 Tab 和 Alt-Tab

虽然 Linux 支持 tabalt-tab,但显示的是 alt-l。如果您的窗口管理器未保留 alt-tab,并且您更喜欢使用 tabalt-tab,请在 keymap.json 中包含这些绑定

  {
    "context": "Editor && edit_prediction",
    "bindings": {
      "tab": "editor::AcceptEditPrediction",
      // Optional: This makes the default `alt-l` binding do nothing.
      "alt-l": null
    }
  },
  {
    "context": "Editor && edit_prediction_conflict",
    "bindings": {
      "alt-tab": "editor::AcceptEditPrediction",
      // Optional: This makes the default `alt-l` binding do nothing.
      "alt-l": null
    }
  },

缺失的键绑定

Zed 需要在 Editor && edit_predictionEditor && edit_prediction_conflict 上下文中至少有一个用于 editor: accept edit prediction 操作的键绑定(上面了解更多)。

如果您之前在全局上下文中将默认键绑定绑定到不同的操作,您将无法预览或接受编辑预测。例如

[
  // Your keymap
  {
    "bindings": {
      // Binds `alt-tab` to a different action globally
      "alt-tab": "menu::SelectNext"
    }
  }
]

要解决此问题,您可以为接受编辑预测指定自己的键绑定

[
  // ...
  {
    "context": "Editor && edit_prediction_conflict",
    "bindings": {
      "alt-l": "editor::AcceptEditPrediction"
    }
  }
]

如果您想使用默认键绑定,可以通过将您的键绑定移动到更具体的上下文或将其更改为其他内容来释放它。

禁用自动编辑预测

您可以以不同的级别禁用编辑预测的显示,包括完全不开启。

或者,如果您将 Zed 设置为您的提供程序,请考虑使用 Subtle 模式

在缓冲区上

为了在您键入时不会自动显示预测,请在 settings.json 中设置此项

{
  "show_edit_predictions": false
}

这会隐藏所有可用的预测指示,无论您处于何种显示模式(仅当您将 Zed 作为提供程序时才有效)。尽管如此,您仍然可以通过执行 editor: show edit prediction 或按下 alt-tab|alt-\ 手动触发编辑预测。

对于特定语言

为了在处理特定语言时不会在您键入时自动显示预测,请在 settings.json 中设置此项

{
  "language": {
    "python": {
      "show_edit_predictions": false
    }
  }
}

在特定目录中

要禁用特定目录或文件的编辑预测,请在 settings.json 中设置此项

{
  "edit_predictions": {
    "disabled_globs": ["~/.config/zed/settings.json"]
  }
}

完全关闭

要完全关闭所有提供程序的编辑预测,请明确将设置设置为 none,如下所示

"features": {
  "edit_prediction_provider": "none"
},

配置其他提供程序

Zed 的编辑预测也适用于 Zeta 之外的其他补全模型提供程序。了解下面可用的提供程序。

GitHub Copilot

要使用 GitHub Copilot 作为您的提供程序,请在 settings.json 中设置此项

{
  "features": {
    "edit_prediction_provider": "copilot"
  }
}

您应该可以通过点击状态栏中的 Copilot 图标并按照设置说明登录 GitHub Copilot。

使用 GitHub Copilot Enterprise

如果您的组织使用 GitHub Copilot Enterprise,您可以通过在 settings.json 中指定企业 URI 来配置 Zed 以使用您的企业实例

{
  "edit_predictions": {
    "copilot": {
      "enterprise_uri": "https://your.enterprise.domain"
    }
  }
}

"https://your.enterprise.domain" 替换为您的 GitHub Enterprise 管理员提供的 URL(例如,https://foo.ghe.com)。

设置后,Zed 将通过您的企业端点路由 Copilot 请求。当您点击状态栏中的 Copilot 图标登录时,您将被重定向到您配置的企业 URL 以完成身份验证。所有其他 Copilot 功能和用法保持不变。

Copilot 可以提供多个补全替代方案,这些替代方案可以通过以下操作进行导航

  • editor: next edit prediction (alt-tab|alt-]):循环到下一个编辑预测
  • editor: previous edit prediction (alt-shift-tab|alt-[):循环到上一个编辑预测

Supermaven

要使用 Supermaven 作为您的提供程序,请在 settings.json 中设置此项

{
  "features": {
    "edit_prediction_provider": "supermaven"
  }
}

您应该可以通过点击状态栏中的 Supermaven 图标并按照设置说明登录 Supermaven。

Codestral

要使用 Mistral 的 Codestral 作为您的提供程序,请首先运行 agent: open settings 操作,进入代理面板设置视图。查找 Mistral 项并在相应的文本输入框中添加 Codestral API 密钥。

之后,您应该能够在 settings.json 文件中将其切换为您的提供程序

{
  "features": {
    "edit_prediction_provider": "codestral"
  }
}

另请参阅

要了解在 Zed 中与 AI 交互的其他方式,您可能还想查看有关代理面板内联助手功能的更多信息。