在 Ubuntu 终端输出不同颜色、粗体、下划线或其他样式的字体

news2024/11/19 3:42:07

嗯。调试时总发现自己打印的调试信息太过普通、单调,于是乎……

Notice

要在终端实现字体的特殊样式,通常通过使用特殊的控制字符来实现,而不是通过某语言本身的功能来实现。
在大多数终端中,可以使用 ANSI 转义序列来设置字体的颜色。ANSI 转义序列是一系列以 ESC 开头的字符,用于控制文本终端的属性,包括颜色、格式和光标位置等。ANSI 转义序列以 \033[ 开头,后跟属性代码,以设置不同的终端属性。
请注意,不同的终端可能对 ANSI 转义序列的支持程度不同。大多数 Unix/Linux 终端和 Windows 上的一些控制台仿真器(如 ConEmu、Cygwin 和 Windows Terminal)都支持 ANSI 转义序列。

Color

包括前景色和背景色。前景色指的是字体本身的颜色,背景色指的是字体的背景颜色。
一些常见颜色:黑色、红色、绿色、黄色、蓝色、洋红色、青色、白色。
先来看一下效果:
在这里插入图片描述

#define

见名知意,不再赘述。

#define ANSI_COLOR_RESET   "\x1b[0m"		// 重置

#define ANSI_COLOR_BLACK   "\033[30m"		// 前景色
#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_WHITE   "\033[37m"

#define ANSI_BG_BLACK       "\x1b[40m"		// 背景色
#define ANSI_BG_RED         "\x1b[41m"
#define ANSI_BG_GREEN       "\x1b[42m"
#define ANSI_BG_YELLOW      "\x1b[43m"
#define ANSI_BG_BLUE        "\x1b[44m"
#define ANSI_BG_MAGENTA     "\x1b[45m"
#define ANSI_BG_CYAN        "\x1b[46m"
#define ANSI_BG_WHITE       "\x1b[47m"

#define ANSI_COLOR_BRIGHT_BLACK   "\x1b[90m"		// 前景亮色
#define ANSI_COLOR_BRIGHT_RED     "\x1b[91m"
#define ANSI_COLOR_BRIGHT_GREEN   "\x1b[92m"
#define ANSI_COLOR_BRIGHT_YELLOW  "\x1b[93m"
#define ANSI_COLOR_BRIGHT_BLUE    "\x1b[94m"
#define ANSI_COLOR_BRIGHT_MAGENTA "\x1b[95m"
#define ANSI_COLOR_BRIGHT_CYAN    "\x1b[96m"
#define ANSI_COLOR_BRIGHT_WHITE   "\x1b[97m"

#define ANSI_BG_BRIGHT_BLACK       "\x1b[100m"		// 背景亮色
#define ANSI_BG_BRIGHT_RED         "\x1b[101m"
#define ANSI_BG_BRIGHT_GREEN       "\x1b[102m"
#define ANSI_BG_BRIGHT_YELLOW      "\x1b[103m"
#define ANSI_BG_BRIGHT_BLUE        "\x1b[104m"
#define ANSI_BG_BRIGHT_MAGENTA     "\x1b[105m"
#define ANSI_BG_BRIGHT_CYAN        "\x1b[106m"
#define ANSI_BG_BRIGHT_WHITE       "\x1b[107m"

Example

#include <iostream>

// 有的宏定义没有用到,但懒得删掉了 ×_×

#define ANSI_COLOR_BLACK   "\033[30m"
#define ANSI_COLOR_RED     "\x1b[31m"
#define ANSI_COLOR_GREEN   "\x1b[32m"
#define ANSI_COLOR_YELLOW  "\x1b[33m"
#define ANSI_COLOR_BLUE    "\x1b[34m"
#define ANSI_COLOR_MAGENTA "\x1b[35m"
#define ANSI_COLOR_CYAN    "\x1b[36m"
#define ANSI_COLOR_WHITE   "\033[37m"

#define ANSI_COLOR_RESET   "\x1b[0m"

#define ANSI_BG_BLACK       "\x1b[40m"
#define ANSI_BG_RED         "\x1b[41m"
#define ANSI_BG_GREEN       "\x1b[42m"
#define ANSI_BG_YELLOW      "\x1b[43m"
#define ANSI_BG_BLUE        "\x1b[44m"
#define ANSI_BG_MAGENTA     "\x1b[45m"
#define ANSI_BG_CYAN        "\x1b[46m"
#define ANSI_BG_WHITE       "\x1b[47m"

#define ANSI_COLOR_BRIGHT_RED     "\x1b[91m"
#define ANSI_COLOR_BRIGHT_GREEN   "\x1b[92m"
#define ANSI_COLOR_BRIGHT_YELLOW  "\x1b[93m"
#define ANSI_COLOR_BRIGHT_BLUE    "\x1b[94m"
#define ANSI_COLOR_BRIGHT_MAGENTA "\x1b[95m"
#define ANSI_COLOR_BRIGHT_CYAN    "\x1b[96m"
#define ANSI_COLOR_BRIGHT_WHITE   "\x1b[97m"

#define ANSI_BG_BRIGHT_BLACK      "\x1b[100m"

int main() {

    std::cout << "\033[31mThis text will be red. \033[0m" << std::endl;
    std::cout << "\x1b[33mThis text will be yellow. \033[0m" << std::endl;
    std::cout << ANSI_COLOR_RED << ANSI_BG_YELLOW << "Hello, world!" << ANSI_COLOR_RESET << std::endl;
    std::cout << ANSI_BG_GREEN << ANSI_BG_MAGENTA << "¡Hola, mundo!" << ANSI_COLOR_RESET << std::endl;
    std::cout << ANSI_BG_YELLOW << ANSI_BG_CYAN << "Hallo, welt!" << ANSI_COLOR_RESET << std::endl;
    std::cout << ANSI_COLOR_BRIGHT_BLUE << "Your future will be bright!" << ANSI_COLOR_RESET << std::endl;
    std::cout << ANSI_COLOR_BLUE << "Your future will be bright!" << ANSI_COLOR_RESET << std::endl;

    std::cout << ANSI_COLOR_WHITE << "This is white. " << ANSI_COLOR_RESET << std::endl;
    std::cout << ANSI_COLOR_BRIGHT_WHITE << "This is bright white. " << ANSI_COLOR_RESET << std::endl;

    std::cout << ANSI_COLOR_WHITE << ANSI_BG_BRIGHT_BLACK << "BrightBlack. " << ANSI_COLOR_RESET << std::endl;
    std::cout << ANSI_COLOR_WHITE << ANSI_BG_BLACK << "Black. " << ANSI_COLOR_RESET << std::endl;

    return 0;
}

outcome

实现效果如下:
在这里插入图片描述

ROS_INFO

那么如何使用 ROS_INFO 来输出彩色字体呢?

	// 创建一个字符串流
    std::stringstream ss;
    
    // 向字符串流中添加需要的信息和 ANSI 转义序列
    ss << "\x1b[31m\x1b[43m" << "Hello, world!" << "\x1b[0m";
    
    // 使用 ROS_INFO 输出字符串流中的内容
    ROS_INFO("%s", ss.str().c_str());

以上代码来自 GPT。但保险起见,在向流中添加信息和转义序列时,尤其需要反复使用同一字符串流时,最好先执行以下操作:

ss.str("");

Bold & Underline

在这里插入图片描述

#define

见名知意,不再赘述。

#define ANSI_BOLD_ON        "\x1b[1m"
#define ANSI_BOLD_OFF       "\x1b[22m"

#define ANSI_UNDERLINE_ON   "\x1b[4m"
#define ANSI_UNDERLINE_OFF  "\x1b[24m"

#define ANSI_COLOR_RESET    "\x1b[0m"

Example

#include <iostream>

// ANSI 转义序列,用于设置字体加粗和取消加粗
#define ANSI_BOLD_ON      "\x1b[1m"
#define ANSI_BOLD_OFF     "\x1b[22m"

// ANSI 转义序列,用于设置下划线和取消下划线
#define ANSI_UNDERLINE_ON   "\x1b[4m"
#define ANSI_UNDERLINE_OFF  "\x1b[24m"

// ANSI 转义序列,用于重置终端颜色
#define ANSI_COLOR_RESET    "\x1b[0m"

int main() {
    // 输出加粗文字
    std::cout << ANSI_BOLD_ON << "Bold Text" << ANSI_COLOR_RESET << std::endl;
    // 输出带下划线的文字
    std::cout << ANSI_UNDERLINE_ON << "Underlined Text" << ANSI_COLOR_RESET << std::endl;

    return 0;
}

outcome

实现效果如下:
在这里插入图片描述

ROS_INFO

同上。

Other styles

在这里插入图片描述

#define

见名知意,不再赘述。

#define ANSI_BLINK_ON       "\x1b[5m"   // 开启闪烁
#define ANSI_BLINK_OFF      "\x1b[25m"  // 关闭闪烁

#define ANSI_REVERSE_ON     "\x1b[7m"   // 开启反显
#define ANSI_REVERSE_OFF    "\x1b[27m"  // 关闭反显

#define ANSI_HIDDEN_ON      "\x1b[8m"   // 开启隐藏
#define ANSI_HIDDEN_OFF     "\x1b[28m"  // 关闭隐藏

#define ANSI_STRIKETHROUGH  "\x1b[9m"   // 开启删除线
#define ANSI_STRIKETHROUGH  "\x1b[99m"  // 关闭删除线

#define ANSI_RESET          "\x1b[0m"

Example

#include <iostream>

// ANSI 转义序列,用于设置终端效果
#define ANSI_BLINK_ON       "\x1b[5m"   // 开启闪烁
#define ANSI_BLINK_OFF      "\x1b[25m"  // 关闭闪烁
#define ANSI_REVERSE_ON     "\x1b[7m"   // 开启反显
#define ANSI_REVERSE_OFF    "\x1b[27m"  // 关闭反显
#define ANSI_HIDDEN_ON      "\x1b[8m"   // 开启隐藏
#define ANSI_HIDDEN_OFF     "\x1b[28m"  // 关闭隐藏
#define ANSI_STRIKETHROUGH  "\x1b[9m"   // 开启删除线

// ANSI 转义序列,用于重置终端效果
#define ANSI_RESET          "\x1b[0m"

int main() {
    // 闪烁效果
    std::cout << ANSI_BLINK_ON << "Blinking Text" << ANSI_RESET << std::endl;
    std::cout << ANSI_BLINK_OFF << "No Blinking Text" << ANSI_RESET << std::endl;

    // 反显效果
    std::cout << ANSI_REVERSE_ON << "Reversed Text" << ANSI_RESET << std::endl;
    std::cout << ANSI_REVERSE_OFF << "No Reversed Text" << ANSI_RESET << std::endl;

    // 隐藏效果
    std::cout << ANSI_HIDDEN_ON << "Hidden Text" << ANSI_RESET << std::endl;
    std::cout << ANSI_HIDDEN_OFF << "No Hidden Text" << ANSI_RESET << std::endl;

    // 删除线效果
    std::cout << ANSI_STRIKETHROUGH << "Strikethrough Text" << ANSI_RESET << std::endl;

    return 0;
}

outcome

实现效果如下:
在这里插入图片描述
在这里插入图片描述

ROS_INFO

#include <ros/ros.h>
#include <sstream>

// 自定义的打印函数,用于在ROS_INFO中使用特定标记实现效果
void customInfo(const std::string& message) {
    std::cout << message << std::endl;
}

int main(int argc, char** argv) {
    ros::init(argc, argv, "example_node");
    ros::NodeHandle nh;

    // 创建一个字符串流
    std::stringstream ss;
    // 向字符串流中添加需要的信息,并使用特定标记来表示效果
    ss << "[blink]Hello, world![/blink] ";
    ss << "[reverse]Reversed Text[/reverse] ";
    ss << "[hidden]Hidden Text[/hidden] ";
    ss << "[strikethrough]Strikethrough Text[/strikethrough]";
    // 使用自定义的打印函数打印信息
    customInfo(ss.str());

    ros::spin();
    return 0;
}

Combination

以上(并不互相冲突的)诸多效果可组合使用。略。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1484909.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

爬虫入门到精通_实战篇7(Requests+正则表达式爬取猫眼电影)_ 抓取单页内容,正则表达式分析,保存至文件,开启循环及多线程

1 目标 猫眼榜单TOP100&#xff1a;https://www.maoyan.com/board 2 流程框架 抓取单页内容&#xff1a;利用requests请求目标站点&#xff0c;得到单个网页HTML代码&#xff0c;返回结果。正则表达式分析&#xff1a;根据HTML代码分析得到电影名称,主演,上映时间,评分,图片…

overleaf上传到arxiv 参考文献无法引用(?)

记一下overleaf上传到arxiv的bug 参考文献无法引用&#xff08;&#xff1f;&#xff09; 因为需要上传bbl文件而不是bib 用overleaf生成bbl 另外需要将bbl和txt的文件名设置成一样的

详解 JavaScript 中的数组

详解 JavaScript 中的数组 创建数组 注&#xff1a;在JS中的数组不要求元素的类型&#xff0c;元素类型可以一样&#xff0c;也可以不一样 1.使用 new 关键字创建 let array new Array()2.使用字面量方式创建(常用) let array1 [1,2,3,"4"]获取数组元素 使用下…

VMware Workstation Pro 17 虚拟机软件安装教程

VMware软件介绍 VMware Workstation是一款功能强大的桌面虚拟计算机软件&#xff0c;提供用户可在宿主机操作系统上同时运行不同的操作系统(虚拟化技术)&#xff0c;所运行的操作系统可方便的进行复制和移动&#xff0c;突破传统架构的限制。本文将以VMware Workstation Pro 1…

【leetcode】圆圈中最后剩下的数字

目录 1. 问题 2. 思路 3. 代码 4. 运行 1. 问题 本题即为典型的约瑟夫问题&#xff0c;通过递推公式倒推出问题的解。原始问题是从n个人中每隔m个数踢出一个人&#xff0c;原始问题变成从n-1个人中每隔m个数踢出一个人…… 示例 1&#xff1a; 输入: n 5, m 3 输出: 3…

Java快读

java的快读 (1)BufferedReader BufferedReader br new BufferedReader(new InputStreamReader(System.in));//定义对象String[] strings br.readLine().split(" ");//读取一行字符串&#xff0c;以空格为分隔转化为字符串数组int n Integer.parseInt(strings[0])…

H12-821_108

108.路由器R1和R2分别使用GigabitEthernet0/0/0直连&#xff0c;并试图建立OSFP邻居&#xff0c;然而邻居关系并没有成功建立&#xff0c;排错过程如图所示。那么以下哪一个操作可以使R1和R2邻居管理正常建立&#xff1f; A. [R2] ospf 1 [R2-ospf-1]area 0 [R2-ospf-1-area-0.…

主网NFT的发布合约

1.什么是nft? NFT:Non-fungible-token 非同质化货币 2.新建suimove项目 使用sui move new 项目名命令新建sui move项目 sui move new nft_qyx项目结构如下: 3.写nft合约 module qyx123::nft{use sui::object::{Self, UID};use sui::transfer;use sui::tx_context::{Sel…

【Git】merge时报错:refusing to merge unrelated histories

文章目录 一、问题二、解决办法1、将feature分支的东西追加到master分支中2、将feature里的东西直接覆盖到master分支中 一、问题 今天将feature分支合并到master时报错&#xff1a;refusing to merge unrelated histories&#xff08;拒绝合并无关历史&#xff09; 报错原因&…

基于YOLOv8/YOLOv7/YOLOv6/YOLOv5的交通信号标志识别软件(Python+PySide6界面+训练代码)

摘要&#xff1a;开发高效的交通信号标志识别软件对于提升道路安全和自动驾驶技术发展具有重要意义。本篇博客详细阐述了如何利用深度学习构建一个交通信号标志识别软件&#xff0c;并提供了完整的实现代码。该软件基于先进的YOLOv8算法&#xff0c;并对比了YOLOv7、YOLOv6、YO…

电脑开机显示器没有信号而且键盘鼠标不亮怎么解决?

大家在使用电脑的过程,开机没有反应是比较经常遇到的问题,就有用户反映说自己的电脑启动之后,显示器无信号,键盘鼠标灯也不亮,怎么操作都没有效果。对开机有影响的硬件主要是内存条,内存条是非常容易松动的,而且金手指如果氧化了,都会导致开不了机 大家在使用电脑的过程…

多维时序 | Matlab实现GRNN广义回归神经网络多变量时间序列预测

文章目录 效果一览文章概述源码设计参考资料效果一览

SpringCloud(18)之Sleuth +Zipkin链路追踪

一、Zipkin介绍 Zipkin是一个开放源代码分布式的跟踪系统&#xff0c;它可以帮助收集服务的时间数据&#xff0c;以解决微服务架构中的延迟问 题&#xff0c;包括数据的收集、存储、查找和展现。每个服务向zipkin报告计时数据&#xff0c;zipkin会根据调用关系通 过Zipkin UI…

「滚雪球学Java」:集合(章节汇总)

咦咦咦&#xff0c;各位小可爱&#xff0c;我是你们的好伙伴——bug菌&#xff0c;今天又来给大家普及Java SE相关知识点了&#xff0c;别躲起来啊&#xff0c;听我讲干货还不快点赞&#xff0c;赞多了我就有动力讲得更嗨啦&#xff01;所以呀&#xff0c;养成先点赞后阅读的好…

基于Java SSM框架实现众筹平台网站系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现众筹平台网站系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring…

GO—函数

Go 语言支持普通函数、匿名函数和闭包&#xff0c;从设计上对函数进行了优化和改进&#xff0c;让函数使用起来更加方便。 Go 语言的函数属于“一等公民”&#xff08;first-class&#xff09;&#xff0c;也就是说&#xff1a; 函数本身可以作为值进行传递。支持匿名函数和闭…

Vivado的DocNav打不开,报错:Premature end of document, found at line number 1

需确认软件版本是否支持电脑系统版本&#xff0c;目前 2023.2 DocNav版本是支持win11 22H2&#xff1b;下载了2023.2版本&#xff0c;安装过程中重新安装DocNav。再打开DocNav&#xff0c;然后更新DocNav左上角的Catalog到最新就好了&#xff08;此时要开全局代理&#xff09;。…

CSS锥形渐变:conic-gradient()

画一个扇形图&#xff0c;使用常规方法可能很难画&#xff0c;但是用锥形渐变的话非常好画 <style>.pattern{width: 100px; height: 100px;border-radius: 50%;background: conic-gradient(yellow 30deg , black 30deg , black 90deg , yellow 90deg ,yellow 150d…

黑马鸿蒙学习笔记1:TEXT组件

业余时间学习下黑马鸿蒙课程&#xff0c;主要截取重要的PPT学习&#xff1a; 其实就是用$r&#xff08;&#xff09;的方法&#xff0c;去调用本地化资源文件&#xff0c;可以做多语言了。 比如每个语言目录下都有个string.json文件&#xff0c;然后用键值对name,value的方式搭…

代码随想录day11(1)字符串:反转字符串中的单词 (leetcode151)

题目要求&#xff1a;给定一个字符串&#xff0c;将其中单词顺序反转&#xff0c;且每个单词之间有且仅有一个空格。 思路&#xff1a;因为本题没有限制空间复杂度&#xff0c;所以首先想到的是用split直接分割单词&#xff0c;然后将单词倒叙相加。 但如果想让空间复杂度为O…