Jak mogę wstawić znak nowej linii w wierszu polecenia zsh bez powodowania problemów z przerysowaniem terminalu?

13

Próbuję naprawić niewielki (ale irytujący) problem z moim monitem zsh. Problem, który widzę, polega na tym, że kiedy używam terminala w środowisku systemu operacyjnego GUI (na przykład Terminal.app lub iTerm 2 w OS X 10.7.2) i zmieniam rozmiar okna terminala, terminal jest przerysowany z dodatkowymi monitami .

Problem został odtworzony na czystym pliku .zshrc, który zawiera następujące elementy:

export PROMPT=">
"

Dla jasności jest to plik dwuwierszowy. Jest dosłowna nowa linia w ciągu, którą przeczytałem w kilku (co prawda starych ) miejscach, jest to najlepsza droga. Działa to do momentu zmiany rozmiaru okna terminala, w którym to momencie kończą się powielone ciągi znaków zachęty. Na przykład, jeśli otworzę nowe okno, widzę ( *użycie symbolu zastępczego dla mojego kursora):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

Następnie, gdy zmieniam rozmiar okna, co czyni go krótszym, kończę na:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

Liczba dodatkowych szybkich wydruków wydaje się w przybliżeniu proporcjonalna do tego, jak bardzo zmieniam rozmiar okna - zwykle w pionie. Jeśli usunę znak nowej linii z ciągu zachęty, problem zniknie.

Próbowałem różnych rzeczy, $(print ">\n")lub próbowałem zawinąć nową linię %{%}. Zakładam, że ma to związek z faktem, że znak nowej linii myli wszystko, co rysuje, z tym, jak długi jest w rzeczywistości ciąg znaków zachęty lub coś takiego. Czy ten problem można naprawić, czy muszę po prostu z tym żyć?


źródło

Odpowiedzi:

13

Ten problem wynika z tego, jak ZSH ponownie drukuje ogłoszenie o zmianie rozmiaru wydarzeń, a także wcześniej mnie denerwowało. Rozwiązaniem jest utworzenie $PROMPTpojedynczej linii i wydrukowanie pierwszej linii monitu za pomocą precmd.

W twoim przykładzie byłoby to po prostu:

precmd() { print ">" }
export PROMPT=""

lub dla bardziej wyrafinowanego przykładu z szybkim rozwinięciem instrukcji print użyj -rPparametrów:

precmd() { print -rP "%~" }
export PROMPT="%# "

Jeśli masz więcej niż jeden zarejestrowany plik precmd, musisz użyć add-zsh-hook precmd(patrz man zshcontrib).

K-os
źródło
1
Dla początkujących, takich jak ja, możesz zobaczyć, co oznacza -rP tutaj: cs.elte.hu/zsh-manual/zsh_17.html . Wygląda na printto, że jest to polecenie specyficzne dla ZSH, a „druk linuksowy” Googlinga nie daje bardzo dobrych rezultatów.
MikeWyatt,
printjest częścią Zsh. Możesz zobaczyć pomoc na ten temat w man zshbuiltins. Bash ma swój odpowiednik, ale nie jestem pewien, czy są kompatybilne.
Jim Stewart
11

Co powiesz na coś takiego:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
Thc Thanh Nguyễn
źródło
Podoba mi się to rozwiązanie bardziej niż zaakceptowana odpowiedź. jest bardziej przenośny i pozwala mi zachować ten sam skrypt między środowiskiem zsh i bash
czasownik