
Вот мои попытки:
Последний вариант сработал, но он ломает копирование-вставку (добавляет много пробелов при копировании). Есть ли способ получше?
Копируемый текст:
$ 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