私が探しているものを正確に説明するのは難しいので、端末がどのように機能したいかを説明するためにいくつかのサンプル出力を作成しました。 (行の先頭の各数字はその行の戻りを表し、>は入力行を表します。
> me@computer:~$
5. me@computer:~$ cat somefile < command
start of file < output
< output
this < output
is < output
the < output
content < output
of < output
the < output
file < output
< output
end of file < output
4. me@computer:~$
3. me@computer:~$
2. me@computer:~$
1. me@computer:~$ echo this is the first line < command
this is the first line < output
この例では、実行するコマンドを入力する入力行が常に一番上にあります。つまり、各コマンドとその出力を「イベント」にプッシュします。したがって、ファイルをcatに指定すると、すべての内容が逆順に出力されるため、各コマンドの出力は外観が変わらず、位置だけが異なります。
答え1
誰かがすでにこれを行っている可能性があります(そうではないかもしれません)。これは、コマンド出力を収集して画面を更新する方法を知っているシェルを介して行う必要があります。通常の端末はこの作業を独自に行いません。
すべてのコマンドに対してこれを実行するプログラムがあるとします。
- 入力コマンド(いくつか減らすことができます)が許可されています。簡単にするために、まず入力を1行に制限します。
- テキストをインポートした後、シェルはコマンドを実行して、コマンドの標準出力から一度に1行ずつ収集します。そして間違い。
- 新しい出力行を取得したら、既存のテキストを下に押しながらその行を画面に挿入する必要があります。より多くの出力を読み取ると、挿入点が下に移動します。 (ターミナルで提供低レベル操作は役に立つかもしれませんが、成功するにはまだ遠いです。働く)。
- 画面が受け入れることができるよりも多くの出力がある場合、ユーザーは挿入ポイントが画面の下部に達したときに出力が上にスクロールし始めるようにすることができます。
- 出力がなくなると(コマンドが停止する)、シェルはカーソルを画面上部に戻します。
みんなそれ簡単なプログラムで可能です。難しいのは、コマンドが画面自体を占有したい場合です。これを実行するプログラムは、(あなたが推測したように)標準出力と標準エラーに書き込まれます。そして彼らはプレーンテキストを書きません。画面の周りを移動するためにエスケープシーケンスを使用します。
端末初期化シーケンスを送信するうまく動作するアプリケーションに制限すると、シェルは(原則として)それを検出して一時的に放棄し、コマンドが画面に書き込まれるようにします。しかし、ほとんどのアプリケーションはうまく機能し、処理する必要がある興味深い特別なケースがたくさんあります。
答え2
興味深いアイデアですが、まだこれを実現できる製品はないようです。この目的のために協力する必要がある相互に関連する部分がたくさんあります。
ターミナルは数十年の増分履歴を持ち、常に同じ基本的な方法で動作してきたため、ターミナルの動作方法を変更する試みはあまりありませんでした。
つまり、必要なものを実行する単純なncursesアプリケーションを書くことはそれほど難しくありませんが、基本的なコマンドでのみ機能し、完全な端末が必要なもの(vim、nano、screen、top waitなど)では失敗します。 。それらをサポートすることは多くのことです。
しかし、最近、最新のターミナルアプリケーションを作成しようとしました。用語。私が見た中で最も急進的なものは黒い画面興味があるかもしれません。これはまさにあなたが探しているものではなく、まだ開発の初期段階にあります(問題が発生する可能性があります)。コマンドの開始/停止などの出力を参照してください。
答え3
この想像上のデザインがすべて端末をより自然に読みやすくするためのものであれば、問題を逆に解決することを考えたことがありますか?
- プロンプトは常に一番下にあります。
- 前のコマンドと出力は画面全体に流れます。
これは、基本的に端末の元の動作を再利用することを意味し、唯一の違いは、端末を起動してすぐにプロンプトを一番下にプッシュすることです。
次のコード行を使用してこれを達成しました~/.bashrc
。
__prompt_to_bottom_line() {
tput cup $LINES
}
alias clear='clear && __prompt_to_bottom_line'
必要なアプローチは、出力ラインの順序をマイナーな方法で変更する必要があるため、問題があります。
- コマンドは逆の順序で提示する必要があります。
- ただし、各コマンドの出力は元の順序で表示する必要があります。
私の方法はこれらの不均一性を経験しません。なぜなら私がすることは最初からチップを底に押し出すだけだからです。
本質的に、私の画面はtac
あなたの画面です(つまり、コマンドの出力が複数行の場合は実際の編集ではtac
ありません)。