シェルプロンプトで、プロンプトの下に内容を表示しますか?

シェルプロンプトで、プロンプトの下に内容を表示しますか?

私のプロンプトが次のようになるとしましょう(_は私のカーソルを表します)。

~ % _

このように見せる方法はないでしょうか。

~ % _
[some status]

この質問は元のzshに関するものでしたが、今は別の答えがあります。

答え1

次の設定が機能しているようです。コマンドラインが最初の行を超えると、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のセクション番号は他のuniceと異なる場合があります)を参照してください。

作業順序は次のとおりです。カーソルを1行下に移動し、cud1cuu1)カーソル位置をsc保存します()。カーソルを1行下に移動します[some status]。開始上位ビットと下位ビットは、プロンプトが画面の一番下の行にある場合にのみ必要です。 preexec行は、elコマンドの出力と混同しないように2行目()を削除します。

テキストの2行目が端末よりも広い場合、ディスプレイが壊れる可能性があります。必要にCtrl応じて+を使用して編集してください。L

答え2

これはbashGillesの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行はpreexeczsh機能をエミュレートするきちんとした方法です。バラよりhttps://superuser.com/questions/175799/より多くの情報を知りたいです。

編集する:Gillesのコメントに基づいてスクリプトを改善しました。

関連情報