是否可以让 bash 停止闪烁文本?

是否可以让 bash 停止闪烁文本?

我一直在玩 bash,想知道如果我执行另一个命令是否可以使闪烁的文本停止。例如echo -e '\033[5mEXAMPLE\033[0m'会输出闪烁的EXAMPLE文字;但是,我想知道如果执行第二个命令是否可以使文本停止闪烁。

答案1

发送<ESC>[5m序列告诉终端设置从现在开始显示的字符的闪烁属性。

在大多数终端上,<ESC>[25m将其关闭,因为此后将发送的字符将具有其属性关闭。 ,与转弯<ESC>[0m相同<ESC>[m全部字符再现属性关闭,包括粗体、突出、颜色等。不仅仅是闪烁。

发送这些序列不会改变已经显示的内容。

为了使EXAMPLE屏幕上的某个位置停止闪烁,您必须EXAMPLE在同一位置发送一个新的闪烁,然后覆盖它。

例如:

printf '\r\33[5m%s\33[25m' EXAMPLE; sleep 5; printf '\r%s\n' EXAMPLE

将显示一个闪烁的EXAMPLE,然后 5 秒后,将光标移回行的开头(CR 又名\r将光标移动到开头)并用不闪烁的 覆盖它EXAMPLE


对于某些终端,还可以使用以下命令更改显示区域中所有字符的属性:<ESC><top>;<left>;<bottom>;<right>25$r DECCARA 转义序列,如果未指定边界,则默认为整个屏幕。这DECSACE转义序列可以发送来确定这两个<top>;<left><bottom>;<right>坐标是第一个和最后一个字符还是矩形区域的角点。

例子:

printf '\33[;;;;$r'

将消除整个屏幕上的所有闪烁。

要消除屏幕上某些特定连续文本的闪烁,您需要知道该文本的第一个和最后一个字符的坐标。

您可以使用转义序列查询光标位置<ESC>[6n

使用bash,您可以执行此操作并<ESC>[<y>;<x>R使用以下命令读取其响应:

getpos() { IFS=$'\e[;' read -rsdR -p $'\e[6n' _ _ "$2" "$1"; }

假设用户没有同时或之前输入任何内容,其中:

  • p转义序列作为rompt发送
  • 我们告诉read禁用echo-s以便响应不会显示在屏幕上
  • 响应被读取rR d限制符。
  • FS对任何<ESC>[、字符进行字段分割;,并将结果字段存储在__$2$1变量中。

所以你可以这样做:

printf '\33[5m%s\33[25m\n' 'Some earlier blinking text'
getpos x1 y1; printf '\33[5m%s\33[25m%s' EXAMPLE; getpos x2 y2
printf ' \33[5m%s\33[25m\n' 'Some extra blinking text'
echo 'Some more text'

后来,假设没有滚动:

printf '\33[%s;%s;%s;%s;25$r' "$y1" "$x1" "$y2" "$x2"

在上述所有内容中,我们使用printf而不是echo使其可以跨不同的 shell 或不同的构建/版本/设置进行移植。通过printfbash 和大多数其他printf实现的内置功能,您可以\e使用\33.


与这里提到的其他转义序列相比,它的支持范围要小得多。另请注意,即使主机终端支持,tmux也不支持它。screen虽然可以说服他们将序列传递给主机,但这仍然无法在分割窗口中正常工作。

答案2

闪烁的文字

tput blink

恢复特征

tput sgr0

例如

tput blink; echo This is blinking text; tput sgr0

或者

blink=$(tput blink) noblink=$(tput sgr0)
printf '%s\n' "Here we go: ${blink}this blinks${noblink} and this is steady"

有了这个功能,并且能够将光标向上移动 ( tput cuu1) 甚至移动到绝对位置(tput cup Y X- (0,0) 位于左上角),您就可以随意用非闪烁文本覆盖闪烁文本。

值得阅读更多关于 terminfo 的内容;您甚至可以保存当前光标位置,移动到新位置写入文本,然后恢复该位置。如果您的终端不支持这一点,那么只要与$TERM现实相匹配,您就会简单地回退到近似值

相关内容