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

12

Я пытаюсь исправить небольшую (но раздражающую) проблему с моей подсказкой zsh. Проблема, которую я вижу, заключается в том, что когда я использую терминал в среде ОС с графическим интерфейсом (например, 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"), или пытался завернуть новую строку %{%}. Я предполагаю, что это связано с тем, что символ новой строки сбивает с толку все, что рисует, относительно длины строки запроса или чего-то еще. Исправлена ​​ли эта проблема или мне просто нужно с этим жить?


источник

Ответы:

13

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

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

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

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

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

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

K-Os
источник
1
Для новичков, таких как я, вы можете увидеть, что означает -rP здесь: cs.elte.hu/zsh-manual/zsh_17.html . Похоже, что printэто ZSH-специфичная команда, и "linux print" Google не дает очень хороших результатов.
MikeWyatt
printявляется частью зш. Вы можете увидеть помощь для этого в man zshbuiltins. У Bash есть свой эквивалент, но я не уверен, что они совместимы.
Джим Стюарт
10

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

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"
Thc Тхань Нгуен
источник
Мне нравится это решение лучше, чем принятый ответ. он более переносим и позволяет мне поддерживать один и тот же сценарий между моими средами zsh и bash
verboze