Jestem pewien, że widziałem, jak ktoś ma część swojego monitu wyrównaną do prawej w oknie terminala, a następnie kursor zaczyna się od drugiej linii. Wiem, że mogę uzyskać drugą linię za pomocą „\ n” w PS1, ale nie mogę wymyślić, jak wyrównać jej część po prawej stronie. Czy to, co widziałem, zostało dodane po prostu białe spacje między dwoma łańcuchami?
bash
command-line
ps1
Felix Andersen
źródło
źródło
.inputrc
jestset show-mode-in-prompt on
. Obie nie obliczyć długość non-prinable kodów ANSI CSI i nie prawidłowo ująć je\[
i\]
jak wspomniano przez @Mu Umysłu. Zobacz tę odpowiedź, aby uzyskać rozwiązanie.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: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.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.nJoy!
źródło
Używanie
printf
z$COLUMNS
działało naprawdę dobrze, coś takiego:To słusznie usprawiedliwiało to dla mnie idealnie.
źródło
Poniższe umieści bieżącą datę i godzinę na CZERWONY na RHS terminala.
Zalety:
shellcheck
czysty..inputrc
maset show-mode-in-prompt on
.\[
i\]
tak, że edytowanie tekstu wprowadzonego w wierszu nie powoduje zachęty do przedruku dziwnie.Uwaga : Musisz upewnić się, że wszelkie sekwencje kolorów w
$PS1
przed tym kodem jest exeucted są prawidłowo zamknięte w\[
i\]
a, że nie ma ich gniazdowania.źródło
bash: local: can only be used in a function
, który jest trywialny do naprawienia, i potem nic nie pokazuje, ponieważCOLUMNS
nie jest zdefiniowane: należy go zastąpić$(tput cols)
. taki sam wynik, jeśli fragment zostanie zapisany w innym pliku, a następnie pobrany do.bashrc
.tput cols
jeśli$COLUMNS
jest wyłączony. I tak, ten kod powinien znajdować się w funkcji. UżywamPROMPT_COMMAND='_prompt_bash_set'
i nazywam funkcję_prompt_bash_set
.Pomyślałem, że wrzucę tu moją. Jest prawie dokładnie taki sam, jak podpowiedź GRML zsh (z wyjątkiem aktualizacji zsh, podpowiedź jest nieco lepsza na nowych liniach i spacjach - co jest niemożliwe do odtworzenia w bash ... przynajmniej bardzo trudne w tym momencie).
Spędziłem na tym dobre trzy dni (testowałem tylko na laptopie z uruchomionym łukiem), więc oto zrzut ekranu, a potem rzeczy, które trafiają do mojego ~ / .bashrc :)
ostrzeżenie - to trochę szalone
ważne na bok - każda
^[
(taka jak^[[34m
) jest naprawdę postacią ucieczki(char)27
. Jedynym sposobem, wiem jak wstawić ten ma wejść ctrl+ ( [v) (tj hit zarówno [i vgdy ctrljest wciśnięty.Nadal pracuję nad konfiguracją kolorów, ale cieszę się z kolorów, jakie są teraz.
Obecnie pracuję nad poprawką dla szalonej
^[
postaci i łatwym przełączaniem kolorów :)źródło
Możesz użyć,
printf
aby wykonać prawidłowe wyrównanie:źródło
Dodając odpowiedź Gilesa, napisałem coś, aby lepiej obsługiwać kolory (pod warunkiem, że są one odpowiednio ujęte w
\[
i\]
. Jest to przypadek po przypadku i nie obsługuje wszystkich przypadków, ale pozwala mi ustawić PS1L w tej samej składni co PS1 i używa (niekolorowej) daty jako PS1R.Tutaj jest na github: dbarnett / dotfiles / right_prompt.sh . Używam go w moim .bashrc w następujący sposób:
Uwaga: Dodałem również nowy wiersz po PS1R, który nie ma żadnej różnicy wizualnej, ale wydaje się, że powstrzymuje monit przed zniekształceniem, jeśli przewiniesz niektóre polecenia w historii poleceń.
Jestem pewien, że ktoś inny może to poprawić i być może uogólni niektóre przypadki wyjątkowe.
źródło
Oto rozwiązanie oparte na
PROMPT_COMMAND
atput
:Magię wykonują:
Które dzieli się na:
W PS1
tput
jest poprzedzany znakiem \ [\], aby nie był liczony w wyświetlanej długości.źródło