zsh($ RPROMPT)の右プロンプトの最後にある無駄なスペースを削除する


17

zshでは、右側のプロンプトの右側に常にスペース文字があります。私は次のような非常にシンプルな.zshrcを試しました。

PROMPT="#"
RPROMPT="*"

画面の右側の*の後には常にスペースがあります。

これは、問題を示すスクリーンショットです(行の1つでスペースを選択しました)。 http://i.imgur.com/cnfa2eJ.png

ありがとう。

回答:


19

TL; DR

あなたがする必要があるのは、これをあなたの~/.zshrc(またはあなたのプロンプトテーマと同じファイルに)置くことです:

ZLE_RPROMPT_INDENT=0

詳細

5.0.2までのZSHのバージョンでは、rprompt_off(右マージンオフセットを設定する)と呼ばれるZSHのCソースコードの値はにハードコードされていました1

しかし、5.0.5リリースでは、開発者はZLE_RPROMPT_INDENT環境変数を設定してこのデフォルト値をオーバーライドする機能を追加しました。

根拠一部の古い端末は、ディスプレイの最後のセルはそれに文字があった場合、スクロール開始するので、この「インデント」のためです。

5.0.5より前のZSHのバージョンの場合

古いバージョンのZSHを使用していて更新できない場合でも、次の両方を実行することでそのスペースを取り除くことができます。

  1. トリック、それは実際には標準見えないシーケンスラッパーを使用しているよりも、文字短いあなたのRPROMPTを考えることにZSHを:%{...%}
  2. 次に、terminfoを使用してカーソルバックエスケープシーケンスを送信します。 %{terminfo[cub1]}

チェックアウトよくある質問そのメッセージの詳細はメーリングリスト上を。


5
また、これは入力カーソルを通常の位置の1文字左に配置するようです。たとえば、この質問のプロンプトを使用すると、カーソルはすぐ右側ではなくハッシュマークに置かます。(私にとっては、ゼロ未満の値にオフセットプロンプトを行いた設定し、正しい場所に表示され、カーソルのzsh 5.0.8と5.2で観察した。。)
ロブ・ケネディ

5.2で機能します。
アンソニーマイケルクック

5
5.2ではうまくいきましたが、PROMPTの問題が発生しました。PROMPTの最後の文字が消え、オートコンプリートを切り替えると、その最後の文字が現在の入力の最初の文字で埋められます。たとえば、次のように%git<Tab>変換されます%ggit
ロボスロン

ZSHの新しいバージョンのトリックを使用する必要はありません。
アンソニーマイケルクック

5
ZLE_RPROMPT_INDENT = 0を設定した後、左側のプロンプトで同じ問題が発生することに気付きました。ただし、0の代わりに-1を使用すると、ZLE_RPROMPT_INDENT = -1の場合、ほとんどすべてが期待どおりに機能します。github.com/bhilburn/powerlevel9k/issues/…でそのヒントを見ました。ほとんどの場合、-1を指定するとmacOSのターミナルウィンドウの最終行が使用されないためです。
マークリアナージュ

2

バグレポートをzshメンテナーに送信しましたが、この動作は仕様によるもののようです。しかし、この問題に非常に悩まされ、一時的な修正としてzshを自分でパッチを適用してコンパイルすることにしました。OS XでHomebrewを使用している場合(そうすべきです)、次のコマンドを実行して、パッチを含むzshをインストールできます。

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

あなたはおそらく追加したくなるでしょう/usr/local/bin/zsh/etc/shellschsh -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メンテナー)が拡張パッチを投稿したばかりなので、RPROMPTのインデントはまもなく公式のソースにあるはずです。
mpy

リンクを投稿していただきありがとうございます。次のリリースを楽しみにしています!
パトリックオスシティ

1

右側の空白はハードコードされていると思います。ただしzsh、次の設定でトリックすることができます。

RPROMPT="%{*%}"

原則zshとして、星は文字を占有しません。からman zshmisc

%{...%} 文字列をリテラルエスケープシーケンスとして含めます。中括弧内の文字列は、カーソルの位置を変更しないでください。(...)

欠点は、空白を次の末尾に「シフト」することですPROMPT

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

|シンボルは、カーソルを■、端子のエッジを示します。


別のアイデアはCOLUMNS、1 を増やすことです。

COLUMNS=$((COLUMNS + 1))

ただし、コマンドではなくプロンプトレンダリングに対してのみこれを行う方法を考える必要があります。そして、これは複数行のコマンドラインの各行の最後の文字を飲み込みます。


1
ありがとう。%{...%}トリックを試してみました。右側に表示される時間とgitステータスを処理しました。PROMPTには余分なスペースがありますが、これは通常持っているからです。ただし、このソリューションには1つの大きな欠点があります
。TABで
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.