XTermを起動すると、プロンプトは端末の最初の行から始まります。コマンドを実行すると、プロンプトは下に達するまで下に移動し、それ以降はそこにとどまります( Shift-Page Down またはマウスでこれを変更できます)。端末のライフタイムの開始を「特別」にするのではなく、プロンプトは常に端末の下部にある必要があります。multi -line Prompt 。
もちろん、それ以外は以前と同じように機能するはずです(サイズ変更、スクロール可能、出力に不要な改行がなく、出力が不思議な形で消えることはありません)。したがって、Prompt_COMMAND='echo;echo;...'
などはオプションではありません。ソリューションは理想的にはシェル固有のものであってはなりません。
編集:現在の解決策 は、単純なケースでは機能しますが、いくつかの問題があります。
PS1
を変更すると失敗します。 1つの例はvirtualenvで、これは(virtualenv)
の-startにPS1
を追加します。これにより、フォールドのすぐ上に常に消えます。XTermをフォークする以外に、これらの問題を回避する方法はありますか?
bash
を使用する場合は、次の方法でうまくいくはずです。
TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"
または(各プロンプトの前に1つの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
変数。設定すると、コマンドとして実行されますbeforeプロンプトが出力されます。したがって、この効果は
Prompt_COMMAND='(retval=$?;tput cup "$LINES";exit $retval)'
もちろん、リセット中はPS1
はこれに影響しません。他の一部のソフトウェアも変更される可能性がありますPrompt_COMMAND
。
前の答えを少し簡略化したので、実行する方が簡単だと思いました。
tput cup $LINES
.bashrc
または.zshrc
の先頭。それは仕事をするだけです。
長所:
短所:
clear
からclear; tput ...
へのエイリアスを作成しても効果がありません。$LINES
を使用した回答は、不必要に移植できません。 resize
で行ったように、単純に xterm
に要求して、位置を任意の大きな行番号に設定できます。たとえば、
tput cup 9999 0
(ウィンドウが1万行よりも小さいと仮定して、scrollbackは無視してください)。
ウィンドウのサイズ変更の副作用として文字列は変更されないため、これを一度計算して、それを定数としてプロンプト文字列に貼り付けることができます。たとえば、
TPUT_END=$(tput cup 9999 0)
以降
PS1="${TPUT_END} myprompt: "
あなたの好みに応じて。
PS1
を変更する他のプロセスについては、変更後にPS1
を再計算して、希望どおりに見えるようにする必要があります。しかし、質問にはwhereを指摘して変更を加えるのに十分な詳細がありません。
そして最後に:bashの仮定により、タブ補完の動作はこの種の変更と一致しません。