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