像 Vim:当它启动时,它会将你带到另一个“缓冲区”。当 vim 关闭时,用户会看到命令提示符之前的内容。
有人知道如何使用 C# 做到这一点吗?
谢谢
编辑:用户将不再看到应用程序的输出。希望能更好地解释它。
我通过查看Vim 源代码发现了这一点,相关位可以在mch_init
函数的 os_win32.c 中找到,我在这里复制并粘贴了相关位
/* 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
该类不提供对屏幕缓冲区内容的访问,所以要做到这一点,您需要 P/Invoke 到相关的 Win32 函数中。
或者,Win32 控制台实际上支持多个屏幕缓冲区,这可能是实现这一点的一种更简单的方法 - 而不是复制现有的屏幕缓冲区,只需使用 . 创建一个新的CreateConsoleScreenBuffer
并将该缓冲区设置为当前使用SetConsoleActiveScreenBuffer
. 同样Console
不幸的是,该类不支持多个屏幕缓冲区,因此您将需要 P/Invoke 来执行此操作。此外,Console
该类始终写入在应用程序启动时处于活动状态的屏幕缓冲区,因此如果您换出活动屏幕缓冲区,Console
该类仍将写入旧屏幕缓冲区(不再可见) - 以获得围绕这一点,您需要 P/Invoke 您的所有控制台访问权限,请参阅Working with Console Screen Buffers in .NET.
您可以通过将旧内容写入控制台缓冲区来做到这一点,如下所述:如何将快速彩色输出写入控制台?
我相信 Vim 记录了它打开文件的历史,而且很可能它也会缓冲它们,就像备份副本一样。在 C# 中做同样的事情的想法是实现一个文件缓冲区,一种可以记录和跟踪你想要的东西的存储 - 输入参数等。
这里的另一个问题是 Vim(如 Vi)具有命令模式,也需要在 C# 中实现。现在这取决于你想用你的 C# 程序完成什么,那是一个编辑器,那么很好,无论如何,你必须区分命令和其他模式。