Chinaunix首页 | 论坛 | 博客
  • 博客访问: 313494
  • 博文数量: 66
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 509
  • 用 户 组: 普通用户
  • 注册时间: 2015-04-29 13:56
文章分类
文章存档

2018年(2)

2017年(6)

2016年(34)

2015年(24)

我的朋友

分类: LINUX

2016-01-26 17:15:57

转载自:http://www.cnblogs.com/clover-toeic/p/4031618.html

     在Linux终端下调试程序时,有时需要输出大量信息。若能控制字体的颜色和显示方式,可使输出信息对比鲜明,便于调试时观察数据。

     终端的字符颜色由转义序列(Escape Sequence)控制,是文本模式下的系统显示功能,与具体语言无关。

     转义序列以控制字符'ESC'开头。该字符的ASCII码十进制表示为27,十六进制表示为0x1B,八进制表示为033。多数转义序列超过两个字符,故通常以'ESC'和左括号'['开头。该起始序列称为控制序列引导符(CSI,Control Sequence Intro),通常由'\033['或'\e['代替。

     通过转义序列设置终端显示属性时,可采用以下格式:

     \033[ Param {;Param;...}m 或 \e[ Param {;Param;...}m

     其中,'\033['或'\e['引导转义序列,'m'表示设置属性并结束转义序列。Param为属性值,{...}表示可选(多个参数之间用分号隔开,与顺序无关)。

     注意,转义序列可被控制字符'CAN'(Cancel )和'SUB'(Substitute)中断。

     转义序列相关的常用参数如下(通过man console_codes命令可查看更多的参数描述):

     显示:0(默认)、1(粗体/高亮)、22(非粗体)、4(单条下划线)、24(无下划线)、5(闪烁)、25(无闪烁)、7(反显、翻转前景色和背景色)、27(无反显)

     颜色:0(黑)、1(红)、2(绿)、 3(黄)、4(蓝)、5(洋红)、6(青)、7(白)

     前景色为30+颜色值,如31表示前景色为红色;背景色为40+颜色值,如41表示背景色为红色。

     调色效果如下图所示:

 

     因此,通过转义序列设置终端显示属性时,常见格式为:

     \033[显示方式;前景色;背景色m输出字符串\033[0m 或 \e[显示方式;前景色;背景色m输出字符串\033[0m

     此外,还有一些ANSI控制码,如:nA (光标上移n行 )、nB(光标下移n行 )、nC(光标右移n行 )、nD (光标左移n行 )、2J(清屏)、K(清除从光标到行尾的内容)、s(保存光标位置)、u(恢复光标位置)、?25l(隐藏光标)、?25l(显示光标)。     其中 ,'\033[0m'用于恢复默认的终端输出属性,否则会影响后续的输出。

     基于常用参数,可定义如下单一控制宏,用于printf系列语句:

#define NONE                 "\e[0m"
#define BLACK                "\e[0;30m"
#define L_BLACK              "\e[1;30m"
#define RED                  "\e[0;31m"
#define L_RED                "\e[1;31m"
#define GREEN                "\e[0;32m"
#define L_GREEN              "\e[1;32m"
#define BROWN                "\e[0;33m"
#define YELLOW               "\e[1;33m"
#define BLUE                 "\e[0;34m"
#define L_BLUE               "\e[1;34m"
#define PURPLE               "\e[0;35m"
#define L_PURPLE             "\e[1;35m"
#define CYAN                 "\e[0;36m"
#define L_CYAN               "\e[1;36m"
#define GRAY                 "\e[0;37m"
#define WHITE                "\e[1;37m"


#define BOLD                 "\e[1m"
#define UNDERLINE            "\e[4m"
#define BLINK                "\e[5m"
#define REVERSE              "\e[7m"
#define HIDE                 "\e[8m"
#define CLEAR                "\e[2J"
#define CLRLINE              "\r\e[K" //or "\e[1K\r"

    编写测试代码验证转义序列控制的效果:

int main(void)
{
    printf("This is a character control test!\n" );
    sleep(3);
    printf("[%2u]" CLEAR "CLEAR\n" NONE, __LINE__);


    printf("[%2u]" BLACK "BLACK " L_BLACK "L_BLACK\n" NONE, __LINE__);
    printf("[%2u]" RED "RED " L_RED "L_RED\n" NONE, __LINE__);
    printf("[%2u]" GREEN "GREEN " L_GREEN "L_GREEN\n" NONE, __LINE__);
    printf("[%2u]" BROWN "BROWN " YELLOW "YELLOW\n" NONE, __LINE__);
    printf("[%2u]" BLUE "BLUE " L_BLUE "L_BLUE\n" NONE, __LINE__);
    printf("[%2u]" PURPLE "PURPLE " L_PURPLE "L_PURPLE\n" NONE, __LINE__);
    printf("[%2u]" CYAN "CYAN " L_CYAN "L_CYAN\n" NONE, __LINE__);
    printf("[%2u]" GRAY "GRAY " WHITE "WHITE\n" NONE, __LINE__);


    printf("[%2u]\e[1;31;40m Red \e[0m\n",  __LINE__);


    printf("[%2u]" BOLD "BOLD\n" NONE, __LINE__);
    printf("[%2u]" UNDERLINE "UNDERLINE\n" NONE, __LINE__);
    printf("[%2u]" BLINK "BLINK\n" NONE, __LINE__);
    printf("[%2u]" REVERSE "REVERSE\n" NONE, __LINE__);
    printf("[%2u]" HIDE "HIDE\n" NONE, __LINE__);


    printf("Cursor test begins!\n" );
    printf("=======!\n" );
    sleep(10);
    printf("[%2u]" "\e[2ACursor up 2 lines\n" NONE, __LINE__);
    sleep(10);
    printf("[%2u]" "\e[2BCursor down 2 lines\n" NONE, __LINE__);
    sleep(5);
    printf("[%2u]" "\e[?25lCursor hide\n" NONE, __LINE__);
    sleep(5);
    printf("[%2u]" "\e[?25hCursor display\n" NONE, __LINE__);
    sleep(5);


    printf("Test ends!\n" );
    sleep(3);
    printf("[%2u]" "\e[2ACursor up 2 lines\n" NONE, __LINE__);
    sleep(5);
    printf("[%2u]" "\e[KClear from cursor downward\n" NONE, __LINE__);


    return 0 ;
}

执行结果截图如下:



============
通过输入到控制台的字符流来控制,不同的字符流标识着不同的颜色,详细解释如下:

  • 字颜色:30-----------39
30:黑31:红32:绿33:黄34:蓝色35:紫色36:深绿37:白色
  • 字背景颜色范围:40----49
40:黑41:深红42:绿43:黄色44:蓝色45:紫色46:深绿47:白色
  • ANSI控制码的说明
\33[0m 关闭所有属性\33[1m 设置高亮度\33[4m 下划线
\33[5m 闪烁\33[7m 反显\33[8m 消隐
\33[30m -- \33[37m 设置前景色
\33[40m -- \33[47m 设置背景色
\33[nA 光标上移n行\33[nB 光标下移n行
\33[nC 光标右移n行\33[nD 光标左移n行
\33[y;xH设置光标位置\33[2J 清屏
\33[K 清除从光标到行尾的内容\33[s 保存光标位置
\33[u 恢复光标位置\33[?25l 隐藏光标
\33[?25h 显示光标

样例:
> echo -e "\033[0;36;40m深绿字体,黑色字体背景\033[0;37;41m 白色字体,红色字体背景bbbbbbbbbb\033[0m"
控制linux终端的打印字符颜色和位置 - strive_only - 奋斗,我要一直奋斗...

应用2:用控制台输出彩色字或彩色背景  
echo -e  "\033[34;1mthis is high lighted blue \033[0m"  
c 代码: printf("\033[34;1mthis is high lighted blue \033[0m\n" );
尾部的\033[0m 恢复了系统默认颜色

应用

2

:用控制台输出彩色字或彩色背景

 

echo -e  

"\033[34;1mthis is high lighted blue \033[0m" 

 

代码

: printf("\033[34;1mthis is high lighted blue \033[0m\n" ); 

尾部的

\033[0m 

恢复了系统默认颜色



阅读(1414) | 评论(0) | 转发(0) |
0

上一篇:isspace返回值判断

下一篇:ARM汇编指令

给主人留下些什么吧!~~