zoukankan      html  css  js  c++  java
  • linux 终端控制-- 多彩输出 格式排版

    linux 终端控制-- 多彩输出 格式排版
    在unix/linux的终端下,怎么控制终端输出的颜色和格式呢,当然了有专门的工具,tput,但是能被terminal直接读懂的格式化字符串更通用。
    先来个实际的例子,在屏幕的最上部的右侧输出当前时间,一秒刷新一次。可能会想到使用类似Ncurse的框架完成,不过这有简单的遵守terminal控制格式的字符流规则,我们为什么不用呢。
    1. while true; do echo -ne "e[se[0;$((COLUMNS-27))H$(date)e[u"; sleep 1; done &
    当然,有个tput的版本:
    1. while sleep 1;do tput sc;tput cup 0 $(($(tput cols)-29));date;tput rc;done &
    这里我写了个格式串的说明

    点击(此处)折叠或打开

    1. 终端显示的带有ansi控制的字符串 := (<控制单元>[字符串])+
    2.   控制单元 := (<起始标记><控制元素>)+<结束标记>
    3.   起始标记 := e | x1b | 33
    4.   结束标记 := m
    5.   字符串 := 要输入的字符
    6.     控制元素:= <元素起始标记>[ 0 1 4 5 7 8 前景色;背景色 背景色;前景色 |
    7.               光标相对位置控制 光标坐标 2J K s u ?25l ?25h ]
    8.     元素起始标记:=[
    9.       前景色 := 30-37 # 30:黑 31:红 32:绿 33:黄 34:蓝色 35:紫色 36:深绿 37:白色
    10.       背景色 := 40-47 # 40:黑 41:深红 42:绿 43:黄色 44:蓝色 45:紫色 46:深绿 47:白色
    11.       光标坐标 := y;xH # 不要忘记H
    12.       光标相对位置控制 := <n行><方向>
    13.          n行 := 整数
    14.          方向 := [ A B C D ] #分别代表了向 上 下 右 左
    15.       0 := 关闭所有属性
    16.       1 := 设置高亮度
    17.       4 := 下划线
    18.       5 := 闪烁
    19.       7 := 反显
    20.       8 := 消隐
    21.       2J := 清屏
    22.       K := 清除从光标到行尾的内容
    23.       s := 保存光标位置
    24.       u := 恢复光标位置
    25.       ?25I := 隐藏光标
    26.       ?25H := 显示光标
    这样解析下bash版本的字串 "e[se[0;$((COLUMNS-27))H$(date)e[u" 。
    e[s  :保存光标位置
    e[0;$((COLUMNS-27))H  在终端第一行的倒数27个字符的位置开始打印字符
    $(date)  打印date命令的输出
    [u 恢复光标位置

    这样控制太爽了!!!
    我写的这种格式看着不爽,参考这个
    字背景颜色 字颜色 ANSI控制码的说明
    40:黑 
    41:深红 
    42:绿 
    43:黄色 
    44:蓝色 
    45:紫色 
    46:深绿 
    47:白色 
    30:黑 
    31:红 
    32:绿 
    33:黄 
    34:蓝色 
    35:紫色 
    36:深绿 
    37:白色 
    033[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 显示光标

    例子
    输出白底红字的hellow word
    #bash版 

    1. echo -e '33[31;47;1mhello word33[0m'
    2. 或者
    3. printf 'e[31;47;1mhello word33[0m '
    c 版本

    1. #include <stdio.h>

    2. int main(){

    3.     printf("e[31;47;1mhello word33[0m ");
    4.     return 0;
    5. }
    python版本
    1. print "33[31;47;1mhello word33[0m "
    发现 python中e 是不可以使用的。

    在PS1中我们可以让提示更丰富多彩
    例如我的PS1变量为

    1. PS1="[e]2 u | d | H | wae[40;32;1m]h:[e[40;35;1m]W[e[40;33;1m]\$[e[0m] "
    如果在设置了PS1后,不能正确的计算自动换行,那么用'['和']'吧转义序列括起来试试
    ok了
    遇到中文字符就悲剧了,把标题中含有中文字符的选项去掉就行了,这是我在ubuntu的中文环境下测试的

    1. PS1="[e]2 u | | H | w e[40;32;1m]h:[e[40;35;1m]W[e[40;33;1m]\$[e[0m] "

    参考
    例子 http://www.commandlinefu.com/commands/view/11504/put-a-console-clock-in-top-right-corner
    介绍 http://blog.sina.com.cn/s/blog_704836f40101awsd.html
    tpu 介绍 http://www.ibm.com/developerworks/cn/aix/library/au-learningtput/index.html 
    很详细的 http://venus585625.iteye.com/blog/1174567 
  • 相关阅读:
    通向KDE4之路(七):文档反省器Okular和Ligature
    KDE言语绑定──KDEBindings
    KDEEdu(教诲性质软件)引见
    KDEMultimedia(KDE多媒体东西)引见
    KDESDK(KDE斥地工具)引见
    通向KDE4之路(十五):Konsole年夜整修
    企业信息化规划http://www.blogcn.com/User/fieldnet/index.html
    写在博客一周年
    Delphi 的内存操作函数(3): 给结构体指针分配内存
    在 Delphi 2009 中, for in 循环都能用在什么地方?
  • 原文地址:https://www.cnblogs.com/timssd/p/4781157.html
Copyright © 2011-2022 走看看