回答:
次の設定が機能しているようです。コマンドラインが最初の行をオーバーフローすると、2行目のテキストは消えます。このpreexec
関数は、コマンドを実行する前に2行目を消去します。維持する場合は、に変更しpreexec () { echo; }
ます。
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
エスケープは、zshマニュアル(man zshmisc
)に記載されています。
Terminfoは端末アクセスAPIです。Zshには、terminfo
端末記述データベースへのアクセスを提供するモジュールがあります。これ$terminfo[$cap]
は、端末の機能$cap
を実行するため、つまり$cap
コマンドを実行するために送信する文字のシーケンスです。詳細については、man 5 terminfo
(Linuxでは、セクション番号は他の大学で異なる場合があります)を参照してください。
アクションのシーケンスは次のとおりです。カーソルを1行下に移動し(cud1
)、次に上に移動します(cuu1
)。カーソル位置を保存します(sc
)。カーソルを1行下に移動します。印刷[some status]
; カーソル位置を復元します。先頭の上下ビットは、プロンプトが画面の最下行にある場合にのみ必要です。preexec行el
は、コマンドからの出力と混同しないように2行目()を消去します。
2行目のテキストが端末よりも広い場合、ディスプレイが文字化けすることがあります。ピンチでCtrl+ Lを使用して修復します。
bash
これは、Gillesのzshソリューションに相当するものです。Bashにはネイティブのterminfoモジュールはありませんが、tput
コマンド(にバンドルされているterminfo
)はほぼ同じことを行います。
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
端末がいずれかの機能をサポートしていない場合、1行のプロンプトにフォールバックします。
このtrap
行は、zshのpreexec
機能をエミュレートするためのハックな方法です。詳細については、https://superuser.com/questions/175799/を参照してください。
編集:ジルのコメントに基づいてスクリプトを改善しました。