Removendo o espaço inútil no final do prompt direito de zsh ($ RPROMPT)

15

No zsh, há sempre um caractere de espaço à direita do prompt direito. Eu tentei com um .zshrc muito simples como:

PROMPT="#"
RPROMPT="*"

Existe sempre um espaço após o * à direita do ecrã.

Aqui está uma captura de tela mostrando o problema (selecionei o espaço em uma das linhas).

Obrigado.

    
por Frozax 07.10.2013 / 19:40

3 respostas

16

TL; DR

Tudo o que você precisa fazer é colocar isso no seu ~/.zshrc (ou no mesmo arquivo que o seu tema de prompt):

ZLE_RPROMPT_INDENT=0

Detalhes

Nas versões do ZSH que levam a 5.0.2 um valor no código fonte do ZSH chamado rprompt_off (que definir o deslocamento da margem direita) foi codificado para 1 .

Mas na versão 5.0.5 , os desenvolvedores adicionaram a capacidade de substituir esse valor padrão, definindo o ZLE_RPROMPT_INDENT variável de ambiente.

O raciocínio para este "recuo" é porque alguns terminais mais antigos começariam a rolar se última célula do display tinha um caractere nele.

Para versões do ZSH anteriores a 5.0.5

Se você estiver em uma versão mais antiga do ZSH e não puder atualizá-la, ainda poderá se livrar desse espaço fazendo as duas coisas a seguir:

  1. Truque ZSH pensa que o seu RPROMPT é um caractere mais curto do que ele está usando o wrapper de sequência invisível padrão : %{...%}
  2. Em seguida, envia uma seqüência de escape de cursor-back usando terminfo: %{terminfo[cub1]}

Confira as Perguntas frequentes e esta mensagem na lista de discussão para mais informações.

    
por 09.03.2014 / 01:18
1

Acho que o espaço em branco à direita está codificado. Mas você pode enganar zsh com a seguinte configuração:

RPROMPT="%{*%}"

que em princípio diz zsh que a estrela não possui caracteres; de man zshmisc :

%{...%} Include a string as a literal escape sequence. The string within the braces should not change the cursor position. (...)

A desvantagem é que você "desloca" o espaço em branco para o final de PROMPT :

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

Os símbolos | denotam as arestas do terminal, ■ o cursor.

Outra ideia seria aumentar COLUMNS em 1:

COLUMNS=$((COLUMNS + 1))

Mas é preciso pensar em uma maneira de fazer isso apenas para a renderização de prompt, mas não para os comandos. E isso engolirá o último caractere em cada linha em uma linha de comando de várias linhas.

    
por 08.10.2013 / 10:39
1

Enviei um relatório de bug para os mantenedores do zsh, mas parece que esse comportamento é por design. Este problema, no entanto, me incomodou tanto que decidi consertar e compilar o zsh como uma correção temporária. Se você está no OS X e usa o Homebrew (você deve), então você pode instalar o zsh incluindo meu patch executando:

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

você provavelmente desejará adicionar /usr/local/bin/zsh a /etc/shells e chsh -s /usr/local/bin/zsh posteriormente. Por fim, aqui está a diferença para quem está interessado:

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;
        /*
    
por 14.12.2013 / 19:51

Tags