当我已经在终端上输入了一个文本时,我可以修改它的属性吗?
(我想在tput rev我的命令提示符下preexec()。)
终端可让您在编写文本时为文本着色。如果您想更改某些文本的颜色,您必须知道已经存在的内容 - 并重写tput rev它(当然,用和tput sgr0命令括起来)。
重写提示意味着您必须知道在屏幕上写入提示的位置。对于简单的情况(您的提示不在屏幕底部,导致输入命令时它会向上滚动),您可以保存当前光标位置(使用tput sc)并恢复它以返回到重写它的提示(使用tput rc)。
但是,这仅对简单的情况有所帮助,因为多行(或滚动)命令会使返回提示符并重写它是不可行的。
人们使用 curses 编写这样的应用程序——但是 zsh 的 terminfo 支持不会对屏幕上的内容提供那种级别的控制。
也许您可以通过操纵调色板来获得近似值。在一个中,xterm-256color您可以动态更改 256 种颜色中的每一种,并使用控制序列为其分配任意 RGB 值。例如,要将您的调色板变成 256 级中性步进楔形,请使用此gray_colors功能(并reset_colors撤消它)。当您在屏幕上进行颜色测试(颜色立方体)时,这是最好的。
# Operating System Control.
OSC=$(printf '\033]')
BEL=$(printf '\a')
reset_colors () {
printf "${OSC}104${BEL}"
}
gray_colors () {
c=0
while test $c -lt 256; do
printf "${OSC}4;$c;rgb:%02x/%02x/%02x${BEL}" $c $c $c
: $((++c))
done
}
现在,如果您当前的命令在执行后应为红色并变为灰色,则为相同的红色色调分配大约 10 种颜色,一旦显示下一个提示,将其更改为灰色并将下一个红色插槽用于新提示。然后在 10 种红色之间循环(假设这是任何时候屏幕上的命令数量)。根据自己的喜好调整。