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
每月下载量 2,262,126
在 2,156 个Crates(直接使用700个)中使用
74KB
881 行
rust-ansi-term
这是一个用于控制ANSI终端上颜色和格式的库,如红色加粗文本或蓝色下划线文本。
查看Rustdoc
安装
此crate与Cargo一起工作。将以下内容添加到您的Cargo.toml
依赖项部分
[dependencies]
ansi_term = "0.12"
基本用法
您需要关注此crate中的三个主要类型:ANSIString
、Style
和Colour
。
Style
包含样式信息:前景和背景颜色、文本是否加粗、闪烁或其他属性。Colour
枚举表示可用的颜色。而ANSIString
是一个与Style
配对的字符串。
Color
也是Colour
的别名。
要格式化字符串,请在Style
或Colour
上调用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!"));
您可以使用以下样式列表:bold
、dimmed
、italic
、underline
、blink
、reverse
、hidden
和on
用于背景颜色。
在某些情况下,您可能发现更改现有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]
字节字符串;这支持处理未知编码文本的应用程序。Style
和Colour
支持绘制[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