#terminal #background-color #light #dark #terminal-colors #color

bin+lib terminal-light

告诉您您的终端是深色还是浅色

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命令行界面

Download history 986/week @ 2024-04-27 947/week @ 2024-05-04 866/week @ 2024-05-11 833/week @ 2024-05-18 882/week @ 2024-05-25 1128/week @ 2024-06-01 950/week @ 2024-06-08 1184/week @ 2024-06-15 974/week @ 2024-06-22 843/week @ 2024-06-29 1426/week @ 2024-07-06 1452/week @ 2024-07-13 1272/week @ 2024-07-20 1391/week @ 2024-07-27 1400/week @ 2024-08-03 1796/week @ 2024-08-10

6,012 每月下载次数
用于 20 个 Crates (13 个直接)

MIT 许可证

40KB
100

MIT Latest Version docs Chat on Miaou

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.
    }
}

请参阅附带的示例

dark

light

策略

以下是 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使用的全局策略

  1. 如果我们处于类Unix平台,我们将尝试使用转义序列策略
  2. 如果失败或我们不在Unix上,我们将尝试使用$COLORFGBG策略
  3. 如果没有解决方案,我们返回一个TlError::Unsupported错误

依赖项

~4–14MB
~180K SLoC