Pierwsze dwa znaki zostały powtórzone podczas gdy ja używam Tabdo ukończenia. Na poniższym zrzucie ekranu cd
powtarza się.
Próbowałem rxvt-unicdoe, xterm, terminator. Wszystkie te emulatory terminali mają ten problem.
Zsh wersja 5.0.2, plik konfiguracyjny on-my-zsh
zsh
line-editor
oh-my-zsh
Jilen
źródło
źródło
Odpowiedzi:
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 środowiskowychLANGUAGE
,LC_ALL
,LC_CTYPE
iLANG
(pierwsza z nich to zestaw ma zastosowanie). Polecenielocale | grep LC_CTYPE
informuje o bieżącym ustawieniu. Zwykle najlepszym sposobem na uniknięcie problemów z ustawieniami regionalnymi jest ustawienie emulatora terminalaLC_CTYPE
, ponieważ wie on, jakiego kodowania oczekuje; ale jeśli to nie działa, ustawLC_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
lubclear-screen
( domyślnie przypisane do Ctrl+ L) to naprawi.źródło
->
Myślę, że tak powinno byćlocale
iecho $PS1 | od -t x1
(i to samo z dowolną inną zmienną używaną przez$PS1
).\e{7,8}
do zapisywania / przywracania stanów kursora.LC_CTYPE
to mnie naprawiło. Miałem to ustawioneC
, kiedy to rozbrajam, wszystko działało. Dzięki.Miałem ten sam problem i znalazłem moje rozwiązanie tutaj: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Po prostu włóż następujące elementy do swojego
~/.zshrc
.export LC_CTYPE=en_US.UTF-8
źródło
locale
używałem, ale zadziałało to dla mnie. Ta odpowiedź zawiera niezbędne kroki dla Ubuntu.Miałem ten problem w iTerm 2 na macOS. Rozwiązałem go, przechodząc do Preferencji -> Profile -> Tekst i odhaczając „Użyj szerokości 9 wersji Unicode”.
źródło
Mam ten problem przy użyciu obrazu dokera ubuntu lts (
ubuntu:latest
). Naprawiłem to za pomocą instrukcji podanej na odpowiedniej stronie: https://hub.docker.com/_/ubuntuźródło