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