补全

Zed 支持两种补全来源

  1. “代码补全”,由 Zed 自动安装的语言服务器 (LSP) 或通过 Zed 语言扩展 提供。
  2. “编辑预测”,由 Zed 自己的 Zeta 模型或外部提供商(如 GitHub CopilotSupermaven)提供。

语言服务器代码补全

当有合适的语言服务器可用时,Zed 将提供当前文件中变量名、函数和其他符号的补全。 您可以通过将以下内容添加到您的 Zed settings.json 文件来禁用它们

"show_completions_on_input": false

您可以使用 ctrl-space 手动触发补全,或者通过从命令面板触发 editor::ShowCompletions 操作。

更多信息,请参见

编辑预测

Zed 内置了同时预测多个编辑的支持,通过 Zeta,Zed 的开源和开放数据模型。 编辑预测会在您键入时出现,大多数情况下,您可以通过按 tab 来接受它们。

配置 Zeta

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

Onboarding banner and modal

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

切换模式

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

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

通过 mode 键在它们之间切换

"edit_predictions": {
  "mode": "eager" | "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,请考虑使用微妙模式

在缓冲区上

要避免在您键入时自动显示预测,请在 settings.json 中设置此项

{
  "show_edit_predictions": false
}

这会隐藏所有表明有可用预测的指示,无论您处于哪种显示模式(仅当您的提供商为 Zed 时有效)。 尽管如此,您仍然可以通过执行 editor: show edit prediction 或点击 alt-tab|alt-</kbd>. 手动触发编辑预测。

针对特定语言

要避免在使用特定语言时自动显示预测,请在 settings.json 中设置此项

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

完全关闭

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

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

配置 GitHub Copilot

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

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

您应该能够通过单击状态栏中的 Copilot 图标并按照设置说明登录到 GitHub 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。

另请参阅

您也可以使用助手面板或内联助手与语言模型进行交互,有关更多信息,请参阅助手文档