正確に 1 行の背景色を変更するにはどうすればよいでしょうか?

正確に 1 行の背景色を変更するにはどうすればよいでしょうか?

私の試みは次のとおりです:

ここに画像の説明を入力してください

最後の方法は機能しましたが、コピー アンド ペーストが機能しません (コピー時に大量のスペースが追加されます)。もっと良い方法はありますか?

コピー可能なテキスト:

$ 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) 機能は背景色を使用しません。シェルは行を編集するときに背景色を使用する場合があります。
  • すべての端末がスクロール時に現在の背景色を使用するわけではありません (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

関連情報