Недавно я немного подправил свой PS1. Код выглядит следующим образом:
PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '
Отсутствующий символ изшрифты для ботаникови не имеет значения в моем вопросе (как и assemble_prompt
функция).
Проблема, с которой я столкнулся, заключается в поломке PS1, когда я уменьшаю размер окна терминала до размера приглашения (приблизительно). Затем он, похоже, игнорирует настройку PS1 и устанавливает PS1 $
только на символы (см. скриншот). Обратите внимание, что когда я начинаю печатать, он просто переопределяет мое пользовательское приглашение в этом случае.
Я сузил проблему до предложения if, которое добавляет символ "fail", если предыдущая команда была неудачной. Если я уберу эту часть, все будет работать так, как и ожидалось.
Есть ли способ сохранить if
часть предложения, но исправить проблему со сбросом PS1, когда размер окна слишком мал?
PS Я использую его rxvt-unicode
в качестве терминала, но проблема сохраняется и на всех других терминалах (проверено xterm
, st
).
решение1
Вероятно, вы захотите включить коды управления терминалом, \[...\]
чтобы сообщить Bash, что они на самом деле не печатают символы. В противном случае они будут сбивать оболочку с толку при попытках подсчитать ширину приглашения.
Так что используйте "\[\e[91m\]xxx\[\e[0m\]"
.
Изруководство:
\[ Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\] End a sequence of non-printing characters.