Почему приглашение zsh перемещается вверх, если окно слишком узкое?

Почему приглашение zsh перемещается вверх, если окно слишком узкое?

У меня странное поведение, которое, похоже, является комбинацией 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строку, которая, конечно же, предназначена для тестирования.

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

Может быть, пример будет уместен. Начните с пустого терминала и нового приглашения:

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 перемещается вверх, если длина строки приглашения составляет около двух третей окна.

решение1

Кажется, я исправил это, используя %{fg[color]%}вместо кодов цвета bash (конечно, для этого мне нужно загрузить модуль цвета).

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