14

vi や man などのプログラムは、端末のコンテンツをプログラム自体のコンテンツに置き換え、それらのプログラムを終了した後に古い端末のコンテンツに戻すにはどうすればよいですか?

4

2 に答える 2

12

制御シーケンスを端末 (xterm、vt-220) に送信するか、ncurses (mc など) を使用します。

ANSI エスケープ シーケンスは( ESC\033 octal)で始まり[ます。 ;数字を区切ります。

C 画面をクリアし、カーソルを 1,1 に移動する例。

#include <stdio.h>

int main()
{
    // clear the terminal
    printf("\033[2J\033[1;1H");
    printf("hello");

}

代替バッファに切り替えて元に戻す例 (xterm)。

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("\033[?1049h\033[H");
    printf("hello\n");
    sleep(1);
    printf("bye");
    sleep(1);
    printf("\033[?1049l");
}
于 2013-02-23T19:48:43.553 に答える
12

Vi は、端末でサポートされている代替スクリーン バッファに切り替えます。これは、エスケープ シーケンスを使用して実現されます。詳細については、このリンクを参照してください。

これらの termcap エントリは、「ti」で入力し、「te」でフルスクリーン モードを終了します。

@Celada が以下で指摘しているように、xterm エスケープ シーケンスのハードコーディングは、次のように $TERM によってシーケンスが異なるため、良い考えではありません。

xterm-色
  ti: <Esc> 7 <Esc> [ ? 47時間
  te: <Esc> [ 2 J <Esc> [ ? 4 7 l <Esc> 8

xterm-256color
  ti: <Esc> [ ? 1 0 4 9 時間
  te: <Esc> [ ? 1 0 4 9 l

一方、xterm 以外の端末では、最近では xterm のサポートが非常に広くなっています。xterm のみをサポートしても問題が発生する可能性は低いです。出典: これを行う製品をサポートします。

于 2013-02-23T18:57:13.847 に答える