程序员初见Linux

12-2 提示符添加颜色及光标移动

2020-08-10  本文已影响0人  見贤思齊_

三、添加颜色

大多数终端都会响应某些非打印字符序列,来控制光标位置、字符属性(如:颜色、粗体、文本闪烁)等内容

1.字符颜色

(1)是什么?

字符颜色是由发送到终端仿真器的一个 ANSI 转义代码来控制的,该转义代码嵌入到要显示的字符流中。(简单来讲,字符颜色就是1个ANSI转义代码)

控制代码不会“ 打印 ”到屏幕上,而是被终端解释为一条指令。在shell提示符中使用的转义字符表中可看到,“\ [ ” 和 "\ ]"这两个序列用来封装非打印字符串。

① 字符颜色(1个ASNI转义代码)组成

1个 ANSI 转义代码以八进制 033开始(该代码由转义键[escape key]产生),后面跟着1个可选的字符属性,之后是1条指令。

Ⅰ.示例

将文本颜色设置为正常(attribute=0)、黑色的代码是 \033[0;30m 。

(正常所代表的0,在转移代码中就是 “ ; ” 前的0)

② 设置文本颜色的转义序列(准)

以下列出了可用的文本颜色。

Ⅰ.注意:

这些颜色分为 2 组区别在于是否应用了粗体(bold)属性(1),这个属性使得色彩分为深色和浅色。

字符序列 文本颜色
\033[0;30m 黑色
\033[0;31m 红色
\033[0;32m 绿色
\033[0;33m 棕色
\033[0;34m 蓝色
\033[0;35m 紫色
\033[0;36m 青色
\033[0;37m 浅灰色
\033[1;30m 深灰色
\033[1;31m 淡红色
\033[1;32m 淡绿色
\033[1;33m 黄色
\033[1;34m 淡蓝色
\033[1;35m 淡紫色
\033[1;36m 淡青色
\033[1;37m 白色
③ 设置文本背景颜色的转义序列

使用以下代码可以设置文本的背景颜色,背景颜色不支持粗体属性

字符序列 背景颜色
\033[0;40m 黑色
\033[0;41m 红色
\033[0;42m 绿色
\033[0;43m 棕色
\033[0;44m 蓝色
\033[0;45m 紫色
\033[0;46m 青色
\033[0;47m 淡灰色

(2)怎么做?

以下通过几个实例来实现对字符颜色的改变。

① 红色提示符

将相应的转义代码插入到提示符的开端

PS1="\[\033[0;31m\]<\u@\h \W>\$ "
# 显示<用户名@不带域名的主机名 当前工作目录最后一部分>$ ,最后的空格会将$与光标分隔开

可以看到,提示符已经变成红色,但是此时用户输入的文本也变成了红色。

要修复这个问题,可以在提示符的末尾插入另一条转义代码,以通知终端仿真器恢复到原来的颜色。

PS1="\[\033[0;31m\]<\u@\h \W>\$\[\033[0m\]"
# \033[0m 这段代码告诉终端仿真器恢复到原来的颜色。
② 红色背景的提示符

通过为第一个转义代码做些许修改,就可创建带有红色背景的提示符。

PS1="\[\033[0;41m\]<\u@\h \W>\$\[\033[0m\]"

尝试下其他颜色的代码,看看分别能创造出何样的提示符。

(3)注意

文本除了正常(0)和粗体(1)属性外,还可以设置为下划线(4)、闪烁(5)和斜体(7)。

但为了维持好的品味,许多终端仿真器拒绝使用闪烁属性。

四、移动光标

转义代码也可以用来定位光标。比如在提示符出现的时候,这些转义代码通常用来在屏幕的不同位置(比如屏幕上方的一角)显示一个时钟或其它信息。

1.光标移动转义序列

字符序列 动作
\033[1;cH 将光标移动至 1 行 c 列。
\033[nA 将光标向上移动 n 行。
\033[nB 将光标向下移动 n 行。
\033[nC 将光标向前移动 n 个字符。
\033[nD 将光标向后移动 n 个字符。
\033[2J 清空屏幕并将光标移动至左上角(即第0行第0列)
\033[K 清空当前光标位置到行末的内容。
\033[s 存储当前光标位置。
\033[u 恢复之前存储的光标位置。

(1)示例

通过使用这些代码,用户可以构建这样的一条提示符。

每当提示符出现时,屏幕的上方会绘制出一个红色的横条,横条中有用黄色文本显示的时间。

用于提示符的编码就是以下这一个看起来很可怕的字符串:

PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "

# 这个一定要好好理解,其实就是多个转移字段在一起,分解开看就很容易。
① 复杂提示符的分解

以下是对上面这个字符串的每一部分进行分析。

字符序列 动作
\ [ 开始一个非打印字符序列。其真正目的是为了让 bash 正确计算可见提示符的长度。如果没有该字符,命令行编辑功能无法正确定位光标
\033[s 存储当前光标位置。在屏幕的顶端横条绘制完成并显示时间后,读取并使光标返回此位置。(需要注意的是,一些终端仿真器不支持该代码。)
\033[0;0H 将光标移动至 0 行 0 列(左上角)。
\033[0;41m 将背景颜色设置为红色。
\033[K 清空光标当前位置(左上角)到行末的内容。因为现在背景颜色已经是红色了,所以清空后的行就是红色,也就绘制出了红色的横条。(需要注意的是:清空行的内容并不会改变光标的位置,光标仍处于左上角)
\033[1;33m 将文本颜色设置为黄色。
\t 显示当前时间。尽管这是一个可打印的元素,但是还是将其包含在提示符非打印部分中,这是因为 bash 在计算可见提示符的长度时,不应当将其计算在内
\033[0m 关闭颜色。对文本和背景均有效。
\033[u 恢复之前存储的光标位置。
\ ] 结束非打印的字符序列。
<\u@\h \W>$ 提示符字符串。

五、保存提示符

很显然,用户不会想要每次都输入这样一长串代码,所以就需要将提示符存储在某个地方

将提示符添加到 .bashrc文件中是一个一劳永逸的解决办法,也就是将以下两行代码添加到文件中。

PS1="\[\033[s\033[0;0H\033[0;41m\033[K\033[1;33m\t\033[0m\033[u\]<\u@\h \W>\$ "

export PS1
上一篇 下一篇

猜你喜欢

热点阅读