Я пытаюсь исправить небольшую (но раздражающую) проблему с моим приглашением 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"