如何更改一行的背景颜色?

如何更改一行的背景颜色?

这是我的尝试:

在此输入图像描述

最后一个有效,但它破坏了复制粘贴(复制时添加了大量空格)。有没有更好的办法?

可复制文本:

$ PS1='\['$'\x1b[0m\]$ '
$ echo -e "\x1b[41;37mWarning text\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[0m"; echo Normal text
Warning text
Normal text
$ echo -ne "\x1b[41;37mWarning text"$'\n'"\x1b[47;30m"; tr </dev/zero \\0 \ |head -c 80; echo -ne "\x1b[A";  echo Normal text
Warning text
Normal text                                                                     
$ 
$ t="Warning text";echo -ne "\x1b[41;37m";echo -n "$t";{ tr </dev/zero \\0 \ |head -c $(bc <<<"$(stty -a <&3|grep -Po '(?<=columns )[0-9]+')-$(wc -c<<<"$t")+1"); } 3<&0;echo -e "\x1b[0m";echo "Normal text"
Warning text                                                                    
Normal text
$ 

答案1

我自己找到了解决方案(在这个相关问题)。用这个:

echo -e '\x1b[41;37mWarning text\x1b[K\x1b[0m';echo Normal text

该文档说\x1b[K

       K   EL        Erase line (default: from cursor to end of line).
                     ESC [ 1 K: erase from start of line to cursor.
                     ESC [ 2 K: erase whole line.

答案2

清除到行尾将使用 xterm 和 Linux 控制台以及复制该行为的终端的当前背景颜色。在 ncurses 中,这称为背景颜色擦除 (bce) 功能。当支持该功能时,这提供了一种使当前编辑的行的背景保持给定颜色的方法。

然而:

  • 编辑换行时它的用处不大。
  • 与 rxvt/urxvt 终端有一些区别:相关的擦除字符 (ech) 功能不使用背景颜色。您的 shell 在编辑行时可能会使用它。
  • 并非所有终端在滚动时都使用当前背景颜色(如 xterm 和 Linux 控制台那样)。

进一步阅读:

答案3

这个怎么样:

printf '\e[41m%-*s\e[0m\n' $COLUMNS 'Warning text'

您还可以将其设为接受参数、添加颜色变量等的函数:

linecolor () { printf '\e[41m%-*s\e[0m\n' $COLUMNS "$1"; }

用法:

linecolor 'Warning text'

答案4

如果额外的初始空行是可以接受的:

echo -e "\x1b[41;37m\n\x1b[0m\x1b[41;37mWarning\x1b[0m"; echo "Normal"

似乎有效。

对于我所看到的行为,我能想到的唯一解释是,它取决于终端如何确定新行使用哪种背景颜色,如果您使用与我xterm使用的不同的终端,那么它的工作方式可能会有所不同。

我认为使用printf使你最后一个方法更具可读性,所以即使这仍然破坏复制粘贴,这里是:

printf "\x1b[41;37m%-$(stty size | cut -d' ' -f2)s\x1b[0m\n" hello; echo world; echo test

相关内容