Długie linie nakładają się na niestandardowy monit Bash PS1

13

Skonfigurowałem fantazyjny dwuliniowy PS1monit bash z nazwą serwera, czasem, nazwą użytkownika i innymi przydatnymi zmiennymi.

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\]"

wprowadź opis zdjęcia tutaj

Pełne źródło Github tutaj .

Problem polega na tym, że długie linie są często owijane wokół siebie, co oznacza, że ​​nowa linia nakłada się na poprzednią.

Problem jest niespójny: niektóre wiersze są poprawnie opakowane, inne nie.

Jakiś pomysł jak to naprawić?

Adam Matan
źródło

Odpowiedzi:

16

Oto moja wymyślna dwuwierszowa konsola PS1 do zachęty do 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\]

Oto co zrobiłem. Jeśli to był mój kolor:

\e[1;32m

Zmieniłem to na:

\[\e[1;32m\]

Zasadniczo musisz go zawrzeć w:

\[$mycolor\]

Sprawdź tę odpowiedź .

varunyellina
źródło
+1 dzięki. O dziwo, wydaje się, że nie działa na Macu.
Adam Matan
Ratujesz życie! Co do Maca, Adam .. Najprawdopodobniej wynika to z liczby kolumn. Spróbuj ustawić podpowiedź tylko na ciąg znaków, na przykład „oto mój monit” i sprawdź, czy problem nie ustąpi. Jeśli tak, to ustawienie kolumny na terminalu jest albo za szerokie, albo za wąskie.
Alex Summers
7

Znaleziono to rozwiązanie online, które sugeruje nawiasy zamykające do zmiennych kolorów:

Zmień to:

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

do:

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

Mam popełnione zmiany - mam nadzieję, że działa zgodnie z oczekiwaniami.

Adam Matan
źródło
1
nie jestem pewien, co to ma osiągnąć. Musisz owinąć wszystko, co nie zajmuje miejsca (ucieczki ansi) \[ \], więc nie możesz po prostu zakończyć wszystkich kolorów ucieczki ansi, \]ponieważ co, jeśli nie ma \[. Kiedy umieszczasz znaki niedrukowalne, powinieneś po prostu je owinąć \[ \](np PS1='\[\e[32;1m\] green prompt \[\e[0m\] $'.).
dylnmc
W rzeczy samej! Bez otwarcia \ [powoduje to wyświetlenie monitu dla użytkowników systemu Linux. Może jest inaczej w OSX? Jak dziwnie. \ [i \ e [są interpretowane jako dwie różne rzeczy dla Linuksa. Pierwszy wskazuje na bash, że następująca sekwencja jest niemożliwa do wydrukowania, a nie liczenie jej jako części wyświetlanych znaków zachęty. \ E [to nawias zamykający, aby rozpocząć schemat kolorów ANSI.
Alex Summers
0

Moim preferowanym rozwiązaniem problemu nakładania się długich linii w bash PS1 jest umieszczenie \nna końcu linii poleceń PS1.

na przykład

wprowadź opis zdjęcia tutaj

Jeśli chcesz wszystkich moich innych rzeczy - czasu, użytkownika, hosta, katalogu i gałęzi git (!), Możesz użyć tego (Mac lub Linux):

/unix//a/124012/10043

Michael Durrant
źródło
dla gałęzi git powinieneś użyć if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. Jest to standard podczas wstawiania gita do skryptu i oceny nazwy gałęzi na podstawie tego, co przeczytałem wcześniej.
dylnmc