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

时间:2022-07-23
本文章向大家介绍12-2 提示符添加颜色及光标移动,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

三、添加颜色

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

1.字符颜色

(1)是什么?

字符颜色是由发送到终端仿真器的一个 ANSI 转义代码来控制的,该转义代码嵌入到要显示的字符流中。(简单来讲,字符颜色就是1个ANSI转义代码) 控制代码不会“ 打印 ”到屏幕上,而是被终端解释为一条指令。在shell提示符中使用的转义字符表中可看到,“ [ ” 和 " ]"这两个序列用来封装非打印字符串。

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

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

Ⅰ.示例

将文本颜色设置为正常(attribute=0)、黑色的代码是 33[0;30m 。 (正常所代表的0,在转移代码中就是 “ ; ” 前的0)

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

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

Ⅰ.注意:

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

字符序列

文本颜色

33[0;30m

黑色

33[0;31m

红色

33[0;32m

绿色

33[0;33m

棕色

33[0;34m

蓝色

33[0;35m

紫色

33[0;36m

青色

33[0;37m

浅灰色

33[1;30m

深灰色

33[1;31m

淡红色

33[1;32m

淡绿色

33[1;33m

黄色

33[1;34m

淡蓝色

33[1;35m

淡紫色

33[1;36m

淡青色

33[1;37m

白色

③ 设置文本背景颜色的转义序列

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

字符序列

背景颜色

33[0;40m

黑色

33[0;41m

红色

33[0;42m

绿色

33[0;43m

棕色

33[0;44m

蓝色

33[0;45m

紫色

33[0;46m

青色

33[0;47m

淡灰色

(2)怎么做?

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

① 红色提示符

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

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

可以看到,提示符已经变成红色,但是此时用户输入的文本也变成了红色。 要修复这个问题,可以在提示符的末尾插入另一条转义代码,以通知终端仿真器恢复到原来的颜色。

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

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

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

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

(3)注意

文本除了正常(0)和粗体(1)属性外,还可以设置为下划线(4)、闪烁(5)和斜体(7)。 但为了维持好的品味,许多终端仿真器拒绝使用闪烁属性。

四、移动光标

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

1.光标移动转义序列

字符序列

动作

33[1;cH

将光标移动至 1 行 c 列。

33[nA

将光标向上移动 n 行。

33[nB

将光标向下移动 n 行。

33[nC

将光标向前移动 n 个字符。

33[nD

将光标向后移动 n 个字符。

33[2J

清空屏幕并将光标移动至左上角(即第0行第0列)

33[K

清空当前光标位置到行末的内容。

33[s

存储当前光标位置。

33[u

恢复之前存储的光标位置。

(1)示例

通过使用这些代码,用户可以构建这样的一条提示符。 每当提示符出现时,屏幕的上方会绘制出一个红色的横条,横条中有用黄色文本显示的时间。 用于提示符的编码就是以下这一个看起来很可怕的字符串:

PS1="[33[s33[0;0H33[0;41m33[K33[1;33mt33[0m33[u]<u@h W>$ "

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

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

字符序列

动作

[

开始一个非打印字符序列。其真正目的是为了让 bash 正确计算可见提示符的长度。如果没有该字符,命令行编辑功能无法正确定位光标。

33[s

存储当前光标位置。在屏幕的顶端横条绘制完成并显示时间后,读取并使光标返回此位置。(需要注意的是,一些终端仿真器不支持该代码。)

33[0;0H

将光标移动至 0 行 0 列(左上角)。

33[0;41m

将背景颜色设置为红色。

33[K

清空光标当前位置(左上角)到行末的内容。因为现在背景颜色已经是红色了,所以清空后的行就是红色,也就绘制出了红色的横条。(需要注意的是:清空行的内容并不会改变光标的位置,光标仍处于左上角)

33[1;33m

将文本颜色设置为黄色。

t

显示当前时间。尽管这是一个可打印的元素,但是还是将其包含在提示符非打印部分中,这是因为 bash 在计算可见提示符的长度时,不应当将其计算在内。

33[0m

关闭颜色。对文本和背景均有效。

33[u

恢复之前存储的光标位置。

]

结束非打印的字符序列。

<u@h W>$

提示符字符串。

五、保存提示符

很显然,用户不会想要每次都输入这样一长串代码,所以就需要将提示符存储在某个地方。 将提示符添加到 .bashrc文件中是一个一劳永逸的解决办法,也就是将以下两行代码添加到文件中。

PS1="[33[s33[0;0H33[0;41m33[K33[1;33mt33[0m33[u]<u@h W>$ "

export PS1