和Vim一样:当它启动的时候会带你到另一个“缓冲区”。 当vimclosures时,用户会看到命令提示符的前一个内容。
有谁知道如何使用C#做到这一点?
谢谢
编辑:用户将不会再看到应用程序的输出。 希望能解释得更好。
我通过查看Vim源代码来了解这mch_init
,可以在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
将该缓冲区设置为当前显示的SetConsoleActiveScreenBuffer
。 不幸的是, Console
类不支持多个屏幕缓冲区,所以你将需要P / Invoke来做到这一点。 此外, Console
类总是写入启动应用程序时处于活动状态的屏幕缓冲区,因此,如果换出活动屏幕缓冲区, Console
类仍将写入旧屏幕缓冲区(不再显示) -要解决这个问题,你需要P / Invoke你所有的控制台访问权限,请参阅在.NET中使用控制台屏幕缓冲区 。
您可以通过将旧内容写入控制台缓冲区来执行此操作,如下所述: 如何将快速彩色输出写入控制台?
我相信Vim会记录它打开的文件的历史记录,而且很可能也会像备份文件一样缓冲它们。 在C#中做同样的想法是实现一个文件缓冲区,某种类型的存储将记录和跟踪你想要的东西 – 输入参数等。
另外一个问题是,Vim(像Vi)有一个需要在C#中实现的命令模式。 现在这取决于你想用C#程序完成什么,是一个编辑器,那么很好,无论如何,你必须区分命令和其他模式。