Якщо символи у вашому командному рядку іноді відображаються зі зміщенням, це часто відбувається через те, що 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за замовчуванням) виправить її.