7

Vim のように: 起動すると、別の「バッファ」に移動します。vim を閉じると、コマンド プロンプトの以前の内容が表示されます。

C#を使用してこれを行う方法を知っている人はいますか?

ありがとう

編集: ユーザーには、アプリケーションの出力が表示されなくなります。それがそれをよりよく説明することを願っています。

4

3 に答える 3

5

関連するビットは関数の os_win32.c で見つけることができるVim ソース コードを見て、これを理解しましmch_initた。関連するビットをここにコピーして貼り付けました。

    /* Obtain handles for the standard Console I/O devices */
    if (read_cmd_fd == 0)
    g_hConIn =  GetStdHandle(STD_INPUT_HANDLE);
    else
    create_conin();
    g_hConOut = GetStdHandle(STD_OUTPUT_HANDLE);

#ifdef FEAT_RESTORE_ORIG_SCREEN
    /* Save the initial console buffer for later restoration */
    SaveConsoleBuffer(&g_cbOrig);
    g_attrCurrent = g_attrDefault = g_cbOrig.Info.wAttributes;
#else
    /* Get current text attributes */
    GetConsoleScreenBufferInfo(g_hConOut, &csbi);
    g_attrCurrent = g_attrDefault = csbi.wAttributes;
#endif
    if (cterm_normal_fg_color == 0)
    cterm_normal_fg_color = (g_attrCurrent & 0xf) + 1;
    if (cterm_normal_bg_color == 0)
    cterm_normal_bg_color = ((g_attrCurrent >> 4) & 0xf) + 1;

    /* set termcap codes to current text attributes */
    update_tcap(g_attrCurrent);

    GetConsoleCursorInfo(g_hConOut, &g_cci);
    GetConsoleMode(g_hConIn,  &g_cmodein);
    GetConsoleMode(g_hConOut, &g_cmodeout);

#ifdef FEAT_TITLE
    SaveConsoleTitleAndIcon();
    /*
     * Set both the small and big icons of the console window to Vim's icon.
     * Note that Vim presently only has one size of icon (32x32), but it
     * automatically gets scaled down to 16x16 when setting the small icon.
     */
    if (g_fCanChangeIcon)
    SetConsoleIcon(g_hWnd, g_hVimIcon, g_hVimIcon);
#endif

そのため、コンソール情報 (タイトルとアイコンを含む) を保存し、終了時に再び復元します。

残念ながら、このConsoleクラスは画面バッファーの内容へのアクセスを提供していないため、これを行うには、関連する Win32 関数に P/Invoke する必要があります。

別の方法として、Win32 コンソールは複数のスクリーン バッファを実際にサポートしています。これは、これを実装するためのより簡単な方法である可能性があります。既存のスクリーン バッファをコピーするのではなく、 を使用して新しいスクリーン バッファを作成し、CreateConsoleScreenBufferそのバッファを を使用して現在表示されているものに設定するだけSetConsoleActiveScreenBufferです。残念ながら、Consoleクラスは複数の画面バッファをサポートしていないため、これを行うには P/Invoke が必要です。また、Consoleクラスは、アプリケーションが起動された時点でアクティブだったスクリーン バッファに常に書き込みます。そのため、アクティブなスクリーン バッファを交換しても、Consoleクラスは古いスクリーン バッファ (もはや表示されません) に書き込みます。このあたりでは、すべてのコンソール アクセスを P/Invoke する必要があります。「. NET でのコンソール画面バッファーの操作」を参照してください。.

于 2013-02-21T09:13:34.537 に答える
0

ここで説明するように、古いコンテンツをコンソールバッファに書き込むことで、これを行うことができます。高速カラー出力をコンソールに書き込むにはどうすればよいですか。

于 2013-02-21T08:45:57.403 に答える
-3

Vim は、開いているファイルの履歴を記録し、おそらくバックアップ コピーのようにそれらもバッファリングしていると思います。C# で同じことを行うアイデアは、ファイル バッファー、必要なもの (入力パラメーターなど) を記録して追跡するある種のストレージを実装することです。

ここでのもう 1 つの問題は、Vim (Vi と同様) には、C# でも実装する必要があるコマンド モードがあることです。これは、C#プログラムで正確に何を達成したいかによって異なります。それはエディターであり、いずれにせよ、コマンドと他のモードを区別する必要があります。

于 2013-02-21T08:40:57.910 に答える