环境变量

注意:以下内容仅适用于 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 中查找二进制文件。例子

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

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

语言服务器

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

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

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