环境变量
注意: 以下内容仅适用于 Zed 0.152.0 及更高版本。
Zed 中的多个功能受环境变量影响:
为了更好地利用这些功能,了解 Zed 从何处获取环境变量以及如何使用它们会很有帮助。
Zed 从哪里获取其环境变量?
Zed 的启动方式决定了它可以使用哪些环境变量。这包括从 macOS Dock、Linux 窗口管理器或 zed CLI 启动。
从 CLI 启动
如果通过 CLI (zed) 打开 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 窗口和项目都会继承它。
由于这可能会导致需要为每个项目使用不同环境变量的用户出现问题(例如使用 direnv、asdf 或 mise),Zed 在打开项目时会生成另一个登录 shell。这个第二个 shell 在项目的目录中运行。该环境_不_设置在进程上,因为打开新项目会 otherwise 更改所有 Zed 窗口的环境。相反,该环境会被存储并在运行任务、打开终端或生成语言服务器时传递。
环境变量在哪里以及如何使用?
有两套环境变量:
- Zed 进程的环境变量
- 每个项目存储的环境变量
(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 环境。