Entfernen des nutzlosen Speicherplatzes am Ende der rechten Eingabeaufforderung von zsh ($ RPROMPT)

17

In zsh befindet sich rechts von meiner rechten Eingabeaufforderung immer ein Leerzeichen. Ich habe versucht mit einer sehr einfachen .zshrc wie:

PROMPT="#"
RPROMPT="*"

Nach dem * auf der rechten Seite des Bildschirms befindet sich immer ein Leerzeichen.

Hier ist ein Screenshot, der das Problem zeigt (ich habe das Leerzeichen in einer der Zeilen ausgewählt). http://i.imgur.com/cnfa2eJ.png

Vielen Dank.

Frozax
quelle

Antworten:

19

TL; DR

Alles, was Sie tun müssen, ist dies in Ihr ~/.zshrc(oder in die gleiche Datei wie Ihr Eingabeaufforderungs-Thema) zu schreiben:

ZLE_RPROMPT_INDENT=0

Einzelheiten

In Versionen von ZSH bis 5.0.2 wurde ein Wert in ZSHs C-Quellcode rprompt_off(der den Versatz am rechten Rand festlegte) auf fest programmiert 1.

In der Version 5.0.5 haben die Entwickler jedoch die Möglichkeit hinzugefügt, diesen Standardwert durch Festlegen der ZLE_RPROMPT_INDENTUmgebungsvariablen zu überschreiben .

Die Gründe für diesen „Gedankenstrich“ sind , weil einige älteren Terminals Scrollen beginnen würden , wenn die letzte Zelle des Displays in ihm einen Charakter hat.

Für Versionen von ZSH vor 5.0.5

Wenn Sie eine ältere Version von ZSH verwenden und keine Aktualisierung durchführen können, können Sie diesen Speicherplatz trotzdem entfernen, indem Sie beide der folgenden Schritte ausführen:

  1. Trick ZSH zu denken , Ihre RPROMPT ein Zeichen kürzer ist, als es tatsächlich ist den Standard unsichtbare Sequenz Wrapper:%{...%}
  2. Dann senden Sie eine Cursor-Back-Escape-Sequenz mit terminfo: %{terminfo[cub1]}

Lesen Sie die FAQ und diese Nachricht auf der Mailingliste, um weitere Informationen zu erhalten.

Anthony Michael Cook
quelle
4
Dies scheint auch den Eingabecursor ein Zeichen links von der Stelle zu platzieren, an der er sich normalerweise befinden würde. Wenn Sie beispielsweise die Eingabeaufforderungen in dieser Frage verwenden, wird der Cursor nicht unmittelbar rechts von der Raute, sondern auf die Raute gesetzt. (Für mich auf einen Wert der Offset - Einstellung kleiner als Null macht die Eingabeaufforderungen und Cursor an den richtigen Stellen erscheinen Beobachtet mit zsh 5.0.8 und 5.2.)
Rob Kennedy
Funktioniert bei mir in 5.2.
Anthony Michael Cook
4
Es hat in 5.2 irgendwie funktioniert, aber jetzt habe ich Probleme mit PROMPT: Das letzte Zeichen in PROMPT ist verschwunden und das Umschalten der Autovervollständigung füllt das letzte Zeichen mit dem ersten Zeichen der aktuellen Eingabe. Zum Beispiel %git<Tab>verwandelt sich in%ggit
Roboslone
Sie müssen die Tricks nicht für neuere Versionen von ZSH verwenden.
Anthony Michael Cook
5
Nachdem ich ZLE_RPROMPT_INDENT = 0 gesetzt hatte, bemerkte ich die gleichen Probleme mit dem Zeichnungsfehler bei der linken Eingabeaufforderung, die oben von einigen anderen erwähnt wurden. Fast alles funktioniert jedoch wie erwartet, wenn ich -1 anstelle von 0 verwende, dh ZLE_RPROMPT_INDENT = -1. Ich habe diesen Tipp unter github.com/bhilburn/powerlevel9k/issues/… gesehen . Fast, denn mit -1 wird unter macOS nie die unterste Zeile eines Terminalfensters verwendet.
Marc Liyanage
2

Ich habe einen Fehlerbericht an die zsh-Betreuer gesendet, aber es scheint, dass dieses Verhalten beabsichtigt ist. Dieses Problem ärgerte mich jedoch so sehr, dass ich mich entschied, zsh selbst als temporäre Korrektur zu patchen und zu kompilieren. Wenn Sie unter OS X arbeiten und Homebrew verwenden (das sollten Sie), können Sie zsh einschließlich meines Patches installieren, indem Sie Folgendes ausführen:

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

Sie werden wahrscheinlich /usr/local/bin/zshzu /etc/shellsund nach hinzufügen wollen chsh -s /usr/local/bin/zsh. Und zum Schluss hier noch das Rohling für alle, die sich dafür interessieren:

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;
        /*
Patrick Oscity
quelle
PWS (zsh-Betreuer) hat gerade einen erweiterten Patch gepostet , daher sollte RPROMPT-Einrückung bald in den offiziellen Quellen erscheinen.
mpy
Vielen Dank für den Link. Freue mich auf die nächste Veröffentlichung!
Patrick Oscity
1

Ich denke, der weiße Raum rechts ist hartcodiert. Sie können aber zshmit folgender Einstellung tricksen :

RPROMPT="%{*%}"

was im Prinzip sagt, zshdass der Stern keine Zeichen besetzt; von man zshmisc:

%{...%} Fügen Sie eine Zeichenfolge als wörtliche Escape-Sequenz ein. Die Zeichenfolge in geschweiften Klammern sollte die Cursorposition nicht ändern. (...)

Der Nachteil ist, dass Sie das Leerzeichen an das Ende von "verschieben" PROMPT:

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

Die |Symbole kennzeichnen die Endkanten, ■ den Cursor.


Eine andere Idee wäre, um COLUMNS1 zu erhöhen :

COLUMNS=$((COLUMNS + 1))

Man muss sich aber überlegen, wie man das nur für das Prompt-Rendering macht, nicht aber für die Befehle. Dadurch wird das letzte Zeichen in jeder Zeile einer mehrzeiligen Befehlszeile verschluckt.

mpy
quelle
1
Vielen Dank. Ich habe versucht, mit dem% {...%} -Trick zu spielen, der sich mit meiner Zeit und dem Git-Status befasst, die rechts angezeigt werden. Der zusätzliche Platz auf dem PROMPT macht mir nichts aus, da ich normalerweise einen habe. Es gibt jedoch einen großen Nachteil bei dieser Lösung: Wenn ich die automatische Vervollständigung mit TAB aktiviere, wird der zusätzliche Speicherplatz entfernt und es werden seltsame Dinge getan :)
Frozax