Rust
在 Rust 中使用 ANSI 转义码
Rust 字符串字面量原生支持 \x1b —— println!("\x1b[31mred\x1b[0m") 无需任何依赖即可工作。需要符合人体工学的彩色 API,可选 owo-colors(零分配,编译期)或 colored(更动态)。要省掉 NO_COLOR / isatty 判断,termcolor 与 Go 一脉相承。完整 TUI 场景(窗口、光标、原始模式、鼠标)用 crossterm;更高层的布局再叠加 ratatui(原 tui-rs)。
推荐库
- owo-colors
对几乎所有字符串类型的零分配彩色扩展 ——
"error".red().bold()不产生堆分配。通过 const generics 提供编译期颜色样式。仅 ANSI,不查询 terminfo。 - colored
最早的
"text".red().bold()API —— 比 owo-colors 更灵活(运行期调色板、自定义颜色),代价是会分配内存。默认遵循NO_COLOR与CLICOLOR_FORCE。 - termcolor
ripgrep 的彩色输出层 —— 基于
WriteColortrait 封装 stdout/stderr:POSIX 走 ANSI,Windows 走控制台 API。ColorChoice::Auto自动处理 NO_COLOR 与 isatty。 - crossterm
完整的跨平台终端工具包 —— 光标、颜色、原始模式、备用屏、鼠标 / 焦点 / 粘贴事件、键盘输入。
ratatui的底层。CLI 直接用 crossterm;全屏 TUI 在其之上叠加 ratatui。
常用写法
fn main() {
println!("\x1b[1;31merror:\x1b[0m permission denied");
}use owo_colors::OwoColorize;
fn main() {
println!("{} permission denied", "error:".red().bold());
}use std::io::Write;
use termcolor::{Color, ColorChoice, ColorSpec, StandardStream, WriteColor};
fn main() -> std::io::Result<()> {
// Auto downgrades to plain text under NO_COLOR= or non-tty stdout.
let mut out = StandardStream::stdout(ColorChoice::Auto);
out.set_color(ColorSpec::new().set_fg(Some(Color::Red)).set_bold(true))?;
write!(out, "error:")?;
out.reset()?;
writeln!(out, " permission denied")?;
Ok(())
}use std::io::{stdout, Write};
use crossterm::{
cursor::{Hide, Show},
execute,
terminal::{disable_raw_mode, enable_raw_mode},
};
fn main() -> std::io::Result<()> {
enable_raw_mode()?;
execute!(stdout(), Hide)?;
// ... read keys, render UI ...
execute!(stdout(), Show)?; // always restore
disable_raw_mode()?;
Ok(())
}