XTerm を起動すると、端末の最初の行でプロンプトが開始されます。コマンドを実行すると、プロンプトは下部に到達するまで下に移動し、それ以降はそのまま残ります(そうでない場合、またはShiftマウスPage Downがそれを変更する可能性があります)。最終ライフサイクルの始まりを「特別」にする代わりにプロンプトは常に端末の下部にある必要があります。私が持っている点を参考にしてください複数行のプロンプト。
もちろん、以前と同じように機能する必要があります(サイズ調整可能、スクロール可能、出力から不要な改行なし、出力が奇妙に消えない)。したがって、同様のPROMPT_COMMAND='echo;echo;...'
ものはオプションではありません。理想的には、ソリューションはシェルに固有のものではありません。
編集する:これ現在のソリューション単純なケースを処理するときにいくつかの問題があります。
- それバッシュ固有。理想的なソリューションは、他のシェルに移植可能でなければなりません。
- それ他のプロセスによって修正されると失敗します。
PS1
。たとえば、virtualenvがあります(virtualenv)
。スタートPS1
そして常にスクロールせずに見える部分の上から消えます。 - Ctrll-今削除歴史の最後のページ。
XTermを分岐する以外に、これらの問題を回避する方法はありますか?
ベストアンサー1
使用している場合は、bash
次のトリックを実行する必要があります。
TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"
tput
または(各プロンプトの前にコマンドを実行しますが、ターミナルウィンドウのサイズを変更した後はそれほど効率的ではありません):
PS1='\[$(tput cup "$LINES")\]'$PS1
終了コードが変更されないようにするには、tput
明示的に保存してリセットするだけです。
PS1='\[$(retval=$?;tput cup "$LINES";exit $retval)\]'$PS1
この変数はローカル変数なので、シェルで定義した変数にはretval
影響しません。retval
ほとんどの端末cup
機能は同じなので、\e[y;xH
ハードコードすることもできます。
PS1='\[\e[$LINES;1H\]'$PS1
後でPS1をリセットしないようにするには、このPROMPT_COMMAND
変数を使用することもできます。設定するとコマンドで実行されます。今後出力プロンプト。だからこんな効果も得られます
PROMPT_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'
もちろん、リセットはPS1
ここには影響しませんが、他のソフトウェアも変更される可能性がありますPROMPT_COMMAND
。