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


21

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

~ % _

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

~ % _
[some status]

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


どのように画面について+ buobu?:launchpad.net/byobu、多分kmandla.wordpress.com/2010/01/03/...スクリーンショットのために
ヤヌス

回答:


17

次の設定が機能しているようです。コマンドラインが最初の行をオーバーフローすると、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を使用して修復します。


5

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/を参照してください

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


@Gilles:入力をありがとう!今はもっと良くなったと思う。gnome-terminalとxtermでbash 4.1.5、OSX Terminalでbash 3.2.48を試しました。
ジャンダー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.