Jeśli znaki w linii poleceń są czasami wyświetlane z przesunięciem, często dzieje się tak, ponieważ zsh obliczył niewłaściwą szerokość znaku zachęty. Symptomy polegają na tym, że wyświetlacz wygląda dobrze, dopóki dodajesz znaki lub przesuwasz znak po znaku, ale staje się zniekształcony (niektóre znaki pojawiają się dalej niż powinny), gdy używasz innych poleceń poruszających kursorem (Home , uzupełnianie itp.) ) lub gdy polecenie nakłada się na drugi wiersz.
Zsh musi znać szerokość znaku zachęty , aby wiedzieć, gdzie są umieszczone znaki polecenia. Zakłada, że każda postać zajmuje jedną pozycję, chyba że podano inaczej.
Jedną z możliwości jest to, że monit zawiera sekwencje specjalne, które nie są właściwie rozdzielane. Sekwencje specjalne, które zmieniają kolor lub inne aspekty formatowania tekstu, lub zmieniają tytuł okna lub inne efekty, mają zerową szerokość. Muszą być uwzględnione w konstrukcji nawiasów procentowych%{…%}
. Mówiąc bardziej ogólnie, sekwencja ucieczki, taka jak, %42{…%}
mówi zsh, aby założyć, że zawartość nawiasów klamrowych ma 42 znaki.
Sprawdź więc ustawienia zachęty ( PS1
, PROMPT
lub zmienne, do których się odwołują) i upewnij się, że wszystkie sekwencje specjalne (na przykład w \e[…m
celu zmiany atrybutów tekstowych - pamiętaj, że mogą one występować za pośrednictwem niektórych zmiennych takich jak $fg[red]
) są w środku %{…%}
. Ponieważ używasz oh-my-zsh, sprawdź zarówno własne ustawienia, jak i definicje, których używasz z oh-my-zsh.
Ten sam problem pojawia się w bash. Sekwencje zerowej szerokości w monicie muszą być zawarte w \[…\]
.
Inną możliwością jest to, że twój monit zawiera znaki spoza ASCII oraz że zsh (lub dowolna inna aplikacja) i twój terminal mają inne wyobrażenie o ich szerokości. Może się to zdarzyć, jeśli między kodowaniem występuje niezgodność terminala a kodowaniem zadeklarowanym w powłoce, a oba kodowania skutkują różnymi szerokościami dla niektórych sekwencji bajtów. Zazwyczaj możesz napotkać ten problem, gdy używasz terminala innego niż Unicode, ale deklarujesz ustawienia regionalne Unicode lub odwrotnie.
Aplikacje polegają na zmiennych środowiskowych, aby znać ustawienia regionalne; odpowiednie ustawienie LC_CTYPE
, które określa się od zmiennych środowiskowych LANGUAGE
, LC_ALL
, LC_CTYPE
i LANG
(pierwsza z nich to zestaw ma zastosowanie). Polecenie locale | grep LC_CTYPE
informuje o bieżącym ustawieniu. Zwykle najlepszym sposobem na uniknięcie problemów z ustawieniami regionalnymi jest ustawienie emulatora terminala LC_CTYPE
, ponieważ wie on, jakiego kodowania oczekuje; ale jeśli to nie działa, ustaw LC_CTYPE
.
Te same objawy mogą wystąpić, gdy poprzednie polecenie wyświetlało dane wyjściowe, które nie kończyły się na nowej linii, tak że monit jest wyświetlany w środku wiersza, ale powłoka nie zdaje sobie z tego sprawy. W takim przypadku stanie się to dopiero po uruchomieniu takiego polecenia, a nie uporczywie.
Jeśli linia nie jest wyświetlana poprawnie, polecenie redisplay
lub clear-screen
( domyślnie przypisane do Ctrl+ L) to naprawi.