Перші символи команди повторюються на дисплеї при виконанні


21

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

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

Я спробував rxvt-unicdoe, xterm, термінатор. Усі ці емулятори терміналів мають цю проблему.

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


Чи символи повторюються в команді, яку виконує zsh, або вони просто відображаються? Чи змінюється кількість символів, якщо команда довша двох символів? Чи змінюється число, коли змінюється поточний каталог?
Жил "ТАК - перестань бути злим"

@Gilles Повторний знак не існує в команді. Я можу виконати команду.
Джилен

Відповіді:


32

Якщо символи у вашому командному рядку іноді відображаються зі зміщенням, це часто відбувається через те, що zsh обчислив неправильну ширину для запиту. Симптоми полягають у тому, що дисплей виглядає добре, якщо ви додаєте символи або переміщуєте символи за символом, але стаєте здивованими (деякі символи відображаються праворуч, ніж повинні), коли ви використовуєте інші команди, які переміщують курсор ( Home, завершення тощо). ) або коли команда перекриває другий рядок.

Zsh потрібно знати ширину підказки , щоб знати, де розміщені символи команди. Він передбачає, що кожен персонаж займає одну позицію, якщо не сказано інше.

Однією з можливостей є те, що ваш запит містить послідовності втечі, які не належним чином обмежені. Послідовності втечі, які змінюють колір або інші аспекти форматування тексту або змінюють заголовок вікна або інші ефекти, мають нульову ширину. Їх потрібно включити в структуру відсоткових дужок%{…%} . Загалом, послідовність втечі на зразок %42{…%}каже zsh припускати, що те, що знаходиться всередині дужок, має 42 символи.

Тому перевірте свої параметри підказок ( PS1, PROMPTабо змінних, на які вони посилаються) і переконайтеся, що всі послідовності запуску (наприклад, \e[…mщоб змінити текстові атрибути - зауважте, що вони можуть бути наявні через якусь змінну на зразок $fg[red]) знаходяться всередині %{…%}. Оскільки ви використовуєте oh-my-zsh, перевірте як власні налаштування, так і визначення, які ви використовуєте, від oh-my-zsh.

Це ж питання виникає і в баш. Там послідовності нульової ширини в підказці потрібно вкласти \[…\].

Інша можливість полягає в тому, що ваш запит містить символи, що не належать до 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

@jilen Ах, це могла бути ще одна проблема, яку я забув згадати: можливо, ваша підказка містить символи, що не належать до ASCII, в іншому кодуванні від вашого терміналу, причому одне або обидва кодування є багатобайтовими. Якщо ви хочете допомогти з цим, опублікуйте вихід localeі 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/isissue/5157#issuecomment-226031519 . Просто введіть у своє ~/.zshrc.

export LC_CTYPE=en_US.UTF-8


1
Дякуємо за вашу підказку! Я, проте, повинен був скинути все, що localeя використовував, але це працювало для мене. Ця відповідь надає необхідні кроки для Ubuntu.
макс

Дуже дякую! Врятувало мене багато агрегації
Моше

1

У мене виникла ця проблема в iTerm 2 на macOS. Я вирішив це, перейшовши в Налаштування -> Профілі -> Текст і відмітивши "Використовувати Unicode Версії 9 Ширини".


Ого, це насправді спрацювало. Спасибі!
Пол Калабро

1

У мене виникла ця проблема, використовуючи docker image ubuntu lts ( 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.