Видалення марного простору в кінці правого запиту zsh ($ RPROMPT)


18

У zsh завжди знаходиться символ пробілу праворуч від мого правого підказки. Я спробував із дуже простим .zshrc, таким як:

PROMPT="#"
RPROMPT="*"

Після * в правій частині екрана завжди є пробіл.

Ось скріншот із зображенням проблеми (я вибрав пробіл в одному з рядків). http://i.imgur.com/cnfa2eJ.png

Спасибі.

Відповіді:


20

TL; DR

Все, що вам потрібно зробити, - це помістити це у свій ~/.zshrc(або у той самий файл, що і тема підказки):

ZLE_RPROMPT_INDENT=0

Деталі

У версіях ZSH, що ведуть до 5.0.2, значення у вихідному коді ЗSH, який називається rprompt_off(який встановлює зміщення правої межі), було важко закодовано 1.

Але у версії 5.0.5 розробники додали можливість змінити це значення за замовчуванням, встановивши ZLE_RPROMPT_INDENTзмінну середовища.

Обгрунтування для цього «відступу» тому , що деякі старі термінали почнуть скролінг , якщо останній осередок дисплея мала характер в ньому.

Для версій ZSH до 5.0.5

Якщо ви користуєтеся старішою версією ZSH і не можете оновити, ви все одно можете позбутися цього простору, виконавши обидві дії:

  1. Trick ЗШ, думаючи , ваш RPROMPT є характер коротше , ніж на самому справі використовує стандартну невидима послідовність обгортку:%{...%}
  2. Потім надішліть послідовність втечі курсору назад за допомогою terminfo: %{terminfo[cub1]}

Перегляньте поширені запитання та це повідомлення у списку розсилки для отримання додаткової інформації.


5
Це також здається, що введіть курсор введення на один символ ліворуч від місця, де це було б зазвичай. Наприклад, використовуючи підказки в цьому питанні, наприклад, курсор розміщується на хеш-позначці, а не відразу праворуч. (Для мене встановлення зміщення значення менше нуля змушує підказки та курсор з’являтися у правильних місцях. Спостерігається з zsh 5.0.8 та 5.2.)
Роб Кеннеді

Для мене працює в 5.2.
Ентоні Майкл Кук

5
Це якось працювало для мене в 5.2, але тепер у мене є проблеми з PROMPT: останній символ у PROMPT зник, а перемикання автозаповнення заповнює останнього символу першим символом поточного вводу. Наприклад, %git<Tab>перетворюється на%ggit
roboslone

Не потрібно використовувати хитрощі для новіших версій ZSH.
Ентоні Майкл Кук

5
Після встановлення ZLE_RPROMPT_INDENT = 0, я помітив ті самі проблеми з кресленням малюнка з підказкою зліва від лівого боку, що деякі інші згадують вище. Однак майже все працює так, як очікувалося, якщо я використовую -1 замість 0, тобто ZLE_RPROMPT_INDENT = -1. Я побачив цю пораду на сайті github.com/bhilburn/powerlevel9k/isissue/… . Майже тому, що з -1 він ніколи не використовує нижню лінію термінального вікна на macOS.
Marc Liyanage

2

Я надіслав звіт про помилки у службовців zsh, але, схоже, така поведінка є дизайном. Однак ця проблема мене настільки роздратувала, що я вирішив виправити і скласти zsh як тимчасове виправлення. Якщо ви перебуваєте на OS X і використовуєте Homebrew (вам слід), ви можете встановити zsh, включаючи мій патч, запустивши:

brew install https://gist.github.com/padde/7963205/raw/eaedcc557859a40db87282fc39256fccd52d0aad/zsh.rb

ви, ймовірно, захочете додати /usr/local/bin/zshдо нього /etc/shellsта chsh -s /usr/local/bin/zshпісля цього. Нарешті, ось найрізноманітніша версія для всіх, хто зацікавлений:

diff --git a/Src/Zle/zle_refresh.c b/Src/Zle/zle_refresh.c
index 17b78ce..f136178 100644
--- a/Src/Zle/zle_refresh.c
+++ b/Src/Zle/zle_refresh.c
@@ -1576,7 +1576,7 @@ zrefresh(void)
    else
        put_rpmpt = rprompth == 1 && rpromptbuf[0] &&
        !strchr(rpromptbuf, '\t') &&
-       (int)ZR_strlen(nbuf[0]) + rpromptw < winw - 1;
+       (int)ZR_strlen(nbuf[0]) + rpromptw < winw;
     } else {
 /* insert >.... on first line if there is more text before start of screen */
    ZR_memset(nbuf[0], zr_sp, lpromptw);
@@ -1631,9 +1631,9 @@ zrefresh(void)
    if (put_rpmpt && !iln && !oput_rpmpt) {
        int attrchange;

-       moveto(0, winw - 1 - rpromptw);
+       moveto(0, winw - rpromptw);
        zputs(rpromptbuf, shout);
-       vcs = winw - 1;
+       vcs = winw;
    /* reset character attributes to that set by the main prompt */
        txtchange = pmpt_attr;
        /*

PWS (zsh supporter ) щойно опублікував розширений патч , тому відступ RPROMPT має бути найближчим часом у офіційних джерелах.
mpy

Дякуємо, що опублікували посилання. Чекаємо наступного випуску!
Патрік Осіті

1

Я думаю, що білий простір праворуч жорсткий. Але ви можете обдурити zshза допомогою наступних налаштувань:

RPROMPT="%{*%}"

що в принципі говорить про zshте, що зірка не займає персонажів; від man zshmisc:

%{...%} Включіть рядок як буквальну послідовність відходу. Рядок у дужках не повинен змінювати положення курсору. (...)

Недолік полягає в тому, що ви "зміщуєте" бланк на кінець PROMPT:

| PROMPT = "#" |
| RPROMPT = "% {*%}" |
| # ■ * |

Ці |символи позначають кінцеві ребра, ■ курсор.


Ще однією ідеєю було б збільшити COLUMNSна 1:

COLUMNS=$((COLUMNS + 1))

Але треба придумати спосіб, як це зробити лише для швидкого відображення, але не для команд. І це проковтне останній символ у кожному рядку в багаторядковому командному рядку.


1
Спасибі. Я спробував пограти з трюком% {...%}, маючи справу зі своїм часом та статусом git, що відображається праворуч. Я не проти додаткового місця в PROMPT, тому що у мене зазвичай є. Однак є один великий недолік цього рішення: коли я активую автоматичне заповнення за допомогою TAB, зайвий простір видаляється, і він робить дивні речі :)
Frozax
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.