22次重大发布

0.50.1 2024年7月23日
0.50.0 2024年1月22日
0.49.0 2023年7月22日
0.47.0 2023年3月13日
0.29.0 2021年3月30日

#7 in 命令行界面

Download history 1105631/week @ 2024-05-03 1131871/week @ 2024-05-10 1155756/week @ 2024-05-17 1115224/week @ 2024-05-24 1241855/week @ 2024-05-31 1224936/week @ 2024-06-07 1216808/week @ 2024-06-14 1283636/week @ 2024-06-21 1177999/week @ 2024-06-28 1207790/week @ 2024-07-05 1262682/week @ 2024-07-12 1336159/week @ 2024-07-19 1314700/week @ 2024-07-26 1303736/week @ 2024-08-02 1386192/week @ 2024-08-09 1395284/week @ 2024-08-16

5,654,921 每月下载量
用于 640 个crate(93直接)

MIT 许可证

105KB
1.5K SLoC

nu-ansi-term

这是rust-ansi-term的一个副本,但是将颜色更改为了Color,并添加了浅前景颜色(90-97)以及浅背景颜色(100-107)。

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

查看Rustdoc

安装

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

[dependencies]
nu-ansi-term = "0.49"

# optional gnu-legacy mode to have two digit instead of one digit styles
nu-ansi-term = { version="0.49", features=["gnu_legacy"] }

基本用法

在这个crate中,有三个主要类型需要您关注:AnsiStringStyleColor

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

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

use nu_ansi_term::Color::Red;

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

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

如果您确实想要获取转义码,那么您可以像其他任何Display值一样将AnsiString转换为字符串

use nu_ansi_term::Color::Red;

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

Windows 10 用户注意事项:在 Windows 10 上,应用程序必须首先启用 ANSI 支持

let enabled = nu_ansi_term::enable_ansi_support();

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

对于比纯前景色更改更复杂的情况,您需要自己构建 Style 值,而不是从 Color 开始。您可以通过基于新 Style 的方法链来实现,该 Style 是通过 Style::new() 创建的。每个方法都会创建一个新的样式,该样式具有特定的属性集。例如

use nu_ansi_term::Style;

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

为了简洁,这些方法也针对 Color 值实现了,因此您可以在不开始一个空的 Style 值的情况下为您的样式指定前景色

use nu_ansi_term::Color::{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 的前景比从适当的 Color 开始更容易。您可以使用 fg 方法来实现这一点

use nu_ansi_term::Style;
use nu_ansi_term::Color::{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 方法将 Color 转换为 Style。这将产生与直接在 Color 上使用 paint 方法相同的 AnsiString,但在某些情况下很有用:例如,您可能有一个返回 Styles 的方法,需要用相同类型的值表示“红色粗体”和“红色但不是粗体”的样式。如果想要有没有任何设置的样式,Style 结构体还有一个 Default 实现。

use nu_ansi_term::Style;
use nu_ansi_term::Color::Red;

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

有时在应用新的样式/颜色之前硬重置样式/颜色是可取的。要重置和应用,可以在 ColorStyle 结构体上使用 reset_before_style 方法。

use nu_ansi_term::Style;

println!("\x1b[33mHow about some {} \x1b[33mand {}?\x1b[0m",
         Style::new().reset_before_style().bold().paint("bold"),
         Style::new().reset_before_style().underline().paint("underline"));

扩展颜色

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

use nu_ansi_term::Color::Fixed;

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

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

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

use nu_ansi_term::Color::RGB;

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

组合连续着色的字符串

将 ANSI 转义码写入终端的好处是它们会 堆叠:如果跟随它的文本具有相似的风格,则不需要在每个着色字符串后结束重置代码。例如,如果您想要一些蓝色文本后跟一些蓝色粗体文本,可以发送蓝色 ANSI 代码,然后发送粗体 ANSI 代码,最后发送重置代码,而无需在这两个字符串之间有额外的代码。

这个包可以优化在类似情况下打印的ANSI代码,使终端渲染器的使用更加方便。《AnsiStrings》结构体接受多个《AnsiString》值的切片,并遍历它们,只打印格式化过程中需要更新的样式代码。

以下代码片段使用这个功能将红色加粗的二进制数字放在红色但不加粗的括号中

use nu_ansi_term::Color::Red;
use nu_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`》和《Color`》支持绘制《[u8]`值,结果是一个《AnsiByteString`》。这个类型没有实现《Display`》,因为它可能不包含UTF-8,但它提供了一个《write_to`》方法来将结果写入任何实现了《Write`》的值。

use nu_ansi_term::Color::Green;

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

类似地,类型《AnsiByteStrings`》支持以最小的转义序列写入《AnsiByteString`》值的列表

use nu_ansi_term::Color::Green;
use nu_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-8.5MB
~64K SLoC