Rust终端美化库terminal-light的使用,打造高效美观的命令行界面

Rust终端美化库terminal-light的使用,打造高效美观的命令行界面

terminal-light是一个Rust库,用于检测终端是深色还是浅色背景。它提供以下功能:

  • 获取背景颜色(RGB或ANSI格式)
  • 获取背景颜色的亮度值(从0[黑色]到1[白色])

使用示例

基本用法

// 判断终端亮度是否大于0.6(浅色模式)
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 => {
        // 使用"浅色模式"皮肤
    }
    Ok(luma) if luma < 0.2 => {
        // 使用"深色模式"皮肤
    }
    _ => {
        // 无法确定模式或亮度中等
        // 应该使用中间皮肤或定义背景的皮肤
    }
}

完整示例代码

use terminal_light;

fn main() {
    // 获取终端亮度值
    match terminal_light::luma() {
        Ok(luma) => {
            println!("检测到终端亮度值: {}", luma);
            
            // 根据亮度值选择皮肤
            if luma > 0.85 {
                println!("使用浅色模式皮肤");
                apply_light_theme();
            } else if luma < 0.2 {
                println!("使用深色模式皮肤");
                apply_dark_theme();
            } else {
                println!("使用中性模式皮肤");
                apply_neutral_theme();
            }
        }
        Err(e) => {
            eprintln!("无法确定终端亮度: {:?}", e);
            println!("使用默认皮肤");
            apply_default_theme();
        }
    }
}

// 应用浅色主题
fn apply_light_theme() {
    // 实现浅色主题应用逻辑
    println!("应用浅色主题...");
}

// 应用深色主题
fn apply_dark_theme() {
    // 实现深色主题应用逻辑
    println!("应用深色主题...");
}

// 应用中色主题
fn apply_neutral_theme() {
    // 实现中性主题应用逻辑
    println!("应用中色主题...");
}

// 应用默认主题
fn apply_default_theme() {
    // 实现默认主题应用逻辑
    println!("应用默认主题...");
}

实现策略

terminal-light使用以下策略来确定终端背景:

  1. $COLORFGBG策略:检查环境变量,快速但不精确
  2. 动态颜色OSC转义序列策略:发送查询获取RGB值,精确但有延迟
  3. 全局策略:
    • 在Unix-like平台优先尝试转义序列策略
    • 失败或非Unix平台尝试$COLORFGBG策略
    • 最后返回TlError::Unsupported错误

安装

作为库安装

在项目目录中运行:

cargo add terminal-light

或在Cargo.toml中添加:

terminal-light = "1.8.0"

许可证

MIT许可证


1 回复

Rust终端美化库terminal-light使用指南

terminal-light是一个轻量级的Rust库,用于快速美化命令行终端界面,提供颜色、样式、进度条等常见终端美化功能。

安装方法

在Cargo.toml中添加依赖:

[dependencies]
terminal-light = "0.3"

基本功能

1. 文本颜色和样式

use terminal_light::style;

fn main() {
    // 彩色文本
    println!("{}", style("红色文本").red());
    println!("{}", style("绿色文本").green());
    println!("{}", style("蓝色文本").blue());
    
    // 加粗和斜体
    println!("{}", style("加粗文本").bold());
    println!("{}", style("斜体文本").italic());
    
    // 组合样式
    println!("{}", style("加粗红色文本").red().bold());
}

2. 进度条

use terminal_light::progress_bar;
use std::{thread, time};

fn main() {
    let mut pb = progress_bar(100);
    pb.set_style("█", " ", "|", "|");
    
    for i in 0..100 {
        pb.update(i);
        thread::sleep(time::Duration::from_millis(50));
    }
    pb.finish("完成!");
}

3. 表格输出

use terminal_light::table;

fn main() {
    let data = vec![
        vec!["项目", "数量", "价格"],
        vec!["苹果", "5", "$2.50"],
        vec!["香蕉", "3", "$1.20"],
        vec!["橙子", "8", "$3.60"],
    ];
    
    table(&data)
        .header_style(style("").bold().underline())
        .column_alignment(1, terminal_light::Alignment::Right)
        .column_alignment(2, terminal_light::Alignment::Right)
        .print();
}

高级功能

1. 自定义主题

use terminal_light::{Style, Theme};

