मैं इस Vim source code को देखकर पता लगा प्रासंगिक बिट mch_init
समारोह में os_win32.c में पाया जा सकता है, मैं 've की नकल की और यहां
/* 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 करने की आवश्यकता होगी। के बजाय मौजूदा स्क्रीन बफर बस CreateConsoleScreenBuffer
साथ एक नया बना कॉपी और सेट है कि बफर एक वर्तमान में SetConsoleActiveScreenBuffer
का उपयोग कर दिखाया होने के लिए -
वैकल्पिक रूप से Win32 सांत्वना वास्तव में multiple screen buffers जो इस लागू करने के लिए एक आसान तरीका हो सकता है समर्थन करता है। दुर्भाग्य से Console
वर्ग दुर्भाग्य से एकाधिक स्क्रीन बफर का समर्थन नहीं करता है, इसलिए आपको इसे करने के लिए पी/आमंत्रण की आवश्यकता होगी। इसके अलावा Console
कक्षा हमेशा स्क्रीन बफर को लिखती है जो एप्लिकेशन को लॉन्च करने के समय सक्रिय था, इसलिए यदि आप सक्रिय स्क्रीन बफर को स्वैप करते हैं तो Console
कक्षा अभी भी पुराने स्क्रीन बफर (जो अब दिखाई नहीं दे रही है) पर लिख रही है - इसके आस-पास पहुंचने के लिए आपको अपने सभी कंसोल एक्सेस को P/Invoke करना होगा, Working with Console Screen Buffers in .NET देखें।
उदाहरण का वर्णन यह है कि एक कमांड लाइन से लागू होने पर सी # कंसोल एप्लिकेशन वर्तमान में कैसे काम करेगा; यदि आप एक कंसोल ऐप निष्पादित करते हैं, तो इसे बंद करें, आपको अपनी पिछली कमांड लाइन पर वापस कर दिया जाता है। या क्या मैं कुछ न कुछ भूल रहा हूं? – Dutts
मुझे लगता है कि पोस्टर का मतलब है कि ऐप से कोई आउटपुट अब कंसोल पर नहीं होना चाहिए, बल्कि निष्पादन से पहले क्या था। – Matt
@ रिचर्ड अनुप्रयोग जैसे डीआईआर या बिल्ली एक ही कंसोल "बफर" पर फंस जाएगा। विम जैसे अनुप्रयोग आपकी कंसोल विंडो पर बहुत सारे टेक्स्ट को दोबारा हटाते हैं, लेकिन इसे बंद करने के बाद, उपयोगकर्ता वापस दिए गए आदेशों को देखने के लिए वापस जाता है, जिसमें विम भी शामिल है। खिड़की पर रखे गए सभी आउटपुट चले गए हैं। मुझे बताएं कि क्या मैं खुद को सही तरीके से समझा नहीं रहा हूं – robertoprs