15

В zsh справа от моей правой подсказки всегда есть пробел. Я попытался с очень простым .zshrc, например:

PROMPT="#"
RPROMPT="*"

Всегда есть пробел после * в правой части экрана.

Вот скриншот, показывающий проблему (я выбрал место на одной из строк). http://i.imgur.com/cnfa2eJ.png

Благодарю.

3 ответа3

16

TL; DR

Все, что вам нужно сделать, это поместить в файл ~/.zshrc (или в тот же файл, что и тема приглашения):

ZLE_RPROMPT_INDENT=0

подробности

В версиях ZSH, ведущих до 5.0.2, значение в исходном коде C ZSH под названием rprompt_off (которое устанавливает смещение правого поля) было жестко задано равным 1 .

Но в выпуске 5.0.5 разработчики добавили возможность переопределить это значение по умолчанию, установив переменную среды ZLE_RPROMPT_INDENT .

Обоснование этого "отступа" заключается в том, что некоторые старые терминалы начнут прокручиваться, если в последней ячейке дисплея будет символ.

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

Если вы используете старую версию ZSH и не можете обновить ее, вы все равно можете избавиться от этого места, выполнив оба следующих действия:

  1. Trick ЗШ, думая , ваш RPROMPT является характер короче , чем на самом деле использует стандартную невидимую последовательность %{...%}
  2. Затем отправка escape-последовательности курсора назад с помощью terminfo: %{terminfo[cub1]}

Проверьте FAQ и это сообщение в списке рассылки для получения дополнительной информации.

1

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

RPROMPT="%{*%}"

что в принципе говорит zsh , что звезда не занимает никаких символов; от man zshmisc:

%{...%} Включить строку как буквенную escape-последовательность. Строка в фигурных скобках не должна менять позицию курсора. (...)

Недостаток в том, что вы "сдвигаете" пробел в конец PROMPT:

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

| символы обозначают конечные ребра, ■ курсор.


Другой идеей было бы увеличить COLUMNS на 1:

COLUMNS=$((COLUMNS + 1))

Но нужно придумать способ сделать это только для быстрого рендеринга, но не для команд. И это поглотит последний символ в каждой строке многострочной командной строки.

1

Я отправил сообщение об ошибке сопровождающим 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;
        /*

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .