web-dev-qa-db-ja.com

端末入力ラインを端末の上部に保持しますか?

私が探しているものを正確に説明するのは本当に難しいので、端末をどのように動作させたいかについていくつかの出力例を作成しました。 (行の先頭にある各番号はその行の戻り値を表し、>は入力行を表します。

>   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すると、すべてが逆の順序で出力されるため、各コマンドの出力の外観は変更されず、位置だけが出力されます。

6
Ian

おそらく誰かがこれを行った(おそらくそうではない)。これは、コマンドの出力を収集して画面を更新する方法を知っているシェルによって実行される必要があります。それ自体では、通常の端末はこれを行いません。

各コマンドで、これを実行するプログラムがあったと仮定します

  • 入力コマンド(おそらく複数行)を受け入れます。簡単にするために、入力を1行に制限することから始めます。
  • テキストを取得すると、シェルはコマンドを実行し、コマンドの標準出力から一度に1行ずつ収集しますおよびエラー。
  • 新しい出力行を取得すると、その行を画面に挿入して、既存のテキストを押し下げる必要があります。より多くの出力が読み取られると、挿入ポイントが下に移動します。 (端末は低レベルの操作を提供しますが、それは作業にすることからは遠いです)。
  • 画面に収まるよりも多くの出力がある場合、ユーザーは、挿入ポイントが画面の下部に到達したときに出力が上にスクロールし始めることを期待している可能性があります。
  • 出力がなくなると(コマンドが停止すると)、シェルはカーソルを画面の上部に戻します。

thatはすべて、単純なプログラムで実行できます。難しいのは、コマンドが自分で画面を引き継ぐかどうかです。これを行うプログラムは、標準出力と標準エラーに書き込みます—ご想像のとおり—。また、プレーンテキストは記述しません。画面内を移動するためにエスケープシーケンスを使用します。

これを端末初期化シーケンスを送信する正常に動作するアプリケーションに限定すると、シェルは(原則として)これを検出してしばらくの間あきらめ、コマンドが画面に書き込むことができるようになります。しかし、正常に動作するアプリケーションは大多数ではなく、対処すべき興味深い特殊なケースがたくさんあります。

3
Thomas Dickey

これは興味深いアイデアですが、現在これを行っているものはないと思います。これを行うために連携しなければならない相互接続されたビットはたくさんあります。

ターミナルは数十年の増分履歴があり、常に同じ基本的な方法で動作してきたため、端末の動作方法を変更する試みはあまりありませんでした。これを大幅に変更すると、既存のアプリケーションの割り当てが破損します。

とはいえ、必要なことを実行するための単純なncursesアプリケーションを作成することはそれほど難しくありませんが、基本的なコマンドでのみ機能し、本格的な端末が失敗することを期待するもの(vim、nano、screen、topなど)はすべて失敗します。それらをサポートすることは、多大な作業になります。

ただし、最近、最新の端末アプリケーションを作成する試みがいくつかあり、画像やビデオを直接表示できるものもあります。たとえば 用語 。私が見たこれらの中で最も過激なものは ブラックスクリーン あなたが興味を持っているかもしれません。それはあなたが探しているものではなく、まだかなり初期の開発段階にあります(問題が発生する可能性があります)ただし、動作方法に同じ利点がいくつかある場合があります(コマンドを強調表示したり、コマンドの出力の開始/停止を簡単に確認したりできます)。

2
Michael Daffin