Первые символы команды повторяются на дисплее при завершении

21

Первые два символа были повторены, пока я использую, Tabчтобы сделать завершение. На скриншоте ниже, cdповторяется.

введите описание изображения здесь

Я пробовал rxvt-unicdoe, xterm, терминатор. Все эти эмуляторы терминала имеют эту проблему.

Zsh версия 5.0.2, конфигурационный файл on-my-zsh

jilen
источник
Повторяются ли символы в команде, которую выполняет zsh, или они просто отображаются? Меняется ли количество символов, если команда длиннее двух символов? Меняется ли номер при изменении текущего каталога?
Жиль "ТАК - перестань быть злым"
@Gilles Повторяющийся символ не существует в команде. Я могу выполнить команду.
Джилен

Ответы:

32

Если символы в командной строке иногда отображаются со смещением, это часто происходит потому, что 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) исправит это.

Жиль "ТАК - перестань быть злым"
источник
Я думаю, что я, вероятно, отсутствует соответствующий шрифт, я заметил, что первый символ странный. Ожидается, что это будет, ->я думаю
Джилен
@jilen Ах, это может быть еще одна проблема, о которой я забыл упомянуть: возможно, ваша подсказка содержит не-ASCII символы в кодировке, отличной от вашего терминала, причем одна или обе кодировки являются многобайтовыми. Если вы хотите помочь с этим, опубликуйте выходные данные localeи of echo $PS1 | od -t x1(и то же самое с любой другой переменной, используемой $PS1).
Жиль "ТАК - перестать быть злым"
2
Я забыл установить локаль (я использую archlinux, локаль не установлена ​​по умолчанию). После установки локали эта проблема исправлена. Большое спасибо, парень !!!!
Джилен
Я проголосовал за это, потому что, ну, это довольно круто. Но экранирование не обязательно должно быть включено в скобки, если вы сами по-другому обрабатываете количество курсоров. В прошлом вызов подзаголовочной функции работал для меня, или перенаправления, которые все еще находятся в / dev / tty без использования stdout, могут работать. Другие методы, которые работали - использование \e{7,8}для сохранения / восстановления состояний курсора.
mikeserv
Это было то, LC_CTYPEчто исправило это для меня. У меня было установлено, чтобы C, когда я его отключил, все работало. Спасибо.
jmaloney
14

У меня была такая же проблема, и я нашел свое решение здесь: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Просто вставьте следующее в свой ~/.zshrc.

export LC_CTYPE=en_US.UTF-8

xh3b4sd
источник
1
Спасибо за Вашу подсказку! Мне, однако, пришлось сбросить все, что localeя использовал, но это сработало для меня. Этот ответ предоставляет необходимые шаги для Ubuntu.
максимум
Спасибо большое! Спасло меня много аггреации
Моше
1

У меня была эта проблема в iTerm 2 на macOS. В итоге я решил ее, выбрав «Настройки» -> «Профили» -> «Текст» и отметив галочкой «Использовать ширину Unicode версии 9».

Silwing
источник
Вау, это действительно сработало. Благодарность!
Пол Калабро
1

У меня есть эта проблема, используя Ubuntu LTS Docker Image ( ubuntu:latest). Я исправил это с помощью инструкции, приведенной на соответствующей странице: https://hub.docker.com/_/ubuntu

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
Глеб Самсоненко
источник