ウィンドウが狭すぎると、なぜ zsh プロンプトが上方向に移動するのでしょうか?

ウィンドウが狭すぎると、なぜ zsh プロンプトが上方向に移動するのでしょうか?

zsh とおそらく urxvt (?) の組み合わせと思われる奇妙な動作があります。私の設定は次のとおりです。デフォルトのシェルとしてurxvt -e 'tmux'起動するターミナルを取得します。zsh

その後、カスタマイズを開始し$PROMPT、現在は次のようになっています。

 zstyle ':vcs_info:*' enable git svn hg bzr
 zstyle ':vcs_info:*' formats $' \e[0;33m(%s:%b)\e[0m'
 precmd () { vcs_info }
 PROMPT+=$'\e[0;31m%n\e[0m'
 PROMPT+="@"
 PROMPT+=$'\e[0;34m%m\e[0m'
 PROMPT+=":"
 PROMPT+=$'\e[0;36m%3c\e[0m'
 PROMPT+=$'\e[0;33m%c\e[0m'
 PROMPT+='${vcs_info_msg_0_}'
 export PROMPT

2%c行目に気付いたかもしれませんが、これはもちろんテスト用です。

プロンプトの通常の動作は、Enter キーを押した後に新しい行を作成し、オプションで存在するコマンドを実行することです。新しい行が印刷されます。ただし、特定の状況下では異なる動作が発生することに気付きました。Enter キーを押すと、コマンドが実行され、出力が表示されます。しかし前のプロンプトが端末の先頭になかった場合、新しい出力全体が 1 行上に移動されるため、前の出力の最後の行が上書きされます。

例を挙げたほうがいいかもしれません。空のターミナルと新しいプロンプトから始めましょう。

user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)

ここで、このディレクトリに入りますls -la(サンプル出力):

user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)

何かが欠けていることに注目してください。実際には、.gitここにはディレクトリがあります。

drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .git

ここで何が起こったかは簡単に説明できます。コマンド出力は正しく生成されますが、プロンプト行が 1 行上に移動し、出力の最後の行が上書きされます。同じことをもう一度実行すると、出力は次のようになります。

user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)ls -la
drwxr-xr-x 7 user user 4096 25. Jan 16:17 .
drwxr-xr-x 7 user user 4096 25. Jan 16:17 ..
user@hostname:very long directory name/with multiple components/foo~very long directory name/with multiple components/foo (git:master)

ご覧のとおり、すべてがもう一度上に移動され、今回は..前回の出力の と.git今回の出力の が置き換えられました。

しかし、これはすべての設定で発生するわけではありません。ウィンドウが狭すぎる場合にのみ発生します。さらに、zsh が入った urxvt ウィンドウを開いた状態でサイズを変更してテストしました。狭すぎると、プロンプトがウィンドウ幅の約 3 分の 2 を占めると発生します。ただし、原因はわかりません。なぜこれはこの機会に起こります。

注意: - bash では発生しません (プロンプト自体が複数行の場合でも) -RPROMPTRPROMPT2です - 表示される情報の種類に依存しないようです (つまり、無効にするvcs_infoと、プロンプトが再び十分に短くなる場合にのみ役立ちます) - プロンプトが複数行の場合 (2 行目が 3 分の 2 のマークに達していない場合) は発生しません - コンソール (tty) では発生しませんが、xterm では発生しますそしてurxvt。

まとめ: プロンプト行がウィンドウの約 3 分の 2 の長さの場合、zsh プロンプトは行が上に移動します。

答え1

bash カラー コードの代わりに使用することで修正できたようです%{fg[color]%}(もちろん、そのためにはカラー モジュールをロードする必要があります)。

関連情報