Как мне добавить новую строку в командную строку zsh, не вызывая проблем с перерисовкой терминала?

Как мне добавить новую строку в командную строку zsh, не вызывая проблем с перерисовкой терминала?

Я пытаюсь исправить небольшую (но раздражающую) проблему с моим приглашением zsh. Проблема, которую я вижу, заключается в том, что когда я использую терминал в среде GUI OS (например, Terminal.app или iTerm 2 в OS X 10.7.2) и изменяю размер окна терминала, терминал перерисовывается с дополнительными приглашениями.

Я воспроизвел проблему на чистом .zshrc, содержащем следующее:

export PROMPT=">
"

Чтобы было ясно, это файл из двух строк. В строке есть буквальный перевод строки, который я читал в нескольких (по общему признанию старый) мест — это то, что нужно. Это работает до тех пор, пока я не изменю размер окна терминала, после чего я получаю дублирующиеся строки приглашений. Например, если я открываю новое окно, я вижу ( *используется как заполнитель для моего курсора):

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

Затем, когда я изменяю размер окна, делая его короче, я получаю:

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

Количество дополнительных распечаток приглашений, похоже, примерно пропорционально тому, насколько я изменяю размер окна — обычно по вертикали. Если я удаляю новую строку из строки приглашения, проблема исчезает.

Я пробовал разные вещи, например $(print ">\n"), или пытался обернуть новую строку в %{%}. Я предполагаю, что это связано с тем, что новая строка путает то, что рисуется, с тем, какой длины на самом деле строка приглашения, или что-то в этом роде. Эту проблему можно исправить или мне просто придется с этим жить?

решение1

Эта проблема связана с тем, как ZSH перепечатывает приглашение при событиях изменения размера, и она также раздражала меня раньше. Решение — сделать $PROMPTоднострочным и напечатать первую строку приглашения с помощью precmd.

Итак, в вашем примере это будет просто:

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

или для более сложного примера с расширением подсказки в операторе печати используйте -rPпараметры:

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

Если у вас зарегистрировано более одного precmd, вам необходимо использовать add-zsh-hook precmd(см. man zshcontrib).

решение2

Как насчет чего-то вроде этого:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

Связанный контент