Pierwsze znaki polecenia powtarzane na wyświetlaczu po zakończeniu

21

Pierwsze dwa znaki zostały powtórzone podczas gdy ja używam Tabdo ukończenia. Na poniższym zrzucie ekranu cdpowtarza się.

wprowadź opis zdjęcia tutaj

Próbowałem rxvt-unicdoe, xterm, terminator. Wszystkie te emulatory terminali mają ten problem.

Zsh wersja 5.0.2, plik konfiguracyjny on-my-zsh

Jilen
źródło
Czy znaki są powtarzane w poleceniu wykonywanym przez zsh, czy tylko są wyświetlane? Czy liczba znaków zmienia się, jeśli polecenie jest dłuższe niż dwa znaki? Czy liczba zmienia się, gdy zmienia się bieżący katalog?
Gilles „SO- przestań być zły”,
@Gilles Powtarzający się znak nie istnieje w poleceniu. Mogę wykonać polecenie.
jilen

Odpowiedzi:

32

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, PROMPTlub zmienne, do których się odwołują) i upewnij się, że wszystkie sekwencje specjalne (na przykład w \e[…mcelu 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_CTYPEi LANG(pierwsza z nich to zestaw ma zastosowanie). Polecenie locale | grep LC_CTYPEinformuje 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 redisplaylub clear-screen( domyślnie przypisane do Ctrl+ L) to naprawi.

Gilles „SO- przestań być zły”
źródło
Chyba brakuje mi pokrewnej czcionki, zauważam, że pierwszy znak jest dziwny. ->Myślę, że tak powinno być
jilen
@jilen Ah, to może być kolejny problem, o którym zapomniałem wspomnieć: może twój monit zawiera znaki spoza ASCII w innym kodowaniu niż twój terminal, przy czym jedno lub oba kodowania są wielobajtowe. Jeśli potrzebujesz pomocy, opublikuj dane wyjściowe localei echo $PS1 | od -t x1(i to samo z dowolną inną zmienną używaną przez $PS1).
Gilles „SO - przestań być zły”,
2
Zapomniałem ustawić ustawień regionalnych (używam archlinuxa, ustawienia narodowe nie są domyślnie ustawione). Po ustawieniu ustawień regionalnych problem został rozwiązany. Wielkie dzięki, koleś !!!!
jilen
Głosowałem za tym, ponieważ, cóż, jest całkiem niesamowity. Jednak ucieczki nie muszą być absolutnie zawarte w nawiasach, jeśli inaczej poradzisz sobie z liczbą kursorów. Wywołanie funkcji podpowłoki działało dla mnie w przeszłości - lub przekierowania, które wciąż lądują na / dev / tty bez angażowania standardowego wyjścia, mogą działać. Inne metody, które zadziałały - używane \e{7,8}do zapisywania / przywracania stanów kursora.
mikeserv
To właśnie LC_CTYPEto mnie naprawiło. Miałem to ustawione C, kiedy to rozbrajam, wszystko działało. Dzięki.
jmaloney
14

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

xh3b4sd
źródło
1
Dzięki za podpowiedź! Musiałem jednak zresetować całość, której localeużywałem, ale zadziałało to dla mnie. Ta odpowiedź zawiera niezbędne kroki dla Ubuntu.
maks.
Dziękuję bardzo! Uratował mnie wiele zagłady
Moshe
1

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”.

Silwing
źródło
Wow, to faktycznie zadziałało. Dzięki!
Paul Calabro
1

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

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
Gleb Samsonenko
źródło