Как изменить цвет фона только для одной строки?

Как изменить цвет фона только для одной строки?

Вот мои попытки:

введите описание изображения здесь

Последний вариант сработал, но он ломает копирование-вставку (добавляет много пробелов при копировании). Есть ли способ получше?

Копируемый текст:

$ 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

Связанный контент