web-dev-qa-db-ja.com

下部にプロンプ​​トを表示してXTermを起動するにはどうすればよいですか?

XTermを起動すると、プロンプトは端末の最初の行から始まります。コマンドを実行すると、プロンプトは下に達するまで下に移動し、それ以降はそこにとどまります( Shift-Page Down またはマウスでこれを変更できます)。端末のライフタイムの開始を「特別」にするのではなく、プロンプトは常に端末の下部にある必要があります。multi -line Prompt

もちろん、それ以外は以前と同じように機能するはずです(サイズ変更、スクロール可能、出力に不要な改行がなく、出力が不思議な形で消えることはありません)。したがって、Prompt_COMMAND='echo;echo;...'などはオプションではありません。ソリューションは理想的にはシェル固有のものであってはなりません。

編集:現在の解決策 は、単純なケースでは機能しますが、いくつかの問題があります。

  • Bash固有です。理想的なソリューションは、他のシェルに移植できる必要があります。
  • 他のプロセスがPS1を変更すると失敗します。 1つの例はvirtualenvで、これは(virtualenv)の-​​startPS1を追加します。これにより、フォールドのすぐ上に常に消えます。
  • Ctrl-l 現在削除履歴の最後のページ。

XTermをフォークする以外に、これらの問題を回避する方法はありますか?

12
l0b0

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

11
celtschk

前の答えを少し簡略化したので、実行する方が簡単だと思いました。

tput cup $LINES

.bashrcまたは.zshrcの先頭。それは仕事をするだけです。

長所:

  • シェルを起動したときに一度だけ印刷されます

短所:

  • ^ Lで画面をクリアすると、印刷されず、clearからclear; tput ...へのエイリアスを作成しても効果がありません。
  • 端末のサイズを変更するとプロンプトが別の場所に移動する
4
phil pirozhkov

$LINESを使用した回答は、不必要に移植できません。 resize で行ったように、単純に xterm に要求して、位置を任意の大きな行番号に設定できます。たとえば、

tput cup 9999 0

(ウィンドウが1万行よりも小さいと仮定して、scrollbackは無視してください)。

ウィンドウのサイズ変更の副作用として文字列は変更されないため、これを一度計算して、それを定数としてプロンプト文字列に貼り付けることができます。たとえば、

TPUT_END=$(tput cup 9999 0)

以降

PS1="${TPUT_END} myprompt: "

あなたの好みに応じて。

PS1を変更する他のプロセスについては、変更後にPS1を再計算して、希望どおりに見えるようにする必要があります。しかし、質問にはwhereを指摘して変更を加えるのに十分な詳細がありません。

そして最後に:bashの仮定により、タブ補完の動作はこの種の変更と一致しません。

2
Thomas Dickey