\033[1;35m
— 7 символов. bash
не может догадаться, что эти 7 символов на самом деле имеют нулевую ширину. Если нет, он будет думать, что они имеют ширину 7 столбцов.
Он (точнее, readline
основной редактор строк, который он использует) хочет знать, какова текущая позиция на экране, потому что он использует последовательности позиционирования курсора (вверх, вниз, влево, вправо) для перемещения курсор, когда вы используете клавиши редактирования.
Итак, вы должны указать, какой из символов в подсказке не перемещает курсор. С bash
это делается с помощью \[...\]
, который сообщает оболочке, что то, что находится внутри, имеет нулевую ширину.
Также обратите внимание, что расширение подсказки в bash
распознает \e
как символ ESC, поэтому вам не нужно использовать echo -e
. Вы можете просто сделать:
PS1='\[\e[1;35m\] blah $ '
Если вам нужно использовать echo
или лучше printf
, вы должны сделать:
PS1='\[$(if ...; then printf "$color1"; fi)\] blah $ '
Или:
PS1='$(if ...; then printf "\[$color1\]"; fi) blah $ '
В zsh
, эквивалентом bash
\[...\]
является %{...%}
, как в tcsh
. ], но zsh
имеет директивы для изменения атрибутов символов, так что вам лучше сделать:
PS1='%B%F{magenta}blah $ '
Для полужирного пурпурного переднего плана. Он также имеет некоторые формы условных тестов, в том числе на $?
, поэтому ваш красный
в случае ошибки, зеленый в противном случае может быть записан:
PS1='%F{%(?:green:red%)}blah%f $ '
tcsh
имеет % B
, но не %F{цвет}
. Итак, вы должны использовать:
set prompt = '%{\e[1;35m%}blah $ '
В ksh88
или pdksh
вы должны сделать:
PS1=$(printf '\5\r\5\33[1;35m\5blah $ ')
Это определяет символ (здесь 0x5) как escapeсимвол. Затем, заключая текст между парой из них, вы сообщаете оболочке, что он не виден. Вы можете использовать любой символ, кроме 0x5, но в противном случае он не должен встречаться в вашей подсказке, и, кроме как в mksh, он должен игнорироваться терминалом, потому что оболочка действительно записывает его (вместе с символом CR).
ksh93
использует только одну последовательность позиционирования курсора: BS
(которая перемещает курсор на один столбец влево). Для перемещения вправо он просто перерисовывает одни и те же символы. Таким образом, ему не нужно знать положение курсора, а только ширину каждого введенного вами символа.Это работает до тех пор, пока терминал сам по себе перемещается по краю (поэтому не будет работать должным образом, например, с этим терминатором). Один побочный эффект, если у вас есть подсказка с управляющими последовательностями, заключается в том, что ваши позиции табуляции не будут правильно выровнены.