用C++编写一个ubuntu下改变终端字体颜色的小工具

Ubuntu下控制码:

常用的ANSI控制码如下(有些不支持):

\033[0m 关闭所有属性

\033[1m 高亮

\033[2m 亮度减半

\033[3m 斜体

\033[4m 下划线

\033[5m 闪烁

\033[6m 快闪

\033[7m 反显

\033[8m 消隐

\033[9m 中间一道横线

扫描二维码关注公众号,回复: 12283998 查看本文章

10-19 关于字体的

21-29 基本与1-9正好相反

30-37 设置前景色

40-47 设置背景色

30:黑

31:红

32:绿

33:黄

34:蓝色

35:紫色

36:深绿

37:白色

38 打开下划线,设置默认前景色

39 关闭下划线,设置默认前景色

40 黑色背景

41 红色背景

42 绿色背景

43 棕色背景

44 蓝色背景

45 品红背景

46 孔雀蓝背景

47 白色背景

48 不知道什么东西

49 设置默认背景色

50-89 没用

90-109 又是设置前景背景的,比之前的颜色浅

\033[nA 光标上移n行

\033[nB 光标下移n行

\033[nC 光标右移n行

\033[nD 光标左移n行

\033[y;xH设置光标位置

\033[2J 清屏

\033[K 清除从光标到行尾的内容

\033[s 保存光标位置

\033[u 恢复光标位置

\033[?25l 隐藏光标

\033[?25h 显示光标

源代码

#include <iostream>
#include <sstream>
#include <string>

using namespace std;

const int CMD_SETTYPE = 0;
const int CMD_SETBGCOLOR = 1;
const int CMD_SETFGCOLOR = 2;
const int CMD_HELP = 3;

const size_t STYLE_LENGTH = 10;
const string STYLE[] = {"DEFAULT", "INTENSITY", "HALF_INTENSITY", "ITALIC", "UNDERLINE", "FLASH",
						"FAST_FLASH", "INVERT_SHOW", "HIDE", "DELETELINE"};

const size_t BGCOLOR_LENGTH = 8;
const string BGCOLOR[] = {"BLACK", "RED", "GREEN", "YELLOW", "BLUE", "PURPLE", "PEACOCK_BLUE", "WHITE"};

const size_t FGCOLOR_LENGTH = 8;
const string FGCOLOR[] = {"BLACK", "RED", "GREEN", "YELLOW", "BLUE", "PURPLE", "PEACOCK_BLUE", "WHITE"};

using namespace std;

void toUpCase(string &);

void help()
{
	cout << "\n******设置终端颜色的工具******\n";
	cout << "参数列表:\n";
	cout << "-s: \n    后面接样式类型:default--默认样式,intensity--高亮加粗,half_intensity--高亮减半,italic--斜体,"
		 << "underline--下划线,flash--闪烁,fast_flash--快速闪烁,invert_show--反显,hide--隐藏,deleteline--删除线。\n\n";

	cout << "-bg:\n    设置背景颜色,后面接颜色:black--黑,red--红,green--绿,yellow--黄,blue--蓝,purple--紫,"
		 << "peacock_blue--孔雀蓝,white--白。\n\n";

	cout << "-fg:\n    设置字的颜色,后面接颜色:black--黑,red--红,green--绿,yellow--黄,blue--蓝,purple--紫,"
		 << "peacock_blue--孔雀蓝,white--白。\n\n";

	cout << "-h: \n    显示帮助。\n";
	cout << "\n*******************************\n";
}

string setBgColor(const string &color)
{
	string sColor(color);
	string result;
	string &s = sColor;
	toUpCase(sColor);
	size_t i = 0;
	while (i < BGCOLOR_LENGTH)
	{
		if (sColor.compare(BGCOLOR[i]) == 0)
		{
			break;
		}
		++i;
	}

	ostringstream osm;
	if (i >= BGCOLOR_LENGTH)
		return result;
	else
		i += 40;

	osm << i;
	result += "\033[" + osm.str() + "m";

	return result;
}

string setFgColor(const string &color)
{
	string sColor(color);
	string result;
	toUpCase(sColor);
	size_t i = 0;
	while (i < FGCOLOR_LENGTH)
	{
		if (sColor.compare(FGCOLOR[i]) == 0)
		{
			break;
		}
		++i;
	}

	ostringstream osm;
	if (i >= FGCOLOR_LENGTH)
		return result;
	else
		i += 30;

	osm << i;
	result += "\033[" + osm.str() + "m";

	return result;
}

string setStyle(const string &style)
{
	string sStyle = style;
	string result;
	toUpCase(sStyle);
	size_t i = 0;
	while (i < STYLE_LENGTH)
	{
		if (sStyle.compare(STYLE[i]) == 0)
		{
			break;
		}
		++i;
	}

	ostringstream osm;
	if (i >= STYLE_LENGTH)
		return result;

	osm << i;
	result += "\033[" + osm.str() + "m";

	return result;
}

int getParamType(const string &cmd)
{
	if (cmd.compare("-s") == 0)
	{
		return CMD_SETTYPE;
	}
	else if (cmd.compare("-bg") == 0)
	{
		return CMD_SETBGCOLOR;
	}
	else if (cmd.compare("-fg") == 0)
	{
		return CMD_SETFGCOLOR;
	}
	else if (cmd.compare("-h") == 0)
	{
		return CMD_HELP;
	}
	else
	{
		return -1;
	}
}

typedef string (*strFP)(const string &);
strFP getFuncByCmdType(int cmdType)
{
	switch (cmdType)
	{
	case CMD_SETTYPE:
		return setStyle;
	case CMD_SETBGCOLOR:
		return setBgColor;
	case CMD_SETFGCOLOR:
		return setFgColor;
	default:
		return nullptr;
	}
}

string format(int count, char *argv[])
{
	string result;
	if (count <= 1)
		return result;

	if (getParamType(argv[1]) == CMD_HELP){
		help();
		return result;
	}

	int i = 1;
	int cmdIndex = -1;
	while (i < count)
	{
		if(i+1 >= count)
			return result;
		
		cmdIndex = getParamType(argv[i]);
		strFP func = getFuncByCmdType(cmdIndex);
		if (func != nullptr)
		{
			result += func(argv[i + 1]);
		}
		else
		{
			result = "";
			return result;
		}

		i += 2;
	}

	return result;
}

void toUpCase(string &s)
{
	size_t len = s.length();
	size_t interval = 'a' - 'A';
	for (size_t i = 0; i < len; i++)
	{
		s[i] = (s[i] >= 97 && s[i] <= 122) ? s[i] - interval : s[i];
	}
}

int main(int argc, char *argv[])
{
	if (argc <= 1)
	{
		help();
		return 0;
	}

	string formatStr = format(argc, argv);

	cout << formatStr;
	return 0;
}

将代码保存为chcolor.cpp文件。

编译

g++ -std=c++11 -o chcolor chcolor.cpp

复制chcolor到/bin/目录下:sudo cp chcolor /bin/

使用

切换到root:sudo su

在终端下输入:chcolor -h

帮助

输入:chcolor -s underline -bg blue -fg yellow

可以同时设置样式,背景色,前景色:

cout << "\033[1;31;45mHello, ubuntu!\n";
//中间用;进行分隔

有个问题:如果不在root用户下使用则没有效果,请高手指点,谢谢!

猜你喜欢

转载自blog.csdn.net/hn_tzy/article/details/103514823