У меня странное поведение, которое кажется комбинацией zsh и, возможно, urxvt (?)
Моя настройка такова: я запускаю urxvt -e 'tmux'
чтобы получить терминал, который запускает zsh
в качестве оболочки по умолчанию.
Затем я начал настраивать свой $PROMPT
и сейчас он выглядит так:
zstyle ':vcs_info:*' enable git svn hg bzr
zstyle ':vcs_info:*' formats $' \e[0;33m(%s:%b)\e[0m'
precmd () { vcs_info }
PROMPT+=$'\e[0;31m%n\e[0m'
PROMPT+="@"
PROMPT+=$'\e[0;34m%m\e[0m'
PROMPT+=":"
PROMPT+=$'\e[0;36m%3c\e[0m'
PROMPT+=$'\e[0;33m%c\e[0m'
PROMPT+='${vcs_info_msg_0_}'
export PROMPT
Вы можете заметить вторую строку %c
, которая, конечно, предназначена для тестирования.
Обычное поведение подсказки заключается в создании новой строки после нажатия клавиши ввода, при желании выполняя команду, которая может присутствовать. Новая строка печатается. Тем не менее, я замечаю другое поведение при определенных обстоятельствах: когда я нажимаю ввод, команда выполняется и выводится на экран. Однако, когда предыдущий запрос не находился в верхней части терминала, последняя строка предыдущего вывода перезаписывается, потому что весь новый вывод перемещается на одну строку вверх.
Может быть, пример в порядке. Начните с пустого терминала и нового приглашения:
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)
Теперь мы вводим ls -la
в этот каталог (пример вывода):
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)
Обратите внимание, что чего-то не хватает, так как в действительности здесь есть каталог .git
:
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .git
То, что здесь произошло, легко описывается: выходные данные команды генерируются правильно, но затем строка подсказки перемещается на одну строку вверх и перезаписывает последнюю строку вывода. Так что, если я сделаю то же самое снова, мой вывод будет выглядеть так:
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)
Как видите, все снова было перемещено вверх, на этот раз заменив ..
из последнего вывода и .git
из этого вывода.
Но это не происходит на всех установках. Это происходит только тогда, когда окно слишком узкое. Я также проверил это, изменив размеры открытого окна urxvt с zsh внутри. Когда я делаю это слишком узким. Из того, что я вижу, это начинается, как только приглашение занимает около двух третей ширины окна. Тем не менее, я не знаю, почему это происходит в этом случае.
Некоторые примечания:- Это не происходит с bash (даже если само приглашение является многострочным)- RPROMPT
и RPROMPT2
пусты - Кажется, это не зависит от типа отображаемой информации (т.е. отключение vcs_info
помогает, только если приглашение становится достаточно коротким)снова)- Это не происходит, когда приглашение многострочное (а вторая строка не достигает отметки в две трети)- Это не происходит в консоли (tty), но это происходит с xterm и urxvt.
Сводка: моя подсказка zsh перемещается, когда строка вверх, если строка подсказки занимает около двух третей длины окна.