#style #ansi #color #terminal-colors #byte-string #color-string #bold

停止维护 ansi_term

ANSI终端颜色和样式(加粗、下划线)库

28个版本

使用旧的Rust 2015

0.12.1 2019年9月2日
0.12.0 2019年7月14日
0.11.0 2018年3月2日
0.10.2 2017年10月2日
0.3.0 2014年11月26日

命令行界面 中排名第 556

Download history 506827/week @ 2024-03-14 539413/week @ 2024-03-21 539887/week @ 2024-03-28 541391/week @ 2024-04-04 536806/week @ 2024-04-11 554196/week @ 2024-04-18 512414/week @ 2024-04-25 530372/week @ 2024-05-02 520249/week @ 2024-05-09 566598/week @ 2024-05-16 553920/week @ 2024-05-23 580900/week @ 2024-05-30 557485/week @ 2024-06-06 571938/week @ 2024-06-13 555270/week @ 2024-06-20 462542/week @ 2024-06-27

每月下载量 2,262,126
2,156 个Crates(直接使用700个)中使用

MIT协议 MIT

74KB
881

rust-ansi-term 构建状态 构建状态 覆盖率状态

这是一个用于控制ANSI终端上颜色和格式的库,如红色加粗文本或蓝色下划线文本。

查看Rustdoc

安装

此crate与Cargo一起工作。将以下内容添加到您的Cargo.toml依赖项部分

[dependencies]
ansi_term = "0.12"

基本用法

您需要关注此crate中的三个主要类型:ANSIStringStyleColour

Style包含样式信息:前景和背景颜色、文本是否加粗、闪烁或其他属性。Colour枚举表示可用的颜色。而ANSIString是一个与Style配对的字符串。

Color也是Colour的别名。

要格式化字符串,请在StyleColour上调用paint方法,并将您要格式化的字符串作为参数传递。例如,下面是如何获取一些红色文本的方法:

use ansi_term::Colour::Red;

println!("This is in red: {}", Red.paint("a red string"));

需要注意的是,paint方法实际上并不返回带有ANSI控制字符的字符串。相反,它返回一个ANSIString值,它有一个Display实现,当格式化时返回字符。这允许字符串以最小的String分配在幕后执行。

如果您确实想获取转义码,则可以将ANSIString转换为字符串,就像转换任何其他Display值一样。

use ansi_term::Colour::Red;

let red_string = Red.paint("a red string").to_string();

针对Windows 10用户的通知:在Windows 10上,应用程序必须首先启用ANSI支持。

let enabled = ansi_term::enable_ansi_support();

粗体、下划线、背景和其他样式

对于比纯前景颜色更改更复杂的任何内容,您需要自己构造Style值,而不是从Colour开始。您可以通过基于新创建的Style(使用Style::new())的方法链来实现。每个方法创建一个具有特定属性的新样式。例如:

use ansi_term::Style;

println!("How about some {} and {}?",
         Style::new().bold().paint("bold"),
         Style::new().underline().paint("underline"));

为了简洁,这些方法也针对Colour值实现了,因此您可以在不需要从空的Style值开始的情况下为样式提供前景颜色。

use ansi_term::Colour::{Blue, Yellow};

println!("Demonstrating {} and {}!",
         Blue.bold().paint("blue bold"),
         Yellow.underline().paint("yellow underline"));

println!("Yellow on blue: {}", Yellow.on(Blue).paint("wow!"));

您可以使用以下样式列表:bolddimmeditalicunderlineblinkreversehiddenon用于背景颜色。

在某些情况下,您可能发现更改现有Style的前景色比从适当的Colour开始更容易。您可以使用fg方法来做到这一点。

use ansi_term::Style;
use ansi_term::Colour::{Blue, Cyan, Yellow};

println!("Yellow on blue: {}", Style::new().on(Blue).fg(Yellow).paint("yow!"));
println!("Also yellow on blue: {}", Cyan.on(Blue).fg(Yellow).paint("zow!"));

您可以使用normal方法将Colour转换为Style。这将产生与直接在Colour上使用paint方法相同的ANSIString,但在某些情况下非常有用:例如,您可能有一个返回Styles的方法,并且需要用相同类型的值来表示“红色粗体”和“红色但不粗体”的样式。《Style结构体还提供了一个Default实现,如果您想要一个没有任何设置的风格。

use ansi_term::Style;
use ansi_term::Colour::Red;

Red.normal().paint("yet another red string");
Style::default().paint("a completely regular string");

扩展颜色

您可以通过使用Colour::Fixed变体来访问256色的扩展范围,该变体接受要使用的颜色编号作为参数。这可以包含在任何您使用Colour的地方。

use ansi_term::Colour::Fixed;

Fixed(134).paint("A sort of light purple");
Fixed(221).on(Fixed(124)).paint("Mustard in the ketchup");

这些值的前十六个与正常和粗体标准颜色变体相同。您可以使用这些作为Fixed颜色,但这样做也没有什么好处。

您还可以通过使用Colour::RGB变体来访问完整的24位颜色,该变体接受红色、绿色和蓝色各自的u8参数。

use ansi_term::Colour::RGB;

RGB(70, 130, 180).paint("Steel blue");

组合连续的彩色字符串

将ANSI转义码写入终端的好处是它们可以叠加:如果跟在彩色字符串后面的文本风格相似,您不需要在每个彩色字符串后都使用重置码。例如,如果您想在蓝色文本后面跟上有加粗的蓝色文本,您可以发送蓝色ANSI码,然后发送加粗的ANSI码,最后再发送重置码,而无需在这两个字符串之间添加额外的重置码。

这个库可以优化这种情况下打印的ANSI码,使您的终端渲染器的使用更方便。结构体ANSIStrings接受一个由几个ANSIString值组成的切片,并将在其格式化过程中迭代每个值,只打印需要更新的样式代码。

下面的代码片段使用此功能将红色加粗显示的二进制数字包裹在红色但不加粗的括号中。

use ansi_term::Colour::Red;
use ansi_term::{ANSIString, ANSIStrings};

let some_value = format!("{:b}", 42);
let strings: &[ANSIString<'static>] = &[
    Red.paint("["),
    Red.bold().paint(some_value),
    Red.paint("]"),
];

println!("Value: {}", ANSIStrings(strings));

这里有几个需要注意的地方。首先,paint方法可以接受任一一个拥有者String或一个借用&str。内部,一个ANSIString持有一个写时复制的(Cow)字符串值,以同时处理拥有和借用的字符串。这里使用这种方法来显示String,即format!调用的结果,使用与一些静态可用的&str切片相同的机制。其次,ANSIStrings的值与其单例对应物以相同的方式工作,具有仅在有需要时执行格式的Display实现。

字节字符串

这个库还支持格式化[u8]字节字符串;这支持处理未知编码文本的应用程序。StyleColour支持绘制[u8]值,产生一个ANSIByteString。此类型不实现Display,因为它可能不包含UTF-8,但它提供了一个write_to方法,可以将结果写入实现了Write的任何值。

use ansi_term::Colour::Green;

Green.paint("user data".as_bytes()).write_to(&mut std::io::stdout()).unwrap();

类似地,类型ANSIByteStrings支持以最少的转义序列写入一系列ANSIByteString值。

use ansi_term::Colour::Green;
use ansi_term::ANSIByteStrings;

ANSIByteStrings(&[
    Green.paint("user data 1\n".as_bytes()),
    Green.bold().paint("user data 2\n".as_bytes()),
]).write_to(&mut std::io::stdout()).unwrap();

依赖项

~0–340KB