Если символы в командной строке иногда отображаются со смещением, это часто происходит потому, что zsh вычислил неправильную ширину для приглашения. Симптомы состоят в том, что дисплей выглядит нормально, пока вы добавляете символы или перемещаете символ за символом, но он искажается (некоторые символы появляются дальше вправо, чем следовало бы), когда вы используете другие команды, которые перемещают курсор ( Home, завершение и т. Д.). ) или когда команда перекрывает вторую строку.
Zsh должен знать ширину приглашения , чтобы знать, где расположены символы команды. Предполагается, что каждый персонаж занимает одну позицию, если не указано иное.
Одна возможность состоит в том, что ваше приглашение содержит escape-последовательности, которые не разделены должным образом. Escape-последовательности, которые изменяют цвет или другие аспекты форматирования текста, или которые изменяют заголовок окна или другие эффекты, имеют нулевую ширину. Они должны быть включены в конструкцию процентных скобок%{…%}
. В более общем смысле escape-последовательность, подобная %42{…%}
zsh, говорит, что в фигурных скобках содержится 42 символа.
Поэтому проверьте настройки вашего приглашения ( PS1
, PROMPT
или переменные, на которые они ссылаются) и убедитесь, что все escape-последовательности (например, \e[…m
для изменения текстовых атрибутов - обратите внимание, что они могут присутствовать через некоторую переменную, например $fg[red]
), находятся внутри %{…%}
. Поскольку вы используете oh-my-zsh, проверьте свои собственные настройки и определения, которые вы используете из oh-my-zsh.
Та же проблема возникает в bash. Там последовательности нулевой ширины в приглашении должны быть заключены в \[…\]
.
Другая возможность состоит в том, что ваша подсказка содержит не-ASCII символы и что zsh (или любое другое приложение) и ваш терминал имеют другое представление о том, насколько они широки. Это может произойти, если есть несоответствие между кодировкой вашего терминала и кодировкой, объявленной в оболочке, и эти два кодирования приводят к разной ширине для определенных последовательностей байтов. Как правило, вы можете столкнуться с этой проблемой при использовании терминала не-Unicode, но при объявлении локали Unicode или наоборот.
Приложения полагаются на переменные среды, чтобы знать локаль; соответствующая настройка LC_CTYPE
, которая определяется из переменных окружения LANGUAGE
, LC_ALL
, LC_CTYPE
и LANG
(первый из них , что это набор применяется). Команда locale | grep LC_CTYPE
сообщает вам ваши текущие настройки. Обычно лучший способ избежать проблем с локалью - установить эмулятор терминала LC_CTYPE
, поскольку он знает, какую кодировку он ожидает; но если это не работает для вас, не забудьте установить LC_CTYPE
.
Те же симптомы могут возникать, когда предыдущая команда отображала некоторые выходные данные, которые не заканчивались символом новой строки, поэтому подсказка отображается в середине строки, но оболочка этого не понимает. В этом случае это произойдет только после выполнения такой команды, а не постоянно.
Если строка не отображается должным образом, команда redisplay
или clear-screen
( по умолчанию связанная с Ctrl+ L) исправит это.