Na podstawie informacji, które tu znalazłem, byłem w stanie odkryć prostsze rozwiązanie do wyrównania do prawej strony, jednocześnie uwzględniając zawartość o zmiennej długości po prawej lub lewej stronie, w tym obsługę kolorów. Dodano tutaj dla Twojej wygody ...
Uwaga dotycząca kolorów: użycie \033
ucieczki na rzecz alternatyw, bez \[\]
grupowania, okazuje się najbardziej kompatybilne i dlatego jest zalecane.
Sztuczka polega na tym, aby najpierw napisać prawą stronę, a następnie użyć znaku powrotu karetki ( \r
), aby powrócić na początek wiersza i kontynuować nadpisywanie zawartości lewej strony, następująco:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Korzystam tput cols
z systemu Mac OS X do pobierania szerokości terminala / konsoli, terminfo
ponieważ mój $COLUMNS
var nie jest wypełniony, env
ale możesz zastąpić wymienną *
wartość „ ” w%*s
, podając „ ${COLUMNS}
” lub dowolną inną wartość, którą wolisz.
Następny przykład wykorzystuje $RANDOM
do generowania treści o różnej długości, zawiera kolory i pokazuje, w jaki sposób można wyodrębnić funkcje, aby przefakturować implementację do funkcji wielokrotnego użytku.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Ponieważ printf
przyjmujemy, że długość łańcucha jest liczbą znaków, którą musimy zrekompensować ilością znaków wymaganą do renderowania kolorów, zawsze znajdzie się on na końcu ekranu ze względu na niedrukowane znaki ANSI bez kompensacji. Znaki wymagane dla koloru pozostają stałe i przekonasz się, że również printf uwzględnia zmianę długości zwracaną przez$RANDOM
na przykład przez ', co pozwala zachować właściwe wyrównanie.
Nie jest to przypadek szczególny bash sekwencji szybka ucieczka (tj. \u
, \w
, \h
,\t
), Choć, jak będą one nagrywać tylko długość 2, ponieważ bash będzie tylko tłumaczyć je, gdy zostanie wyświetlony monit, po printf świadczył ciąg. Nie wpływa to na lewą stronę, ale najlepiej unikać ich po prawej stronie.
Bez żadnego znaczenia, jeśli wygenerowana treść pozostanie na stałej długości. Podobnie jak w przypadku \t
opcji time , która zawsze renderuje tę samą liczbę znaków (8) przez 24 godziny. Musimy jedynie uwzględnić kompensację wymaganą do uwzględnienia różnicy między zliczonymi 2 znakami, która w tych przypadkach daje 8 znaków po wydrukowaniu.
Należy pamiętać, że może być konieczne potrójne ucieczka \\\
niektórych sekwencji ucieczki, które w przeciwnym razie mają znaczenie dla łańcuchów. Podobnie jak w poniższym przykładzie, bieżące escape katalogu roboczego \w
nie ma żadnego znaczenia, w przeciwnym razie działa zgodnie z oczekiwaniami, ale czas \t
, który oznacza znak tabulacji, nie działa zgodnie z oczekiwaniami bez potrójnego jego ucieczki.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!