Wie ändere ich die Hintergrundfarbe für genau eine Zeile?

Wie ändere ich die Hintergrundfarbe für genau eine Zeile?

Hier sind meine Versuche:

Bildbeschreibung hier eingeben

Das letzte hat funktioniert, aber es unterbricht das Kopieren und Einfügen (es werden viele Leerzeichen beim Kopieren hinzugefügt). Gibt es einen besseren Weg?

Kopierbarer Text:

$ 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
$ 

Antwort1

Habe die Lösung selbst gefunden (indiese verwandte Frage). Benutze das:

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

In der Dokumentation heißt es etwa \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.

Antwort2

Beim Löschen bis zum Zeilenende wird die aktuelle Hintergrundfarbe mit xterm und der Linux-Konsole sowie mit Terminals verwendet, die dieses Verhalten kopieren. In ncurses wird dies als Funktion zum Löschen der Hintergrundfarbe (bce) bezeichnet. Wenn die Funktion unterstützt wird, bietet sie eine Möglichkeit, den Hintergrund für die aktuell bearbeitete Zeile in einer bestimmten Farbe zu belassen.

Jedoch:

  • Beim Bearbeiten einer umbrochenen Zeile ist dies weniger nützlich.
  • Es gibt einige Unterschiede zu den Terminals rxvt/urxvt: Die zugehörige Funktion zum Löschen von Zeichen (ech) verwendet nicht die Hintergrundfarbe. Ihre Shell kann diese beim Bearbeiten einer Zeile verwenden.
  • Nicht alle Terminals verwenden beim Scrollen die aktuelle Hintergrundfarbe (wie dies bei xterm und der Linux-Konsole der Fall ist).

Weiterführende Literatur:

Antwort3

Wie wäre es damit:

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

Sie können es auch zu einer Funktion machen, die Argumente entgegennimmt, Farbvariablen hinzufügt usw.:

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

Verwendung:

linecolor 'Warning text'

Antwort4

Wenn eine zusätzliche anfängliche Leerzeile akzeptabel ist:

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

scheint zu funktionieren.

Die einzige Erklärung, die mir für das beobachtete Verhalten einfällt, ist, dass es darauf ankommt, wie das Terminal bestimmt, welche Hintergrundfarbe für eine neue Zeile verwendet werden soll. Daher würde es wahrscheinlich anders funktionieren, wenn Sie ein anderes Terminal verwenden als das von xtermmir verwendete.

Ich denke, dass die Verwendung printfIhre letzte Methode etwas lesbarer macht. Auch wenn das Kopieren und Einfügen dadurch immer noch nicht funktioniert, hier ist sie:

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

verwandte Informationen