环境变量
注意:以下内容仅适用于 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 窗口和项目都将继承该主目录环境。
由于这可能会给需要为项目使用不同环境变量的用户带来问题(因为他们在该项目中使用 direnv
或 asdf
或 mise
,...),因此在打开项目时,Zed 会生成另一个登录 shell。这次在项目的目录中。来自该登录 shell 的环境未在进程上设置(因为这意味着打开一个新项目会更改所有 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 还是非 CLI。请参阅前面关于查找语言服务器的要点。 - 如果未在项目环境中找到语言服务器,Zed 会尝试全局安装它并全局启动它。在这种情况下,该进程将继承 Zed 的进程环境,并且——如果项目是通过 CLI 打开的——来自 CLI 的环境。