Rust终端颜色控制库clicolors-control的使用:跨平台ANSI颜色输出与终端样式管理

use clicolors_control::{set_colors_enabled, colors_enabled, set_auto_colors, reset_colors};

fn main() {
    // 检查当前是否启用了颜色输出
    if colors_enabled() {
        println!("颜色输出已启用");
    } else {
        println!("颜色输出未启用");
    }

    // 手动启用颜色输出
    set_colors_enabled(true);
    
    // 打印带颜色的文本
    println!("\x1b[31m这是红色文本\x1b[0m");
    println!("\x1b[32m这是绿色文本\x1b[0m");
    println!("\x1b[34m这是蓝色文本\x1b[0m");

    // 设置自动检测颜色支持
    set_auto_colors(true);

    // 重置所有颜色设置
    reset_colors();

    // 再次检查颜色状态
    match colors_enabled() {
        true => println!("颜色输出当前已启用"),
        false => println!("颜色输出当前已禁用"),
    }
}

以下是一个更完整的示例demo,展示clicolors-control库的进阶用法:

use clicolors_control::*;

fn main() {
    // 初始化颜色设置(自动检测终端支持)
    init_color_support();
    
    // 创建样式构建器
    let mut style = StyleBuilder::new();
    
    // 设置文本颜色和背景色
    style.color(Color::Red)
         .background(Color::White)
         .bold(true);
    
    // 应用样式并打印文本
    println!("{}", style.apply("这是带样式的文本"));
    
    // 打印不同颜色和样式的文本
    println!(
        "{} {} {}", 
        Color::Green.paint("绿色文本"),
        Style::new().underline().apply("下划线文本"),
        Color::Blue.bold().paint("蓝色加粗文本")
    );
    
    // 禁用颜色输出
    set_colors_enabled(false);
    println!("颜色禁用后: {}", Color::Yellow.paint("这不会显示颜色"));
    
    // 重新启用颜色
    set_colors_enabled(true);
    
    // 打印所有可用颜色
    println!("所有基本颜色:");
    for color in Color::iter() {
        print!("{} ", color.paint(format!("{:?}", color)));
    }
    println!();
    
    // 重置终端颜色
    reset_colors();
    println!("颜色已重置为默认值");
}

这个完整示例展示了:

  1. 初始化颜色支持
  2. 使用StyleBuilder构建复杂样式
  3. 直接使用Color枚举设置颜色
  4. 组合多种文本样式
  5. 遍历所有可用颜色
  6. 动态启用/禁用颜色输出
  7. 重置终端颜色状态

该库支持所有标准ANSI颜色代码,并会自动处理Windows平台上的颜色转换,确保跨平台兼容性。


1 回复

Rust终端颜色控制库clicolors-control使用指南

clicolors-control是一个Rust库,用于跨平台的终端颜色输出和样式管理,支持ANSI颜色代码。

基本功能

  • 跨平台支持(Windows/macOS/Linux)
  • 检测终端颜色支持能力
  • 启用/禁用颜色输出
  • 自动处理不同平台的ANSI转义序列

安装

Cargo.toml中添加依赖:

[dependencies]
clicolors-control = "1.0"

基本用法

1. 检查颜色支持

use clicolors_control::{colors_enabled, set_colors_enabled};

fn main() {
    // 检查当前是否启用了颜色
    println!("Colors enabled: {}", colors_enabled());
    
    // 手动启用颜色
    set_colors_enabled(true);
    
    // 再次检查
    println!("Colors now enabled: {}", colors_enabled());
}

2. 输出彩色文本

use clicolors_control::set_colors_enabled;

fn main() {
    // 确保颜色已启用
    set_colors_enabled(true);
    
    // 输出彩色文本
    println!("\x1b[31mThis is red text\x1b[0m");
    println!("\x1b[32;1mThis is bold green text\x1b[0m");
    println!("\x1b[44;37mThis is white text on blue background\x1b[0m");
}

3. 自动检测并处理颜色

use clicolors_control::{colors_enabled, set_colors_enabled};

fn color_print(text: &str, color_code: &str) {
    if colors_enabled() {
        println!("\x1b[{}m{}\x1b[0m", color_code, text);
    } else {
        println!("{}", text);
    }
}

fn main() {
    // 根据环境自动决定是否启用颜色
    set_colors_enabled(clicolors_control::should_attempt_colors());
    
    color_print("Error message", "31;1");  // 红色粗体
    color_print("Success message", "32");  // 绿色
    color_print("Warning message", "33");  // 黄色
}

高级用法

1. 强制启用/禁用颜色

use clicolors_control::{force_colors, force_no_colors};

fn main() {
    // 强制启用颜色,即使终端不支持
    force_colors();
    
    // 强制禁用颜色
    force_no_colors();
}

2. 创建颜色辅助函数

use clicolors_control::set_colors_enabled;

macro_rules! colorize {
    ($text:expr, $code:expr) => {
        format!("\x1b[{}m{}\x1b[0m", $code, $text)
    };
}

fn main() {
    set_colors_enabled(true);
    
    println!("{}", colorize!("Red text", "31"));
    println!("{}", colorize!("Blue background", "44"));
    println!("{}", colorize!("Bold cyan", "36;1"));
}

颜色代码参考

常用ANSI颜色代码:

  • 文本颜色:

    • 30: 黑色
    • 31: 红色
    • 32: 绿色
    • 33: 黄色
    • 34: 蓝色
    • 35: 紫色
    • 36: 青色
    • 37: 白色
  • 背景颜色:

    • 40: 黑色背景
    • 41: 红色背景
    • 42: 绿色背景
    • 43: 黄色背景
    • 44: 蓝色背景
    • 45: 紫色背景
    • 46: 青色背景
    • 47: 白色背景
  • 样式:

    • 0: 重置所有属性
    • 1: 粗体/高亮
    • 2: 暗淡
    • 3: 斜体
    • 4: 下划线
    • 5: 闪烁
    • 7: 反显
    • 8: 隐藏
    • 9: 删除线

可以组合使用,用分号分隔,例如:"31;1;4"表示红色、粗体、带下划线。

注意事项

  1. 在Windows上可能需要启用虚拟终端支持(Windows 10+原生支持)
  2. 始终记得在彩色文本后重置属性(使用\x1b[0m
  3. 使用colors_enabled()检查颜色是否真的可用
  4. 考虑提供无颜色回退方案,以便在不支持颜色的终端上正常显示

完整示例代码

use clicolors_control::{colors_enabled, set_colors_enabled, force_colors, force_no_colors};

// 彩色打印函数
fn colored_print(text: &str, color: u8, bold: bool, underline: bool) {
    if colors_enabled() {
        let mut code = color.to_string();
        if bold { code.push_str(";1"); }
        if underline { code.push_str(";4"); }
        println!("\x1b[{}m{}\x1b[0m", code, text);
    } else {
        println!("{}", text);
    }
}

fn main() {
    // 自动检测颜色支持
    set_colors_enabled(clicolors_control::should_attempt_colors());
    
    // 打印测试文本
    colored_print("这是错误信息", 31, true, false);  // 红色粗体
    colored_print("这是成功信息", 32, false, true); // 绿色带下划线
    colored_print("这是警告信息", 33, false, false); // 黄色
    
    // 强制模式演示
    force_no_colors();
    println!("\n强制禁用颜色后:");
    colored_print("这段文字不会有颜色", 34, true, false);
    
    force_colors();
    println!("\n强制启用颜色后:");
    colored_print("这段文字会有颜色", 35, false, true);
    
    // 重置颜色状态
    set_colors_enabled(clicolors_control::should_attempt_colors());
}
回到顶部