web-dev-qa-db-ja.com

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

Zshでは、右側のプロンプトの右側に常にスペース文字があります。私は次のような非常に単純な.zshrcを試してみました:

Prompt="#"
RPROMPT="*"

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

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

ありがとう。

18
Frozax

TL; DR

これを~/.zshrc(または、プロンプトテーマと同じファイル)に配置するだけです。

ZLE_RPROMPT_INDENT=0

詳細

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

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

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

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

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

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

詳細については、メーリングリストの [〜#〜] faq [〜#〜] および このメッセージ を確認してください。

20

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;
        /*
2
Patrick Oscity

右側の空白はハードコーディングされていると思います。ただし、次の設定でzshをだますことができます。

RPROMPT="%{*%}"

これは原則として、星が文字を占めていないことをzshに伝えます。 man zshmiscから:

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

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

|プロンプト= "#" | 
 | RPROMPT = "%{*%}" | 
 |#■* |

|記号は、終端エッジ、■カーソルを示します。


もう1つのアイデアは、COLUMNSを1ずつ増やすことです。

COLUMNS=$((COLUMNS + 1))

しかし、これをどのようにしてプロンプトレンダリングのみに実行し、コマンドには実行しないかを考える必要があります。そして、これは複数行のコマンドラインの各行の最後の文字を飲み込みます。

1
mpy