Чтобы предотвратить искажение приглашения вокруг текста справа налево, я хочу вставить LRM нулевой ширины в приглашение bash (U200e). Поскольку это символ нулевой ширины, мой инстинкт подсказывал мне обернуть его в \[<200e>\]
. Оказывается, это фактически заставляет bash переносить строки в неправильном месте. Когда я не обернул его ничем,затемКажется, все работает нормально.
Чего я не понимаю. Даже если bash автоматически определяет, что этот символ имеет нулевую ширину, обертывание его \[...\]
a не должно было повредить чему-либо.
ОТРЕДАКТИРОВАНО: Итак, вопрос в следующем: когда \[...\]
экранирование действительно необходимо и как оно может быть вредным, если экранируемые символы на самом деле имеют нулевую ширину.
решение1
Смотреть пост Экранирование символов нулевой длины в bash. и в частности ответ Майкла Аллена который я воспроизвожу ниже:
последовательности
\[
используются некоторыми утилитами, включая PS1, для представления\001
и\002
управляющих кодов:
\[
=>\x01
или\001
\]
=>\x02
или\002
printf и echo не выполняют преобразование из
\[
в\001
.Поэтому решением было сделать преобразование самому. Вместо того, чтобы оборачивать символы нулевой длины в
\[
:echo "\[\033[1;30m\]foo\[\033[0m\]"
который выведет
\[foo\]
Вместо этого я вывожу фактический код управления:
echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"
который выводит данные
foo
как на PS1 printf, так и на echo.Конкретный пример см.этот коммит на git-radar.