
プロンプトが次のようになっているとします(_ はカーソルを表します)
~ % _
こんな感じにする方法はありますか?
~ % _
[some status]
この質問はもともと zsh に関するものでしたが、現在は他の回答があります。
答え1
以下の設定が機能するようです。コマンド ラインが 1 行目からはみ出すと、2 行目のテキストは消えます。関数はpreexec
コマンドを実行する前に 2 行目を消去します。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]
ために送信する文字のシーケンスです。詳細については、(Linux の場合、セクション番号は他の Unix では異なる場合があります) を参照してください。$cap
$cap
man 5 terminfo
アクションのシーケンスは、カーソルを 1 行下に移動し ( cud1
)、次に上に戻します ( cuu1
)。カーソル位置を保存します ( sc
)。カーソルを 1 行下に移動します。印刷します[some status]
。カーソル位置を復元します。先頭のダウンおよびアップ ビットは、プロンプトが画面の一番下の行にある場合にのみ必要です。preexec 行は、2 番目の行 ( el
) を消去して、コマンドからの出力と混同されないようにします。
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
行は、zshの機能をエミュレートするハックな方法ですpreexec
。https://superuser.com/questions/175799/詳細については。
編集: Gilles のコメントに基づいてスクリプトを改善しました。