2013-02-21 13 views
6

Like Vim:起動すると別の「バッファ」に移動します。 vimが終了すると、コマンドプロンプトの前の内容が表示されます。前のコンソールの内容を "尊重"するC#Windowsコンソールアプリケーションを実行するには?

誰でもC#を使用してこれを行う方法を知っていますか?

ありがとうございました

編集:ユーザーにアプリケーションの出力が表示されなくなりました。それがそれをより良く説明することを望みます。

+1

ここで説明する例は、コマンドラインから起動した場合のC#コンソールアプリケーションの動作を示しています。コンソールアプリケーションを実行して終了すると、前のコマンドラインに戻ります。または私は何かを逃していますか? – Dutts

+0

私は、ポスターは、アプリケーションからの出力がコンソール上になくなってはいけないことを意味しますが、実行前に何があったのかを意味します。 – Matt

+0

@Richard dirやcatのようなアプリケーションは、同じコンソールの "バッファ"上に吐き出されます。 vimのようなアプリケーションでは、コンソールウィンドウに多くのテキストが再描画されますが、閉じた後、ユーザーはvimなど、入力したコマンドを見ることに戻ります。 vimがウィンドウに表示したすべての出力はなくなりました。私が自分自身を正しく説明していないかどうか教えてください。 – robertoprs

答えて

4

私は、mch_init機能でos_win32.cで見つけることができますVim source code関連ビットを見て、これを考え出しました「だから、単純に(タイトルとアイコンを含む)コンソール情報を保存し、その後、終了時に再びそれを復元し

/* 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コンソールは、実際にこれを実装する簡単な方法かもしれないmultiple screen buffersサポート - 単にCreateConsoleScreenBufferで新しいものを作成して、現在SetConsoleActiveScreenBufferを使用して示したものであることをそのバッファを設定するのではなく、既存のスクリーンバッファをコピーします。再びConsoleクラスは残念ながら複数のスクリーンバッファをサポートしていないので、これを行うにはP/Invokeが必要です。また、Consoleクラスは、アプリケーションが起動された時点でアクティブだったスクリーンバッファに常に書き込みます。したがって、アクティブスクリーンバッファをスワップすると、Consoleクラスは(表示されなくなった)古いスクリーンバッファに書き込むことになります。これを回避するには、すべてのコンソールアクセスをP /呼び出しする必要があります。Working with Console Screen Buffers in .NETを参照してください。

+0

ありがとう!あなたは正しいです、私はコードを見ていたはずです。私はいくつかのプロジェクトがWindowsの世界でさえまだオープンソースであることを忘れる。 jgauffinの回答により、私はCreateConsoleScreenBufferにバンプしましたが、以前のバッファの状態を保存することは素晴らしい考えです! – robertoprs

+1

バッファがアクティブでないときにクリアされるため、元のバッファ内容の保存が必要になります。 – robertoprs

-3

私はVimが開いているファイルの履歴を記録していると思います。バックアップコピーのように、Vimもそのファイルをバッファリングすると思います。 C#で同じことをするアイデアは、ファイルバッファを実装することです。これは、入力パラメータなどを記録して追跡するためのものです。

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

+1

これは質問とはほとんど関係がありません。 – hvd

+0

私は、OPの質問が暗闇の中で少しヒットしたと思っています。全く理解するのは簡単ではありません。私は正しいと思うものに答えました。 –

+1

質問は私にとって意味があります。コマンドプロンプトを開きます。 vimを起動します。 vimがどのように同じウィンドウに現れるかに注目してください。 vimを終了します。 vimのビットがどのように残っているかに注目してください。今、問題はC#からその作業を行う方法です。 – hvd

0

ここで説明するようにあなたがコンソールバッファに古いコンテンツを書き込むことによってそれを行うことができます。How can I write fast colored output to Console?

+0

..古いコンテンツを手に入れようとしていますか? –

+0

私はそれが有用であることを知ったので、私はこれをupvoted。私はPInvokeについて知らなかったので、Win32 APIをC#コードから呼び出すことはできませんでした。これにより、CreateConsoleScreenBufferが見つかりました。ジャスティンの答えはより詳細ですが、これは私をブロック解除するのに十分なものでした。 – robertoprs

関連する問題