Длинные строки перекрываются в настраиваемом приглашении Bash PS1

13

Я настроил причудливое двухстрочное PS1приглашение bash с именем сервера, временем, именем пользователя и другими полезными переменными.

PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"

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

Полный источник Github здесь .

Проблема в том, что длинные строки часто оборачиваются вокруг себя, а это означает, что новая строка перекрывает предыдущую.

Проблема несовместима: некоторые строки переносятся правильно, некоторые нет.

Есть идеи, как это исправить?

Адам Матан
источник

Ответы:

16

Вот мой модный двухстрочный PS1 для Bash.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

Итак, вот что я сделал. Если бы это был мой цвет:

\e[1;32m

Я изменил это на:

\[\e[1;32m\]

По сути, вам нужно заключить его в:

\[$mycolor\]

Оформить этот ответ .

varunyellina
источник
+1 Спасибо. Как ни странно, это не работает на Mac.
Адам Матан
Вы спасатель жизни! Что касается Mac, Адам .. Это, скорее всего, из-за количества столбцов. Попробуйте установить в приглашении только строку символов, например «это мое приглашение:», и посмотрите, сохраняется ли проблема. Если это так, настройки колонок на вашем терминале либо слишком широкие, либо слишком узкие.
Алекс Саммерс
7

Нашел это решение онлайн, в котором предлагались закрывающие скобки для переменных цвета:

Изменить это:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

чтобы:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

Я совершил изменение - надеюсь, что оно работает как ожидалось.

Адам Матан
источник
1
не уверен, что это должно достичь. Вам нужно обернуть все, что не занимает места (ansi-escapes) \[ \], так что вы не можете просто завершить все цвета ansi-escape, \]потому что если нет \[. Когда вы вводите непечатаемые символы, вы должны просто обернуть их \[ \](например PS1='\[\e[32;1m\] green prompt \[\e[0m\] $').
dylnmc
В самом деле! Без открытия \ [это подсказывает нам, пользователям Linux. Может быть, он отличается от OSX? Как странно. \ [и \ e [интерпретируются как две разные вещи для Linux. Первый указывает на bash, что следующая последовательность не печатается и не считается как часть отображаемых символов приглашения. \ E [- это escape-скобка для запуска цветовой схемы ANSI.
Алекс Саммерс
0

Мое предпочтительное решение проблемы перекрытия длинных линий в bash PS1 состоит в том, чтобы \nв конце строки (ов) PS1 отображалась буква.

например

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

Если вам нужны все мои другие вещи - время, пользователь, хост, каталог и ветка git (!), Вы можете использовать это (mac или linux):

/unix//a/124012/10043

Майкл Даррант
источник
для git branch вы должны использовать if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Это стандарт при вставке git в скрипт и оценке имени ветки из того, что я прочитал ранее.
dylnmc