54

代替画面は、vim、htop、screen、alsamixer、less などの多くの「ユーザー対話型」ターミナル アプリケーションで使用されます。アプリケーションが終了すると消える、ターミナル コンテンツの別のバッファのようなものです。復元され、アプリケーションが何も出力していないように見えます。

私自身のシェル (bash) スクリプトでまったく同じことを実現したいと考えていますが、移植性がそれほど高くなくてもかまいません。私は Linux のみと xterm ベースのターミナル エミュレーターに固執します。しかし、解決策はtput可能であれば次のようなものを使用する必要があります。ただし、外部のスクリプト言語 (または C など) は使用したくありません。

私は C を使用したくありませんが (可能な限り依存関係の少ない bash スクリプトにする必要があるため)、less のソース コードを調べました。terminfo をデータベースとして使用しているようで、初期化時に「ti」端末機能を検索します。行を削除すると、代替画面が使用されないため、責任のあるコード行が見つかったと想定しました。

しかし、私はそのような機能を見つけることができませんman terminfo. しかし、おそらく私はこれに対する解決策を見つけるのに間違った道を進んでいます。たぶん、terminfo / tput は私の友達ではありません。

では、(どのように) bash スクリプトで代替画面を使用できますか? ソースコードにヒントがある簡単なアプリケーションを知っている人はいますか? (C アプリケーションや bash スクリプトなど...)

4

3 に答える 3

78

次のコマンドを使用して、別の画面に切り替えることができます。

$ tput smcup

そして戻って:

$ tput rmcup

これらのコマンドは、端末に適したエスケープ シーケンスを出力するだけです。それが XTERM の場合、それらは次のものと同等になります (より知られていますが、洗練されていないか移植性が低くなります):

$ echo -e "\e[?1049h"

と:

$ echo -e "\e[?1049l"

端末制御コマンドの詳細については、 を参照してくださいman 5 terminfo

于 2012-06-13T22:25:52.470 に答える
9

smcup/rmcup が使用されますが、副作用のためだけです。通常の画面と代替画面を切り替えるエスケープ シーケンスは、通常、これらの terminfo 機能に埋め込まれていますが、常にではありません。

xterm faq にいくつかの背景があります vi を実行しているときに画面がクリアされないのはなぜですか?

于 2015-02-05T00:56:58.717 に答える
3

C コンソール アプリケーションの場合:

ncurses

ウィキペディア:

ncurses (新しい curses) は、プログラマーが端末に依存しない方法でテキストベースのユーザー インターフェイスを記述できるようにする API を提供するプログラミング ライブラリです。

lessはこのライブラリを使用します。

ここからの hello world プログラムを gcc でコンパイルするには、フラグ -lncurses が必要です。

#include <ncurses.h>

int main()
{   
    initscr();          /* Start curses mode          */
    printw("Hello World !!!");  /* Print Hello World          */
    refresh();          /* Print it on to the real screen */
    getch();            /* Wait for user input */
    endwin();           /* End curses mode        */

    return 0;
}
于 2014-11-02T08:12:58.533 に答える