18 个版本 (8 个稳定)
新 1.5.0 | 2024 年 8 月 12 日 |
---|---|
1.4.0 | 2024 年 3 月 11 日 |
1.2.0 | 2024 年 1 月 15 日 |
1.1.1 | 2023 年 2 月 19 日 |
0.6.1 | 2021 年 11 月 11 日 |
#77 在 命令行界面
6,012 每月下载次数
用于 20 个 Crates (13 个直接)
40KB
100 行
terminal-light
这个 crate 回答了“终端是深色还是浅色?”的问题。
它提供
- 背景颜色,可以是 RGB 或 ANSI
- 背景颜色的亮度,从 0(黑色)到 1(白色)不等
在 TUI 中使用的一个用例是根据终端的背景确定最适合的颜色组合
let should_use_light_skin = terminal_light::luma()
.map_or(false, |luma| luma > 0.6);
如果您有非常专业的皮肤,您可以选择更精确的切换
match terminal_light::luma() {
Ok(luma) if luma > 0.85 => {
// Use a "light mode" skin.
}
Ok(luma) if luma < 0.2 => {
// Use a "dark mode" skin.
}
_ => {
// Either we couldn't determine the mode or it's kind of medium.
// We should use an itermediate skin, or one defining the background.
}
}
请参阅附带的示例
策略
以下是 terminal-light 自动使用的各种策略来回答这个大问题
$COLORFGBG
策略
这个环境变量由一些终端设置,如 konsole 或 rxvt 系列。用户也可以设置它。其值类似于 15;0
,其中第二个数字是背景颜色的 ANSI 代码。
优点
- 查询环境变量是一个快速操作
缺点
- 当您更改终端的颜色时,这个环境变量并不总是立即更新
- 值不够精确:
0
是“深色”,15
是“浅色”,但实际的 RGB 颜色不确定,因为低 ANSI 代码通常被用户修改
“动态颜色” OSC 转义序列策略
现代终端实现了这个 xterm 扩展:一个查询,可以知道背景颜色为 RGB。
Terminal-light 在 stdout
上发送查询,在 stdin
上等待答案,超时时间为 20ms,然后解析这个答案。
优点
- 这在所有测试过的 Unix 终端上都能正常工作,包括在 MacOS 上
- 值是精确的(RGB)
- 当它可用时,值是更新的
缺点
- 此crate中Windows平台不支持以超时方式等待stdin(欢迎提供帮助)
- 这不是瞬时的,等待10毫秒以获得答案并不罕见
- 如果不适配的终端完全不回答,我们将等待20毫秒
- 它可能在某些终端多路复用器上失败
Terminal-light使用的全局策略
- 如果我们处于类Unix平台,我们将尝试使用转义序列策略
- 如果失败或我们不在Unix上,我们将尝试使用
$COLORFGBG
策略 - 如果没有解决方案,我们返回一个
TlError::Unsupported
错误
依赖项
~4–14MB
~180K SLoC