环境变量
注意:以下内容仅适用于 Zed 0.152.0 及更高版本。
Zed 中的多项功能都受到环境变量的影响:
- 任务
- 内置终端
- 语言服务器查找
- 语言服务器
为了充分利用这些功能,了解 Zed 从何处获取环境变量以及如何使用它们会很有帮助。
Zed 从何处获取环境变量?
Zed 的启动方式——无论是在 macOS Dock 或 Linux 窗口管理器中点击图标,还是通过 Zed 自带的 CLI zed 启动——都会影响 Zed 可以使用的环境变量。
通过 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 实例会继承环境变量。
通过窗口管理器、程序坞或启动器启动
当 Zed 通过 macOS 程序坞、Linux 上的 GNOME 或 KDE 图标,或是 Alfred 或 Raycast 这类应用启动器启动时,由于没有外围的 shell 环境,因此无法继承环境变量。
为确保环境仍具实用性,Zed 会在用户主目录下生成登录 shell 并获取其环境。该环境随后会设置于 Zed 进程上。这意味着所有 Zed 窗口和项目都将继承该主目录环境。
由于这可能会给需要在项目中设置不同环境变量的用户带来问题(因为他们在该项目中使用direnv、asdf或mise等),Zed在打开项目时会启动另一个登录Shell。这次是在项目目录中启动。该登录Shell的环境变量不会直接设置到进程上(因为这意味着打开新项目会改变所有Zed窗口的环境)。相反,这些环境变量会被存储起来,并在运行任务、打开终端或启动语言服务器时传递使用。
环境变量在何处及如何使用?
环境变量分为两类:
- Zed进程的环境变量
- 按项目存储的环境变量
第一类变量始终有效,因为它们存储在进程本身中,所有衍生进程(任务、终端、语言服务器等)默认都会继承这些变量。
第二类变量则会根据具体功能被显式调用。
任务
任务启动时会采用组合环境变量。按优先级从低到高排列(后者覆盖前者):
- Zed 进程环境变量
- 若项目通过 CLI 打开:CLI 环境变量
- 若项目未通过 CLI 打开:在项目根目录运行登录 shell 获取的项目环境变量
- 可选设置中显式配置的环境变量
内置终端
内置终端与任务类似,启动时采用组合环境变量。按优先级从低到高排列:
- Zed 进程环境变量
- 若项目通过 CLI 打开:CLI 环境变量
- 若项目未通过 CLI 打开:在项目根目录运行登录 shell 获取的项目环境变量
- 可选设置中显式配置的环境变量
语言服务器查找机制
部分语言的服务器适配器会在用户的 $PATH 中查找二进制文件。例如:
- Go
- Zig
- Rust(若配置为二进制模式)
- C
- TypeScript
在执行环境查询时,Zed 采用以下机制:
- 若项目通过命令行启动:继承命令行环境
- 若项目非通过命令行启动:通过在项目根目录运行登录 shell 获取项目环境变量
语言服务器
完成语言服务器查询后,Zed 将启动对应服务。
这些语言服务器进程始终继承 Zed 的进程环境。但根据语言服务器查询结果,可能会设置额外的环境变量或覆盖现有进程环境。
- 若在项目环境的
$PATH中找到语言服务器,则项目环境变量将传递给语言服务器进程。项目环境的来源取决于项目打开方式(是否通过命令行)。具体可参考前文关于语言服务器查找的说明。 - 若未在项目环境中找到语言服务器,Zed会尝试全局安装并启动。此时进程将继承Zed的进程环境变量;若项目通过命令行打开,则同时继承命令行环境变量。