环境变量

注意:以下内容仅适用于 Zed 0.152.0 及更高版本。

Zed 中的多项功能受环境变量影响

  • 任务
  • 内置终端
  • 语言服务器查找
  • 语言服务器

为了充分利用这些功能,了解 Zed 从何处获取其环境变量以及它们如何使用会很有帮助。

Zed 从何处获取其环境变量?

Zed 的启动方式——无论是通过点击 macOS Dock 或 Linux 窗口管理器中的图标,还是通过 Zed 附带的 CLI zed 启动——都会影响 Zed 可以使用的环境变量。

从 CLI 启动

如果 Zed 通过 CLI (zed) 打开,它将继承周围 shell 会话的环境变量。

这意味着如果你执行

$ export MY_ENV_VAR=hello
$ zed .

环境变量 MY_ENV_VAR 现在在 Zed 内部可用。例如,在内置终端中。

从 Zed 0.152.0 开始,CLI zed始终将其环境传递给 Zed,无论之前是否有 Zed 实例在运行。在 Zed 0.152.0 之前并非如此,只有第一个 Zed 实例会继承环境变量。

通过窗口管理器、Dock 或启动器启动

当 Zed 通过 macOS Dock、Linux 上的 GNOME 或 KDE 图标,或 Alfred 或 Raycast 等应用程序启动器启动时,它没有周围的 shell 环境来继承其环境变量。

为了仍然拥有一个有用的环境,Zed 在用户的家目录中启动一个登录 shell 并获取其环境。然后,此环境会在 Zed 进程上设置。这意味着所有 Zed 窗口和项目都将继承该家目录环境。

由于这可能会导致需要不同环境变量的项目用户(因为他们在该项目中使用 direnvasdfmise 等)出现问题,因此在打开项目时,Zed 会启动另一个登录 shell。这次是在项目目录中。该登录 shell 的环境不会设置在进程上(因为那意味着打开一个新项目会改变所有 Zed 窗口的环境)。相反,该环境被存储并在运行任务、打开终端或启动语言服务器时传递。

环境变量在哪里以及如何使用?

有两组环境变量

  1. Zed 进程的环境变量
  2. 每个项目存储的环境变量

来自 (1) 的变量总是使用,因为它们存储在进程本身上,所有派生进程(任务、终端、语言服务器等)默认都会继承它们。

来自 (2) 的变量根据功能明确使用。

任务

任务是在组合环境中启动的。优先级顺序(从低到高,后者覆盖前者)

  • Zed 进程环境
  • 如果项目是从 CLI 打开的:CLI 环境
  • 如果项目不是从 CLI 打开的:通过在项目根文件夹中运行登录 shell 获取的项目环境变量
  • 可选,在设置中明确配置的环境

内置终端

内置终端,像任务一样,是在组合环境中启动的。优先级顺序(从低到高)

  • Zed 进程环境
  • 如果项目是从 CLI 打开的:CLI 环境
  • 如果项目不是从 CLI 打开的:通过在项目根文件夹中运行登录 shell 获取的项目环境变量
  • 可选,在设置中明确配置的环境

语言服务器查找

对于某些语言,语言服务器适配器会在用户的 $PATH 中查找二进制文件。例如

  • Go
  • Zig
  • Rust(如果配置了
  • C
  • TypeScript

对于此查找,Zed 使用以下环境

  • 如果项目是从 CLI 打开的:CLI 环境
  • 如果项目不是从 CLI 打开的:通过在项目根文件夹中运行登录 shell 获取的项目环境变量

语言服务器

在查找语言服务器后,Zed 会启动它们。

这些语言服务器进程始终继承 Zed 的进程环境。但是,根据语言服务器的查找,可能会设置额外的环境变量或覆盖进程环境。

  • 如果在项目环境的 $PATH 中找到语言服务器,则项目环境将传递给语言服务器进程。项目环境的来源取决于项目如何打开,是通过 CLI 还是不是。请参阅前面关于语言服务器查找的要点。
  • 如果在项目环境中找不到语言服务器,Zed 会尝试全局安装并全局启动它。在这种情况下,进程将继承 Zed 的进程环境,并且——如果项目是通过 CLI 打开的——从 CLI 继承。