Rimozione dello spazio inutile alla fine del prompt giusto di zsh ($ RPROMPT)


18

In zsh, c'è sempre un carattere spazio alla destra del mio prompt giusto. Ho provato con un .zshrc molto semplice come:

PROMPT="#"
RPROMPT="*"

C'è sempre uno spazio dopo il * sulla destra dello schermo.

Ecco uno screenshot che mostra il problema (ho selezionato lo spazio su una delle linee). http://i.imgur.com/cnfa2eJ.png

Grazie.

Risposte:


20

TL; DR

Tutto quello che devi fare è metterlo nel tuo ~/.zshrc(o nello stesso file del tema del prompt):

ZLE_RPROMPT_INDENT=0

Dettagli

Nelle versioni di ZSH che portavano alla 5.0.2 un valore nel codice sorgente C di ZSH chiamato rprompt_off(che impostava l'offset del margine destro) era codificato 1.

Ma nella versione 5.0.5 gli sviluppatori hanno aggiunto la possibilità di sovrascrivere questo valore predefinito impostando la ZLE_RPROMPT_INDENTvariabile di ambiente.

La logica di questo "trattino" è perché alcuni terminali più vecchi inizierebbero a scorrere se l'ultima cella del display avesse un carattere.

Per versioni di ZSH precedenti alla 5.0.5

Se utilizzi una versione precedente di ZSH e non riesci ad aggiornare, puoi comunque liberarti di quello spazio effettuando entrambe le seguenti operazioni:

  1. Ingannare ZSH a pensare il tuo rprompt è un personaggio più breve di quello che effettivamente sta usando l'involucro sequenza invisibile di serie:%{...%}
  2. Quindi inviando una sequenza di escape di ritorno al cursore usando terminfo: %{terminfo[cub1]}

Consulta le FAQ e questo messaggio sulla mailing list per maggiori informazioni.


5
Questo sembra anche posizionare il cursore di input di un carattere a sinistra di dove sarebbe normalmente. Utilizzando le istruzioni in questa domanda, ad esempio, il cursore viene posizionato sul segno di hash, anziché immediatamente alla sua destra. (Per me, impostare l'offset su un valore inferiore a zero fa apparire i prompt e il cursore nei punti corretti. Osservato con zsh 5.0.8 e 5.2.)
Rob Kennedy

Funziona per me in 5.2.
Anthony Michael Cook,

5
In un certo senso ha funzionato per me in 5.2, ma ora ho problemi con PROMPT: l'ultimo carattere in PROMPT è scomparso e l'attivazione del completamento automatico riempie l'ultimo carattere con il primo carattere dell'input corrente. Ad esempio si %git<Tab>trasforma in%ggit
roboslone il

Non è necessario utilizzare i trucchi per le versioni più recenti di ZSH.
Anthony Michael Cook,

5
Dopo aver impostato ZLE_RPROMPT_INDENT = 0 ho notato gli stessi problemi di glitch del disegno con il prompt sul lato sinistro che alcuni altri menzionano sopra. Tuttavia, quasi tutto funziona come previsto se uso -1 anziché 0, ovvero ZLE_RPROMPT_INDENT = -1. Ho visto quel suggerimento su github.com/bhilburn/powerlevel9k/issues/… . Quasi, perché con -1 non usa mai la riga inferiore di una finestra terminale su macOS.
Marc Liyanage

2

Ho inviato una segnalazione di bug ai manutentori di zsh, ma sembra che questo comportamento sia di progettazione. Questo problema però mi ha infastidito così tanto che ho deciso di correggere e compilare zsh da solo come una soluzione temporanea. Se sei su OS X e usi Homebrew (dovresti), puoi installare zsh inclusa la mia patch eseguendo:

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

è probabile che desidera aggiungere /usr/local/bin/zshalla /etc/shellse chsh -s /usr/local/bin/zshdopo. Infine, ecco il diff grezzo per chiunque sia interessato:

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 (manutentore zsh) ha appena pubblicato una patch estesa , quindi il rientro RPROMPT dovrebbe essere presto nelle fonti "ufficiali".
mpy,

Grazie per aver pubblicato il link. In attesa della prossima versione!
Patrick Oscity,

1

Penso che lo spazio bianco a destra sia codificato. Ma puoi ingannare zshcon la seguente impostazione:

RPROMPT="%{*%}"

che in linea di principio dice zshche la stella non occupa personaggi; da man zshmisc:

%{...%} Includi una stringa come sequenza di escape letterale. La stringa tra parentesi graffe non dovrebbe cambiare la posizione del cursore. (...)

Lo svantaggio è che "sposta" lo spazio vuoto alla fine di PROMPT:

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

I |simboli indicano i bordi dei terminali, ■ il cursore.


Un'altra idea sarebbe quella di aumentare COLUMNSdi 1:

COLUMNS=$((COLUMNS + 1))

Ma si deve pensare a un modo per farlo solo per il rendering rapido, ma non per i comandi. E questo inghiottirà l'ultimo carattere su ogni riga su una riga di comando multilinea.


1
Grazie. Ho provato a giocare con il trucco% {...%}, affrontando il mio tempo e lo stato git visualizzati sulla destra. Non mi dispiace lo spazio extra sul PROMPT perché di solito ne ho uno. Tuttavia, c'è un grosso svantaggio con questa soluzione: quando attivo il completamento automatico con TAB, lo spazio extra viene rimosso e sta facendo cose strane :)
Frozax
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.