#include <stdio.h>
#include <time.h>
#include <memory.h>
#include <string.h>
#include <unistd.h>
int main(void)
{
time_t t_time;
char *a_time;
char *day;
char *hour;
day=(char*)malloc(15);
hour=(char*)malloc(15);
printf ("/033[2J");
if ( fork () )
exit(0);
while (1) {
printf("/33[s");
time (&t_time);
a_time=asctime(localtime(&t_time));
bzero(day,15);
bzero(hour,15);
memcpy(day, a_time, 10);
memcpy(hour, a_time+10, 10);
printf("/033[1;45H/033[K +-----------------------+");
printf("/033[2;45H/033[K + net_robber tell you: +");
printf("/033[3;45H/033[K + %s +",day);
printf("/033[4;45H/033[K + %s +",hour);
printf("/033[5;45H/033[K +-----------------------+");
printf("/33[u");
fflush(stdout);
sleep(1);
}
}
ANSI ESCAPE SEQUENCES实例掌握
/*------------CopyRight-------------
Name:ANSI ESCAPE SEQUENCES实例掌握
Version Number:1.0
Type:Article
Date:2005-08-06
Author:BitBull
Email:bitbull.cn(at)gmail.com
--------------------------------------------*/
0.想在单调的文本模式下写出五彩的程序吗?想让游标如您所愿的游走于屏幕任意地方吗?
这些只需要对ANSI ESCAPE SEQUENCES有点了解就能轻松办到,ANSI ESCAPE SEQUENCES又称为VT100系列控制码,国内译为ANSI控制码.顾名思义,需要VT100系列终端的支持,当然现在已经不在局限于VT100了,包括xterm,linux都能很好完成.(注:在linux下使用困难请man terminfo或termcap取得帮助,在DOS或Windows下,在config.sys中加入ansi.sys(或nansi)即可.)
文章里涉及测试均在以下系统里测试通过:
Red Hat Enterprise Linux AS release 4 (Nahant)
GNU/Linux kernel 2.6.9
GNU bash 3.00.15
80 X 24终端
1.做了简单的介绍后,我们从ANSI控制码的Set Graphics Rendition讲起,先来做个小演示
echo -ne "/33[31m"
终端字符是不是变红色了?这里echo只作为设置用,printf等命令都可代替.
ANSI控制码开始的标志都为ESC[,"ESC"对应ASCII码表的033(八进制),所以我们刚才用-e启用转义,/33来输入ESC,/33[31m即为ESC[31m.
如果不想使用转义,可直接输入,方法:ctrl-v,按ESC
┏━━━┳━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 前景 ┃ 背景 ┃ 颜 色 ┃
┣━━━╋━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ 30 ┃ 40 ┃ 黑色 ┃
┃ 31 ┃ 41 ┃ 红色 ┃
┃ 32 ┃ 42 ┃ 绿色 ┃
┃ 33 ┃ 43 ┃ 黄色 ┃
┃ 34 ┃ 44 ┃ 蓝色 ┃
┃ 35 ┃ 45 ┃ 紫红色 ┃
┃ 36 ┃ 46 ┃ 青蓝色 ┃
┃ 37 ┃ 47 ┃ 白色 ┃
┗━━━┻━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
我们可以把前景和背景色一起来设置(ESC[X;X;....;Xm,X替换具体色码)
echo -ne "/33[31;46m"
ANSI控制码除了颜色,还提供了一些"特效"喔, :-)
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 代 码 ┃ 功 能 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ 0 ┃ 所有属性 OFF,即返回正常显示模式 (Normal) ┃
┃ 1 ┃ 高亮度显示 (Bright) ┃
┃ 4 ┃ 加下划线 (Underline) ┃
┃ 5 ┃ 闪烁显示 (Flash) ┃
┃ 7 ┃ 反相显示 (Inverse) ┃
┃ 8 ┃ 不可见 (Invisable) ┃
┗━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
clear
试一试:
echo -ne "/33[5;32;45m"
HOHO~这里只为说明问题,颜色搭配确实很糟糕,各位自己来
要取消定义用
echo -ne "/33[0m"
记得把终端还原,再来做下面的例子
如果只要把用echo或printf输出的字符上色,其他终端颜色不改变,可以用类似
echo -e "/33[32mHello LinuxWorld/33[0m"
这次效果是不是还不错?
Set Graphics Rendition除了上面这些,官方文档还有下面控制码
ESC[=#;7h or Put screen in indicated mode where # is
ESC[=h or 0 for 40 x 25 black & white
ESC[=0h or 1 for 40 x 25 color
ESC[?7h 2 for 80 x 25 b&w
3 for 80 x 25 color
4 for 320 x 200 color graphics
5 for 320 x 200 b & w graphics
6 for 640 x 200 b & w graphics
7 to wrap at end of line
ESC[=#;7l or ESC[=l or Resets mode # set with above command
ESC[=0l or ESC[?7l
这些都为不常用的终端属性控制,各位有需要可自行设置,这里不做一一介绍.
2.下面我们来讲讲ANSI控制码的另一块比较常用的功能,Cursor Controls
clear
echo -ne "/33[10;40H" #把游标移动到第10行,第40列
echo -ne "/33[3A" #上移3行
echo -ne "/33[3B" #下移3行
echo -ne "/33[3C" #左移3列
echo -ne "/33[3D" #右移3列
echo -e "/33[10;40HHello LinuxWorld" #把字符显示在特定位置,其他ABCD控制可类似操作
echo -ne "/33[6n"
#报告游标坐标,参阅官方文档是"ESC[#;#R Reports current cursor line & column",不知道是系统差异还是手头的官方文档滞后了
echo -ne "/33[s" #保存当前游标位置
echo -ne "/33[u" #把刚才已经保存的游标位置恢复
游标控制就这么些指令,这里来作个汇总
┏━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┓
┃ 控 制 码 ┃ 功 能 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [X;YH ┃ 将游标移至第 X 行 Y 列的位置 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [nA ┃ 游标上移 n 行 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [nB ┃ 游标下移 n 行 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [nC ┃ 游标向右 n 列 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [nD ┃ 游标向左 n 列 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [6n ┃ 报告游标位置。(手头的官方档为[#;#R) ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [s ┃ 保存当前游标位置 ┃
┣━━━━━━━╋━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┫
┃ [u ┃ 把刚才已经保存的游标位置恢复 ┃
┗━━━━━━━┻━━━━━━━━━━━━━━━━━━━━━━━━━━━━━┛
3.Cursor Controls和Graphics Rendition的结合
clear
echo -ne "/33[5;31;42m/33[13;30HWarning:XXXXXXXXXXX/33[0m"
#通过上面的介绍,这句应该很容易看懂,效果是不是还不错
其他大家自己举一反三,结合ascii art,能做出多彩的字符画
4.Erase Functions
echo -ne "/33[2J" #擦除屏幕,和clear命令效果一样
echo -ne "/33[K" #擦除到行尾
5.接下来,我们要讲的是Keyboard Reassignments
这其实是个挺有意思的功能,键盘重赋值
ESC[65;81p #把ASCII码表的65的A变成81的Q,注意这里的数字为10进制
Fn按键对应的ASCII表:
F1=59,F2=60,F3=61,F4=62,F5=63
F6=64,F7=65,F8=66,F9=67,F10=68
6.最后,谈谈ANSI控制码的用途
由于ANSI ESCAPE SEQUENCES倚赖终端,不是倚赖语言,所以在shell,perl,c里应用都没有问题
这里给个C实例,基本没啥变化
#include <stdio.h>
main()
{
printf("/33[32mHello LinuxWorld/33[0m/n");
}
编译看看,和echo的效果是不是一样
至于ANSI控制码到底能干嘛,这也要靠读者发挥自己的想像喽,比如把终端打扮得漂亮点,或者写漂亮点的文本游戏,把警告等提示信息用红色加强..................太多太多了
很高兴您能看到这里,希望文章有您需要的东西.
转载请保持版权声明完整,谢谢