web-dev-qa-db-ja.com

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

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

~ % _

このようにする方法はありますか

~ % _
[some status]

質問はもともとzshに関するものでしたが、現在は他の回答があります。

21
xenoterracide

次の設定は機能しているようです。コマンドラインが最初の行からオーバーフローすると、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行下に移動し(cud1)、次に上に移動します(cuu1);カーソル位置を保存します(sc);カーソルを1行下に移動します。印刷[some status];カーソル位置を復元します。先頭の上下ビットは、プロンプトが画面の一番下の行にある場合にのみ必要です。 preexec行は、2行目(el)を消去して、コマンドからの出力と混同されないようにします。

2行目のテキストが端末よりも広い場合、表示が文字化けする可能性があります。使用する Ctrl+L ピンチで修理する。

以下は、Gillesのzshソリューションに相当するbashです。 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つをサポートしていない場合は、1行のプロンプトにフォールバックします。

trap行は、zshのpreexec関数をエミュレートするためのハッキーな方法です。詳細は https://superuser.com/questions/175799/ を参照してください。

[〜#〜] edit [〜#〜]:Gillesのコメントに基づいてスクリプトを改善しました。

5
Jander