私の試みは次のとおりです。
最後はうまくいきますが、コピー - 貼り付けは中断されます(コピーすると多くのスペースが追加されます)。もっと良い方法がありますか?
コピー可能なテキスト:
$ 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 端末にはいくつかの違いがあります。関連文字の消去機能は背景色を使用しません。シェルは行を編集するときに使用できます。
- スクロールしても、すべての端末が現在の背景色を使用しているわけではありません(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