devenv 2.1:通过 libghostty 在 Nix 中使用 zsh、fish 和 nushell - devenv
摘要
devenv 2.1 为 zsh、fish 和 nushell 引入了原生支持,使用内置的自动激活钩子替代了 direnv,并集成 libghostty 以优化终端处理与编码代理(coding agent)支持。
<p><a href="https://lobste.rs/s/9thd1c/devenv_2_1_nix_with_zsh_fish_nushell_via">评论</a></p>
查看缓存全文
缓存时间: 2026/05/11 13:03
# devenv 2.1:通过 libghostty 在 Nix 中使用 zsh、fish 和 nushell
来源:https://devenv.sh/blog/2026/05/07/devenv-21-nix-with-zsh-fish-and-nushell-via-libghostty/
https://github.com/cachix/devenv/edit/main/docs/src/blog/posts/devenv-v2.1-nix-with-zsh-fish-and-nushell-via-libghostty.md
devenv 2.0 带来了热重载、状态栏和即时的缓存命中,但 `devenv shell` 总会把你丢进 bash,而且在 `cd` 时仍然需要 `direnv` 来激活环境。devenv 2.1 弥补了这两个差距,并为编程智能体(coding agents)添加了结构化的操作接口。
## 每款 Shell,一视同仁
### 原生 zsh、fish 和 nushell
在 zsh 中重新加载 Shell
devenv 2.1 为 **zsh**、**fish** 和 **nushell** 增加了原生支持(devenv#2718),通过为每款 Shell 分别实现 rcfile 生成、环境差异跟踪、重载钩子和提示符集成,而不是透过 bash 来套一层壳。
Shell 的选取依据 `$SHELL`,也可以显式指定:
```
$ devenv shell
$ SHELL=/bin/zsh devenv shell
```
关闭了 devenv#36(从 2022 年 11 月就存在)、devenv#2487 和 devenv#2592。
### 底层采用 libghostty
虚拟终端模拟器被替换为 libghostty,即 Ghostty 的终端引擎,为 devenv 提供了一个单一的 VT 解析器,以相同的方式处理所有 Shell。可靠地在 Nix 上构建 libghostty 需要上游接受多个补丁:libghostty-rs#27、ghostty#12364 和 ghostty#12548。感谢 Ghostty 维护者合入这些补丁。
### 自动重载
在 2.0 中,重新构建后需要按 `Ctrl+Alt+R` 才能应用环境变化,而该快捷键在 macOS 上会与反向搜索冲突。2.1 在文件变化时会在后台重新评估,并在下一个提示符处应用新的环境(devenv#2595)。
## 无需 direnv 的自动激活
`devenv hook` 替代 direnv 实现基于 `cd` 的激活。只需在你的 Shell 配置中添加一行:
Bash
```bash
eval "$(devenv hook bash)"
```
Zsh
```zsh
eval "$(devenv hook zsh)"
```
Fish
```fish
devenv hook fish | source
```
Nushell
```nushell
devenv hook nu | save --force ~/.cache/devenv/hook.nu
source ~/.cache/devenv/hook.nu
```
当 `cd` 进入受信任的目录时激活,离开时自动复原。没有 `.envrc`,不依赖外部工具。信任关系通过 `devenv allow` 和 `devenv revoke` 管理。
## 为编程智能体设计
在 2.0 中,如果智能体想在配置更改后重启你的 API,它必须杀掉整个 devenv 会话或者通过 ANSI 码去抓取 TUI。2.1 用结构化的句柄取代了这些做法。
### 从命令行管理进程
新的子命令可作用于运行中的 `devenv up`(devenv#2621):
```
$ devenv processes list
$ devenv processes status
$ devenv processes logs api
$ devenv processes restart api
$ devenv processes stop worker
$ devenv processes start worker
```
这些命令与原生进程管理器配合工作,也可以作为 MCP 工具供外部使用。
### 默认静默模式
devenv 通过 `CLAUDECODE`、`OPENCODE_CLIENT` 和 `AI_AGENT` 检测智能体,并自动切换到静默模式,抑制会浪费 token 的 TUI 进度输出(devenv#2723)。可以通过 `--verbose` 或 `--tui` 覆盖。
## OpenTelemetry 追踪导出
devenv 2.1 导出 OTLP 追踪(devenv#2415)。每一次 Nix 求值、derivation 构建、任务运行和托管进程都被转化为一个 span,并附带有诸如 `devenv.activity.kind`、`devenv.derivation_path`、`devenv.url` 和 `devenv.outcome` 等属性。通过新的统一标志 `--trace-to` 启用:
```
$ devenv --trace-to otlp-grpc shell
$ devenv --trace-to otlp-http-protobuf:http://localhost:4318 shell
```
支持三种 OTLP 格式:`otlp-grpc`(内置)、`otlp-http-protobuf` 和 `otlp-http-json`(通过 cargo features 可选加入)。端点可通过标志或标准的 `OTEL_EXPORTER_OTLP_*` 变量设置。追踪上下文会跨进程边界传播:生成的子任务、Shell 命令和进程会继承 `TRACEPARENT` 和 `TRACESTATE`,因此接入了追踪的子进程会出现在与父级 `devenv up` 运行相同的追踪链上。
`--trace-to` 用单一的 `[格式:]目标` 语法取代了 `--trace-output` 和 `--trace-format`,并支持多个目标:
```
$ devenv --trace-to pretty:stderr --trace-to otlp-grpc shell
$ DEVENV_TRACE_TO=json:file:/tmp/trace.json,otlp-grpc devenv shell
```
## 任务和进程
`devenv tasks run` 默认使用 `before` 模式,因此依赖任务也会运行(devenv#2551);通过 `--mode single` 可恢复旧行为。同样的 `--mode` 标志现在也能控制 `devenv up` 启动哪些进程(devenv#2721)。
任务可以通过写入 `$DEVENV_TASK_OUTPUT_FILE` 在进入 Shell 时打印消息(devenv#2500)。
## 还有更多
**Nix 2.34。** 多线程解压 tarball、求值器性能提升以及 REPL 增强。
**`require_version` in devenv.yaml。** 为项目强制要求最低的 devenv CLI 版本。设置 `require_version: true` 可匹配当前使用的模块版本,也可以使用约束字符串,例如 `">=2.1"`(devenv#2391)。
**ROCm 支持。** 新增 `nixpkgs.rocmSupport` 选项,用于在 nixpkgs 配置中启用 ROCm。
**错误时显示完整栈追踪。** `show-trace` 现在始终启用,因此求值错误会包含完整的栈追踪,而不再是截断的、提示使用不存在的 `--show-trace` 标志的消息(devenv#2725)。
**Ctrl+X 停止进程。** 在 TUI 中停止单个进程,同时保持其可见并可重新启动。
**Ctrl+H 隐藏已停止的进程。** 在 TUI 中切换隐藏已停止的进程,以便专注于仍在运行的进程。失败的进程会保持可见,进程计数会显示隐藏的数量(devenv#2692)。
**端口分配修复。** 端口值(`config.processes.<name>.ports.<name>.value`)现在能在 `devenv shell` 和 `devenv tasks run` 中正确解析,与 `devenv up` 分配的端口一致(devenv#2710)。绑定了 `0.0.0.0` 或 `[::]` 的端口现在可以被检测到,从而防止多个 devenv 实例分配相同的端口(devenv#2567)。严格的端口重启不再因为内核套接字清理期间的“端口已占用”而失败(devenv#2647)。
**其他数十项错误修复。** 文件监视去重、导入优先级、eval 缓存一致性、进程生命周期修复以及终端兼容性改进。详情见完整更新日志。
## 破坏性变更
- **`devenv tasks run`** 现在默认运行依赖任务(使用 `before` 模式而非 `single`)。使用 `--mode single` 可恢复旧行为。
## 结语
有任何反馈,欢迎提交 issue 或加入 Discord。
Domen
相似文章
使用Nix的开发环境:四个快速示例
本教程演示了使用Nix设置开发环境的四种方法,包括交互式一次性使用、配置文件以及密封的Nix Flakes,并以GoCV和OpenCV为例。
我喜欢的 NixOS 声明式安装方式
一份关于使用 nixos-anywhere 等工具通过网络声明式安装 NixOS 的指南,重点强调在版本控制下管理配置文件。
Libghostty 即将到来
Mitchell Hashimoto 宣布了 libghostty 的计划,这是一个可嵌入的终端模拟库,首先推出 libghostty-vt,这是一个从 Ghostty 中提取的零依赖终端序列解析器。
@NotionDevs: 安装 ntn,Notion CLI。它将整个 Notion API 带到你的终端,并包含构建和部署所需的一切……
ntn 是一个 Notion 命令行工具,将完整的 Notion API 引入终端,并支持构建和部署 Workers。通过 curl/wget 安装。
@RoundtableSpace:当开发者把终端配置做成艺术品时,就成了 NEOVIM + HERD + GITU + GHOSTTY + KEEBY 这副模样……
精选终端组合(Neovim、Herd、Gitu、Ghostty、Keeby)展示,将开发环境美学化的潮流。