Whetuu: 一个用 Zig 编写的零配置跨 Shell 提示符

Whetuu: 一个用 Zig 编写的零配置跨 Shell 提示符

Whetuu 是一个用 Zig 编写的零配置跨 Shell 提示符,旨在实现高性能和最小化设置。它提供一个动态提示符,用于跟踪 Git 状态、工具链版本和命令执行时间,同时集成了由上箭头触发的目录感知历史记录选择器。

高性能提示符渲染

Whetuu 在标准环境下大约渲染需要 2 毫秒,确保 shell 保持响应。为了达到此速度,每个读取磁盘的模块通过 std.Io 并发运行,这意味着总渲染时间受最慢的单个探测限制,而不是所有探测时间的总和。

性能基准测试在第 13 代 i9-13900H (ReleaseFast) 上显示:

  • 无仓库,无工具链: 2.3 ms
  • Zig 仓库 (35 文件): 3.0 ms
  • 单一仓库 (8,259 文件): 20.2 ms

为了防止慢速仓库导致 shell 挂起,Whetuu 实施了严格的超时。Git 子进程被限制在 250 毫秒,工具链探测被限制在 200 毫秒。如果进程超过这些限制,Whetuu 只会简单地从提示符中删除对应的段落。

集成的目录感知历史记录选择器

Whetuu 用交互式选择器替换了标准的上箭头历史记录行为。此选择器默认作用于当前目录,仅在未找到目录特定命令时才回退到全局历史记录。

历史记录选择器的主要特点包括:

  • 干净历史记录: 仅记录干净退出的命令,防止输入错误使列表杂乱。
  • 隐私: 以空格开头的命令永不会被记录。
  • 语法高亮: 命令根据终端主题进行高亮显示,长命令会在中间被截断,以保留唯一的前缀和后缀。
  • 导航: 用户可以通过输入(不区分大小写)进行过滤,使用 Ctrl+G 在目录历史记录和全局历史记录之间切换,并使用 Tab 编辑所选项,然后用 Enter 运行。

动态提示符模块

提示符仅在与当前上下文相关时显示段落:

  • 用户/主机: 在 SSH 中或以 root 身份时以粗体绿色显示;root 访问将以粗体红色突出显示作为警告。
  • 目录: 显示当前目录,将 $HOME 折叠为 ~,固定路径并尽可能容纳更多的尾部目录。
  • Git 分支: 以品红色显示分支名称或 (detached)
  • Git 状态: 以黄色指示正在进行的操作,如变基、合并或拣选提取。这直接从 .git 读取,不产生子进程。
  • Git 状态: 将冲突、暂存、已暂存、修改、未跟踪以及领先/落后状态分组到单个括号组中。
  • 语言检测: 显示 39 种不同语言和工具的徽标和版本,通过项目清单、源文件扩展名或基础设施标记进行检测。
  • 语言品牌: 提示符字符(一个星号)采用检测到的语言的品牌颜色。
  • 命令持续时间: 如果前一条命令运行时间达到两秒或更长,则会出现计时器符号和经过的时间。

安全和数据隐私

Whetuu 采用“没有任何数据离开您的机器”理念设计。它不包含任何网络套接字、HTTP 客户端、遥测或更新检查。

数据管理遵循以下原则:

  • 存储: Whetuu 仅写入两个文件:历史记录存储(模式 600)和位于 ~/.cache/whetuu/versions 的工具链版本缓存。两者均遵循 XDG 基础目录规范。
  • Shell 集成: 安装程序将两行追加到活动 shell ($SHELL) 的配置中,除此之外不做其他更改。
  • 输入安全: 分支名称或目录中的控制字节将被转换为 ?,以防止终端转义序列攻击。
  • 执行: Whetuu 以固定参数的子进程形式运行 git 和工具链探测,确保用户输入永不会被解释为命令。

安装和要求

Whetuu 需要 Nerd Font 来渲染用于 Git 分支、语言徽标和提示符字符的字形。如果没有 Nerd Font,这些元素将显示为空白方框。

安装通过单个命令完成:

curl --proto '=https' --tlsv1.2 -fsSL https://yamafaktory.github.io/whetuu/install.sh | sh

偏好手动配置的用户可以使用 WHETUU_NO_MODIFY=1 运行安装程序,以打印所需的配置行,而不是修改点文件。

社区反馈

尽管因其性能和历史记录选择器而受到赞誉,但一些用户对工具的观点性和其安装方法表示了担忧:

"我不希望我的提示符也处理 shell 历史记录……请停止在我的 $HOME 中创建目录。"

其他用户质疑将脚本直接管道到 shell 的安装方法,这是安全社区中常见的争议点:

"请停止将脚本管道到 bash 或 sh。强制人们使用编辑器,阅读安装脚本,并告诉他们如何运行它。"

关于词源,一位用户指出,该名称源自毛利语,其中 "wh" 发音为 "f" 音(FEH-too),而 "ū" 上的长音符号表示长元音。

Sources