在zsh中,如何重新着色已经输出的文本?

时间:2017-04-22 10:35:14

标签: terminal zsh tput

当我在终端上输入了文本时,我可以修改其属性吗?

(我希望在tput revpreexec()我的命令提示符。)

2 个答案:

答案 0 :(得分:1)

终端可让您在文本时为文本着色。如果您想更改某些文字的颜色,您必须知道已经存在的内容 - 并且重写它(由tput rev和{{1}括起来当然是命令。)

重写提示意味着您必须知道屏幕上写入提示的位置。对于简单情况(您的提示不在屏幕底部,导致它在您输入命令时向上滚动),您可以保存当前光标位置(使用tput sgr0 )并恢复它以返回重写它的提示(使用tput sc)。

但是,这只会对简单情况有所帮助,因为多行(或滚动)命令会使返回提示并重写它不可行。

人们使用诅咒来编写类似的应用程序 - 但是zsh的terminfo支持不会对屏幕上的内容进行控制。

答案 1 :(得分:0)

也许你可以通过操纵调色板来获得近似值。在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种红色(假设任何时候都是关于屏幕上命令的数量)。根据自己的喜好调整。