下部にプロンプ​​トを表示してXTermを起動する方法は?


12

XTermを起動すると、プロンプトは端末の最初の行から始まります。コマンドにそれが底に達する、とまでダウンプロンプト移動を実行している場合、その上に、その後そこから(もないままShift- Page Downまたはマウスがこれを変更することができます)。端末のライフタイムの開始を「特別」にするのではなく、プロンプトは常に端末の下部にある必要があります。複数行のプロンプトがあることに注意してください。

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

編集:現在のソリューションは、単純な例での作業中に、いくつかの問題があります。

  • それはだバッシュの特定。理想的なソリューションは、他のシェルに移植可能でなければなりません。
  • 他のプロセスが変更するPS1失敗します。1つの例はvirtualenvです。これは(virtualenv)、の最初に追加され、PS1その後、常に折りたたみの真上で消えます。
  • Ctrl- l削除歴史の最後のページを。

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


どういうわけか、Xtermのスクロールバーバッファーに空白文字を導入する必要があります。
SHW

3
実際、clearコマンドを実行することで、いつでもプロンプトを簡単に先頭に戻すことができます。
ワルダイバー2014

@SHWハックではなく、この設定があることを望んでいました。ターミナルハックは、私の経験に非常に微妙なバグをもたらす傾向があります。
l0b0 2014

@werediverしかし、私それがトップになることを望んでいません。
l0b0

1
いつシェルがプロンプトを出力するかを知っているので、すべてのソリューションはシェルのコンテキスト内にある必要があります。XTermは、出力するように要求されたものがプロンプトであるかどうかを知らないので、XTermをフォークしても役に立ちません。端末の場合、シェルプロンプトは別の文字シーケンスであり、受信する可能性のある他の文字シーケンスと違いはありません。
celtschk 14

回答:


11

を使用する場合bashは、次の方法で対処できます。

TOLASTLINE=$(tput cup "$LINES")
PS1="\[$TOLASTLINE\]$PS1"

または(tput各プロンプトの前に1つのコマンドを実行しますが、ターミナルウィンドウのサイズが変更された後に機能するため、効率が低下します):

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


tput多くのechoコマンドとどう違うのですか?(好奇心からの質問)
SHW 2014

@ l0b0、おそらく別の答えには値しません。私はセルツクが私が彼/彼女の答えを編集したことを気にしないことを望みます。
ステファンChazelas

'\[$(tput cup "$LINES")\]' 美しく動作します。ありがとう!
l0b0 2014

に問題がありますtput:リセットされているよう$exit_codeです。を使用して修正\[\e[$LINES;1H\]
l0b0 2014

1
@ l0b0:tput終了コードを保持するバージョンを追加しました。
celtschk 2014

4

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

tput cup $LINES

.bashrcまたはの初めに.zshrc。それは仕事をするだけです。

長所:

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

短所:

  • ^ Lを使用して画面をクリアすると、印刷されず、エイリアスclearを設定clear; tput ...しても解決しません。
  • 端末のサイズを変更するとプロンプトが別の場所に移動する

2

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

tput cup 9999 0

スクロールバックを無視して、ウィンドウが1万行よりも小さいと仮定します)。

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

TPUT_END=$(tput cup 9999 0)

以降

PS1="${TPUT_END} myprompt: "

あなたの好みに応じて。

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

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


「タブ補完の動作がこの種の変更と一致しない」とはどういう意味ですか?
l0b0

というかPS1="${TPUT_END} myprompt: "、それともPS1="${TPUT_END}${PS1}"
l0b0

後者の場合-正しい(makefileの考え方からの誤植)。前者の場合、bashのコマンド編集は(プロンプトを使用して)行を再印刷できることに依存しており、これがコマンドの完了によるスクロールと組み合わされると、奇妙な動作が発生する可能性があることを覚えています。
トーマスディッキー2016
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.