入门 Zed Industries 2026-09-14 17:42:19 · 0 阅读

第15章 Zed 第15章:环境变量详解

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

Zed 的多个功能都受环境变量影响:

要充分发挥这些功能的作用,了解 Zed 从哪里获取环境变量、以及如何使用它们,会很有帮助。

Zed 从哪里获取环境变量?

Zed 的启动方式决定了它能用到哪些环境变量,包括从 macOS Dock、Linux 窗口管理器或 zed 命令行启动。

从命令行启动

如果通过命令行(zed)打开 Zed,它会继承当前 shell 会话的环境变量。

也就是说,如果你执行:

$ export MY_ENV_VAR=hello
$ zed .

那么环境变量 MY_ENV_VAR 在 Zed 内部就可用了,例如在内置终端中使用。

从 Zed 0.152.0 开始,CLI 命令 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 会在项目目录中运行。需要注意的是,该 Shell 的环境变量不会直接设置到 Zed 主进程上,因为如果这样做,打开新项目就会改变所有 Zed 窗口的环境。相反,这套环境变量会被保存起来,并在运行任务、打开终端或启动语言服务器时传递使用。

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

存在两组环境变量:

  1. Zed 主进程的环境变量
  2. 按项目存储的环境变量

第 (1) 类变量始终会被使用,因为它们存储在进程本身中,且所有派生出的子进程(任务、终端、语言服务器等)默认都会继承它们。

第 (2) 类变量则会根据具体功能明确用于特定场景。

任务

任务使用合并后的环境变量运行。优先级从低到高(后者覆盖前者)如下:

  • Zed 主进程的环境变量
  • 如果项目是从 CLI 打开的:CLI 的环境变量
  • 如果项目不是从 CLI 打开的:通过在项目根目录运行登录 Shell 获取的项目环境变量
  • 可选的、在设置中显式配置的环境变量

内置终端

与任务类似,内置终端也使用合并后的环境变量。优先级从低到高如下:

  • Zed 主进程的环境变量
  • 如果项目是从 CLI 打开的:CLI 的环境变量
  • 如果项目不是从 CLI 打开的:通过在项目根目录运行登录 Shell 获取的项目环境变量
  • 可选的、在设置中显式配置的环境变量

语言服务器查找

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

在这种查找过程中,Zed 使用以下环境:

  • 如果项目是从 CLI 打开的:CLI 的环境变量
  • 如果项目未通过命令行界面打开:在项目的根目录运行登录 shell 所获取的项目环境变量

语言服务器

查找完语言服务器后,Zed 会将其启动。

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

  • 如果在项目环境的 $PATH 中找到了该语言服务器,则会把该项目环境传递给语言服务器进程。项目环境的来源取决于项目是如何打开的(通过命令行界面或其他方式)。参见上一节关于语言服务器查找的说明。
  • 如果在项目环境中未找到该语言服务器,Zed 会尝试全局安装并启动它。在这种情况下,进程会继承 Zed 的进程环境;若项目是通过命令行界面打开的,则还会继承命令行环境。

评论 (0)