fn main() {
    let my_theme = Theme::new()
        .set_success_style(Style::new().green().bold())
        .set_error_style(Style::new().red().underline())
        .set_warning_style(Style::new().yellow().italic());
    
    println!("{}", my_theme.success("操作成功!"));
    println!("{}", my_theme.error("发生错误!"));
    println!("{}", my_theme.warning("警告信息!"));
}

2. 交互式选择菜单

use terminal_light::menu;

fn main() {
    let options = vec!["选项1", "选项2", "选项3"];
    let selection = menu("请选择一个选项:", &options)
        .highlight_style(style("").bg_blue())
        .show();
    
    println!("你选择了: {}", options[selection]);
}

3. 终端动画

use terminal_light::animation;
use std::thread;
use std::time::Duration;

fn main() {
    let frames = vec![
        "[    ]",
        "[=   ]",
        "[==  ]",
        "[=== ]",
        "[ ===]",
        "[  ==]",
        "[   =]",
        "[    ]",
    ];
    
    let anim = animation(&frames)
        .set_interval(Duration::from_millis(100))
        .set_style(style("").cyan());
    
    anim.start();
    thread::sleep(Duration::from_secs(3));
    anim.stop();
}

完整示例代码

// 完整终端美化应用示例
use terminal_light::{
    style, 
    progress_bar, 
    table, 
    Style, 
    Theme, 
    menu, 
    animation,
    Alignment
};
use std::{
    thread, 
    time::{Duration, Instant}
};

fn main() {
    // 1. 文本样式演示
    println!("\n=== 文本样式演示 ===");
    println!("{}", style("默认文本"));
    println!("{}", style("红色文本").red());
    println!("{}", style("绿色背景文本").bg_green());
    println!("{}", style("加粗下划线文本").bold().underline());
    
    // 2. 进度条演示
    println!("\n=== 进度条演示 ===");
    let mut pb = progress_bar(50);
    pb.set_style(">", "=", "|", "|");
    let start = Instant::now();
    for i in 0..=50 {
        pb.update(i);
        thread::sleep(Duration::from_millis(100));
    }
    pb.finish(&format!("完成! 耗时: {:?}", start.elapsed()));
    
    // 3. 表格输出演示
    println!("\n=== 表格输出演示 ===");
    let sales_data = vec![
        vec!["产品", "季度", "销量", "增长率"],
        vec!["手机", "Q1", "1200", "+5.2%"],
        vec!["笔记本", "Q1", "850", "+12.8%"],
        vec!["平板", "Q1", "600", "+8.3%"],
    ];
    
    table(&sales_data)
        .header_style(style("").cyan().bold())
        .column_alignment(2, Alignment::Right)
        .column_alignment(3, Alignment::Right)
        .print();
    
    // 4. 自定义主题演示
    println!("\n=== 自定义主题演示 ===");
    let app_theme = Theme::new()
        .set_success_style(Style::new().green().bold())
        .set_error_style(Style::new().red().underline().bold())
        .set_highlight_style(Style::new().bg_blue().white());
    
    println!("{}", app_theme.success("数据保存成功!"));
    println!("{}", app_theme.error("错误: 文件未找到"));
    
    // 5. 交互式菜单演示
    println!("\n=== 交互式菜单演示 ===");
    let languages = vec!["Rust", "Go", "Python", "JavaScript"];
    let choice = menu("请选择你最喜欢的语言:", &languages)
        .highlight_style(app_theme.get_highlight_style().clone())
        .show();
    
    println!("{}", style(format!("你选择了: {}", languages[choice])).green());
    
    // 6. 终端动画演示
    println!("\n=== 终端动画演示 ===");
    let spinner_frames = vec![
        "⠋", "⠙", "⠹", "⠸", "⠼", "⠴", "⠦", "⠧", "⠇", "⠏"
    ];
    
    let spinner = animation(&spinner_frames)
        .set_interval(Duration::from_millis(100))
        .set_style(style("").yellow());
    
    println!("处理中... ");
    spinner.start();
    thread::sleep(Duration::from_secs(3));
    spinner.stop();
    println!("{}", app_theme.success("处理完成!"));
}

最佳实践

  1. 错误处理:对用户输入进行验证,使用适当的颜色标记错误
  2. 响应式设计:检测终端宽度并相应调整输出
  3. 性能考虑:频繁更新UI时使用terminal_light::flush()减少重绘次数

terminal-light库简单易用,适合快速为Rust命令行程序添加美观的界面元素,同时保持轻量级和跨平台兼容性。

回到顶部