私のプロンプトが次のようになるとしましょう(_は私のカーソルを表します)。
~ % _
このように見せる方法はないでしょうか。
~ % _
[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行下に移動し、cud1
(cuu1
)カーソル位置をsc
保存します()。カーソルを1行下に移動します[some status]
。開始上位ビットと下位ビットは、プロンプトが画面の一番下の行にある場合にのみ必要です。 preexec行は、el
コマンドの出力と混同しないように2行目()を削除します。
テキストの2行目が端末よりも広い場合、ディスプレイが壊れる可能性があります。必要にCtrl応じて+を使用して編集してください。L
答え2
これは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
行はpreexec
zsh機能をエミュレートするきちんとした方法です。バラよりhttps://superuser.com/questions/175799/より多くの情報を知りたいです。
編集する:Gillesのコメントに基づいてスクリプトを改善しました。