Patch 9.0.0850
Problem:    MS-Windows Terminal has unstable color control.
Solution:   Do not try to read the old command prompt colortable, use modern
            VT sequences. (Christopher Plewright, closes #11450,
            closes #11373)
Files:      src/os_win32.c, src/term.c


*** ../vim-9.0.0849/src/os_win32.c      2022-11-06 11:27:35.894580888 +0000
--- src/os_win32.c      2022-11-09 23:51:51.200100354 +0000
***************
*** 204,224 ****
  static int wt_working = 0;
  static void wt_init();
  
- static guicolor_T save_console_bg_rgb;
- static guicolor_T save_console_fg_rgb;
- static guicolor_T store_console_bg_rgb;
- static guicolor_T store_console_fg_rgb;
- 
  static int g_color_index_bg = 0;
  static int g_color_index_fg = 7;
  
  # ifdef FEAT_TERMGUICOLORS
  static int default_console_color_bg = 0x000000; // black
  static int default_console_color_fg = 0xc0c0c0; // white
! # endif
! 
! # ifdef FEAT_TERMGUICOLORS
! #  define USE_VTP             (vtp_working && is_term_win32() && (p_tgc || 
(!p_tgc && t_colors >= 256)))
  #  define USE_WT              (wt_working)
  # else
  #  define USE_VTP             0
--- 204,220 ----
  static int wt_working = 0;
  static void wt_init();
  
  static int g_color_index_bg = 0;
  static int g_color_index_fg = 7;
  
  # ifdef FEAT_TERMGUICOLORS
+ static guicolor_T save_console_bg_rgb;
+ static guicolor_T save_console_fg_rgb;
+ static guicolor_T store_console_bg_rgb;
+ static guicolor_T store_console_fg_rgb;
  static int default_console_color_bg = 0x000000; // black
  static int default_console_color_fg = 0xc0c0c0; // white
! #  define USE_VTP             (vtp_working && is_term_win32())
  #  define USE_WT              (wt_working)
  # else
  #  define USE_VTP             0
***************
*** 334,340 ****
  
      if (s_dwMax == 0)
      {
!       if (!USE_WT && nLength == -1)
            return PeekConsoleInputW(hInput, lpBuffer, 1, lpEvents);
        GetNumberOfConsoleInputEvents(hInput, &dwEvents);
        if (dwEvents == 0 && nLength == -1)
--- 330,336 ----
  
      if (s_dwMax == 0)
      {
!       if (!vtp_working && nLength == -1)
            return PeekConsoleInputW(hInput, lpBuffer, 1, lpEvents);
        GetNumberOfConsoleInputEvents(hInput, &dwEvents);
        if (dwEvents == 0 && nLength == -1)
***************
*** 1255,1261 ****
      static void
  decode_mouse_wheel(MOUSE_EVENT_RECORD *pmer)
  {
-     win_T   *wp;
      int           horizontal = (pmer->dwEventFlags == MOUSE_HWHEELED);
      int           zDelta = pmer->dwButtonState;
  
--- 1251,1256 ----
***************
*** 1265,1271 ****
  #ifdef FEAT_PROP_POPUP
      int lcol = g_xMouse;
      int lrow = g_yMouse;
!     wp = mouse_find_win(&lrow, &lcol, FIND_POPUP);
      if (wp != NULL && popup_is_popup(wp))
      {
        g_nMouseClick = -1;
--- 1260,1266 ----
  #ifdef FEAT_PROP_POPUP
      int lcol = g_xMouse;
      int lrow = g_yMouse;
!     win_T *wp = mouse_find_win(&lrow, &lcol, FIND_POPUP);
      if (wp != NULL && popup_is_popup(wp))
      {
        g_nMouseClick = -1;
***************
*** 1605,1611 ****
      static void
  mch_set_cursor_shape(int thickness)
  {
!     if (USE_VTP || USE_WT)
      {
        if (*T_CSI == NUL)
        {
--- 1600,1606 ----
      static void
  mch_set_cursor_shape(int thickness)
  {
!     if (vtp_working)
      {
        if (*T_CSI == NUL)
        {
***************
*** 2977,2982 ****
--- 2972,2980 ----
        create_conin();
      g_hConOut = GetStdHandle(STD_OUTPUT_HANDLE);
  
+     wt_init();
+     vtp_flag_init();
+     vtp_init();
  # ifdef FEAT_RESTORE_ORIG_SCREEN
      // Save the initial console buffer for later restoration
      SaveConsoleBuffer(&g_cbOrig);
***************
*** 3033,3042 ****
  # ifdef FEAT_CLIPBOARD
      win_clip_init();
  # endif
- 
-     vtp_flag_init();
-     vtp_init();
-     wt_init();
  }
  
  /*
--- 3031,3036 ----
***************
*** 5854,5860 ****
  
      g_fTermcapMode = FALSE;
  }
! #endif // FEAT_GUI_MSWIN
  
  
  #if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
--- 5848,5854 ----
  
      g_fTermcapMode = FALSE;
  }
! #endif // !FEAT_GUI_MSWIN || VIMDLL
  
  
  #if defined(FEAT_GUI_MSWIN) && !defined(VIMDLL)
***************
*** 5876,5882 ****
      COORD coord,
      DWORD n)
  {
!     if (!USE_VTP)
      {
        DWORD dwDummy;
  
--- 5870,5876 ----
      COORD coord,
      DWORD n)
  {
!     if (!vtp_working)
      {
        DWORD dwDummy;
  
***************
*** 5901,5907 ****
  {
      g_coord.X = g_coord.Y = 0;
  
!     if (!USE_VTP)
        clear_chars(g_coord, Rows * Columns);
      else
      {
--- 5895,5901 ----
  {
      g_coord.X = g_coord.Y = 0;
  
!     if (!vtp_working)
        clear_chars(g_coord, Rows * Columns);
      else
      {
***************
*** 5920,5926 ****
  {
      COORD save = g_coord;
  
!     if (!USE_VTP)
        clear_chars(g_coord, (Rows - g_coord.Y - 1)
                                           * Columns + (Columns - g_coord.X));
      else
--- 5914,5920 ----
  {
      COORD save = g_coord;
  
!     if (!vtp_working)
        clear_chars(g_coord, (Rows - g_coord.Y - 1)
                                           * Columns + (Columns - g_coord.X));
      else
***************
*** 5943,5949 ****
  {
      COORD save = g_coord;
  
!     if (!USE_VTP)
        clear_chars(g_coord, Columns - g_coord.X);
      else
      {
--- 5937,5943 ----
  {
      COORD save = g_coord;
  
!     if (!vtp_working)
        clear_chars(g_coord, Columns - g_coord.X);
      else
      {
***************
*** 6045,6051 ****
      clip.Bottom = g_srScrollRegion.Bottom;
  
      fill.Char.AsciiChar = ' ';
!     if (!USE_VTP)
        fill.Attributes = g_attrCurrent;
      else
        fill.Attributes = g_attrDefault;
--- 6039,6049 ----
      clip.Bottom = g_srScrollRegion.Bottom;
  
      fill.Char.AsciiChar = ' ';
!     if (!(vtp_working
! #ifdef FEAT_TERMGUICOLORS
!               && (p_tgc || t_colors >= 256)
! #endif
!        ))
        fill.Attributes = g_attrCurrent;
      else
        fill.Attributes = g_attrDefault;
***************
*** 6074,6080 ****
        }
      }
  
!     if (USE_WT)
      {
        COORD coord;
        int i;
--- 6072,6078 ----
        }
      }
  
!     if (vtp_working)
      {
        COORD coord;
        int i;
***************
*** 6116,6122 ****
      clip.Bottom = g_srScrollRegion.Bottom;
  
      fill.Char.AsciiChar = ' ';
!     if (!USE_VTP)
        fill.Attributes = g_attrCurrent;
      else
        fill.Attributes = g_attrDefault;
--- 6114,6120 ----
      clip.Bottom = g_srScrollRegion.Bottom;
  
      fill.Char.AsciiChar = ' ';
!     if (!vtp_working)
        fill.Attributes = g_attrCurrent;
      else
        fill.Attributes = g_attrDefault;
***************
*** 6143,6149 ****
        }
      }
  
!     if (USE_WT)
      {
        COORD coord;
        int i;
--- 6141,6147 ----
        }
      }
  
!     if (vtp_working)
      {
        COORD coord;
        int i;
***************
*** 6169,6175 ****
      if (x < 1 || x > (unsigned)Columns || y < 1 || y > (unsigned)Rows)
        return;
  
!     if (!USE_VTP)
      {
        // There are reports of double-width characters not displayed
        // correctly.  This workaround should fix it, similar to how it's done
--- 6167,6177 ----
      if (x < 1 || x > (unsigned)Columns || y < 1 || y > (unsigned)Rows)
        return;
  
!     if (!(vtp_working
! #ifdef FEAT_TERMGUICOLORS
!               && (p_tgc || t_colors >= 256)
! #endif
!        ))
      {
        // There are reports of double-width characters not displayed
        // correctly.  This workaround should fix it, similar to how it's done
***************
*** 6215,6221 ****
  {
      g_attrCurrent = (g_attrCurrent & 0xf0) + (wAttr & 0x0f);
  
!     if (!USE_VTP)
        SetConsoleTextAttribute(g_hConOut, g_attrCurrent);
      else
        vtp_sgr_bulk(wAttr);
--- 6217,6223 ----
  {
      g_attrCurrent = (g_attrCurrent & 0xf0) + (wAttr & 0x0f);
  
!     if (!vtp_working)
        SetConsoleTextAttribute(g_hConOut, g_attrCurrent);
      else
        vtp_sgr_bulk(wAttr);
***************
*** 6227,6233 ****
  {
      g_attrCurrent = (g_attrCurrent & 0x0f) + ((wAttr & 0x0f) << 4);
  
!     if (!USE_VTP)
        SetConsoleTextAttribute(g_hConOut, g_attrCurrent);
      else
        vtp_sgr_bulk(wAttr);
--- 6229,6235 ----
  {
      g_attrCurrent = (g_attrCurrent & 0x0f) + ((wAttr & 0x0f) << 4);
  
!     if (!vtp_working)
        SetConsoleTextAttribute(g_hConOut, g_attrCurrent);
      else
        vtp_sgr_bulk(wAttr);
***************
*** 6240,6246 ****
      static void
  normvideo(void)
  {
!     if (!USE_VTP)
        textattr(g_attrDefault);
      else
        vtp_sgr_bulk(0);
--- 6242,6248 ----
      static void
  normvideo(void)
  {
!     if (!vtp_working)
        textattr(g_attrDefault);
      else
        vtp_sgr_bulk(0);
***************
*** 6326,6332 ****
                               coordOrigin, &dwDummy);
  
      Sleep(15);            // wait for 15 msec
!     if (!USE_VTP)
        WriteConsoleOutputAttribute(g_hConOut, oldattrs, Rows * Columns,
                                coordOrigin, &dwDummy);
      vim_free(oldattrs);
--- 6328,6334 ----
                               coordOrigin, &dwDummy);
  
      Sleep(15);            // wait for 15 msec
!     if (!vtp_working)
        WriteConsoleOutputAttribute(g_hConOut, oldattrs, Rows * Columns,
                                coordOrigin, &dwDummy);
      vim_free(oldattrs);
***************
*** 6341,6347 ****
  {
      s_cursor_visible = fVisible;
  
!     if (USE_VTP)
        vtp_printf("\033[?25%c", fVisible ? 'h' : 'l');
  
  # ifdef MCH_CURSOR_SHAPE
--- 6343,6349 ----
  {
      s_cursor_visible = fVisible;
  
!     if (vtp_working)
        vtp_printf("\033[?25%c", fVisible ? 'h' : 'l');
  
  # ifdef MCH_CURSOR_SHAPE
***************
*** 6413,6419 ****
        }
      }
  
!     if (!USE_VTP)
      {
        FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, cells,
                                    coord, &written);
--- 6415,6425 ----
        }
      }
  
!     if (!(vtp_working
! #ifdef FEAT_TERMGUICOLORS
!           && (p_tgc || t_colors >= 256)
! #endif
!       ))
      {
        FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, cells,
                                    coord, &written);
***************
*** 6453,6459 ****
      }
  
      // Cursor under VTP is always in the correct position, no need to reset.
!     if (!USE_VTP)
        gotoxy(g_coord.X + 1, g_coord.Y + 1);
  
      return written;
--- 6459,6469 ----
      }
  
      // Cursor under VTP is always in the correct position, no need to reset.
!     if (!(vtp_working
! #ifdef FEAT_TERMGUICOLORS
!               && (p_tgc || t_colors >= 256)
! #endif
!        ))
        gotoxy(g_coord.X + 1, g_coord.Y + 1);
  
      return written;
***************
*** 6749,6760 ****
                        normvideo();
                    else if (argc == 1)
                    {
!                       if (USE_VTP)
!                           textcolor((WORD) arg1);
                        else
!                           textattr((WORD) arg1);
                    }
!                   else if (USE_VTP)
                        vtp_sgr_bulks(argc, args);
                }
                else if (argc == 2 && *p == 'H')
--- 6759,6774 ----
                        normvideo();
                    else if (argc == 1)
                    {
!                       if (vtp_working
! # ifdef FEAT_TERMGUICOLORS
!                               && (p_tgc || t_colors >= 256)
! # endif
!                          )
!                           textcolor((WORD)arg1);
                        else
!                           textattr((WORD)arg1);
                    }
!                   else if (vtp_working)
                        vtp_sgr_bulks(argc, args);
                }
                else if (argc == 2 && *p == 'H')
***************
*** 6893,6899 ****
            if (s[l] == ' ' && s[l + 1] == 'q')
            {
                // DECSCUSR (cursor style) sequences
!               if (USE_VTP || USE_WT)
                    vtp_printf("%.*s", l + 2, s);   // Pass through
                s += l + 2;
                len -= l + 1;
--- 6907,6913 ----
            if (s[l] == ' ' && s[l + 1] == 'q')
            {
                // DECSCUSR (cursor style) sequences
!               if (vtp_working)
                    vtp_printf("%.*s", l + 2, s);   // Pass through
                s += l + 2;
                len -= l + 1;
***************
*** 7932,7937 ****
--- 7946,7953 ----
   * Not stable now.
   */
  #define CONPTY_STABLE_BUILD       MAKE_VER(10, 0, 32767)  // T.B.D.
+ // Note: Windows 11 (build >= 22000 means Windows 11, even though the major
+ // version says 10!)
  
      static void
  vtp_flag_init(void)
***************
*** 7978,8006 ****
      static void
  vtp_init(void)
  {
-     CONSOLE_SCREEN_BUFFER_INFOEX csbi;
  # ifdef FEAT_TERMGUICOLORS
!     COLORREF fg;
! # endif
! 
!     csbi.cbSize = sizeof(csbi);
!     GetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
!     save_console_bg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_bg];
!     save_console_fg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_fg];
!     store_console_bg_rgb = save_console_bg_rgb;
!     store_console_fg_rgb = save_console_fg_rgb;
! 
! # ifdef FEAT_TERMGUICOLORS
!     if (!USE_WT)
      {
        COLORREF bg;
        bg = (COLORREF)csbi.ColorTable[g_color_index_bg];
        bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
        default_console_color_bg = bg;
      }
-     fg = (COLORREF)csbi.ColorTable[g_color_index_fg];
-     fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
-     default_console_color_fg = fg;
  # endif
  
      set_console_color_rgb();
--- 7994,8020 ----
      static void
  vtp_init(void)
  {
  # ifdef FEAT_TERMGUICOLORS
!     if (!vtp_working)
      {
+       CONSOLE_SCREEN_BUFFER_INFOEX csbi;
+       csbi.cbSize = sizeof(csbi);
+       GetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
+       save_console_bg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_bg];
+       save_console_fg_rgb = (guicolor_T)csbi.ColorTable[g_color_index_fg];
+       store_console_bg_rgb = save_console_bg_rgb;
+       store_console_fg_rgb = save_console_fg_rgb;
+ 
        COLORREF bg;
        bg = (COLORREF)csbi.ColorTable[g_color_index_bg];
        bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
        default_console_color_bg = bg;
+ 
+       COLORREF fg;
+       fg = (COLORREF)csbi.ColorTable[g_color_index_fg];
+       fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
+       default_console_color_fg = fg;
      }
  # endif
  
      set_console_color_rgb();
***************
*** 8217,8248 ****
      guicolor_T        fg, bg;
      int               ctermfg, ctermbg;
  
!     if (!USE_VTP)
        return;
  
      get_default_console_color(&ctermfg, &ctermbg, &fg, &bg);
  
!     if (USE_WT)
      {
        term_fg_rgb_color(fg);
        term_bg_rgb_color(bg);
        return;
      }
  
!     fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
!     bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
  
!     csbi.cbSize = sizeof(csbi);
!     GetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
  
!     csbi.cbSize = sizeof(csbi);
!     csbi.srWindow.Right += 1;
!     csbi.srWindow.Bottom += 1;
!     store_console_bg_rgb = csbi.ColorTable[g_color_index_bg];
!     store_console_fg_rgb = csbi.ColorTable[g_color_index_fg];
!     csbi.ColorTable[g_color_index_bg] = (COLORREF)bg;
!     csbi.ColorTable[g_color_index_fg] = (COLORREF)fg;
!     SetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
  # endif
  }
  
--- 8231,8265 ----
      guicolor_T        fg, bg;
      int               ctermfg, ctermbg;
  
!     if (!vtp_working)
        return;
  
      get_default_console_color(&ctermfg, &ctermbg, &fg, &bg);
  
!     if (p_tgc || t_colors >= 256)
      {
        term_fg_rgb_color(fg);
        term_bg_rgb_color(bg);
        return;
      }
  
!     if (!conpty_working)
!     {
!       fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg);
!       bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg);
  
!       csbi.cbSize = sizeof(csbi);
!       GetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
  
!       csbi.cbSize = sizeof(csbi);
!       csbi.srWindow.Right += 1;
!       csbi.srWindow.Bottom += 1;
!       store_console_bg_rgb = csbi.ColorTable[g_color_index_bg];
!       store_console_fg_rgb = csbi.ColorTable[g_color_index_fg];
!       csbi.ColorTable[g_color_index_bg] = (COLORREF)bg;
!       csbi.ColorTable[g_color_index_fg] = (COLORREF)fg;
!       SetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
!     }
  # endif
  }
  
***************
*** 8259,8264 ****
--- 8276,8282 ----
      guicolor_T guibg = INVALCOLOR;
      int ctermfg = 0;
      int ctermbg = 0;
+     int dummynull = 0;
  
      id = syn_name2id((char_u *)"Normal");
      if (id > 0 && p_tgc)
***************
*** 8267,8284 ****
      {
        ctermfg = -1;
        if (id > 0)
!           syn_id2cterm_bg(id, &ctermfg, &ctermbg);
!       guifg = ctermfg != -1 ? ctermtoxterm(ctermfg)
                                                    : default_console_color_fg;
!       cterm_normal_fg_gui_color = guifg;
!       ctermfg = ctermfg < 0 ? 0 : ctermfg;
      }
      if (guibg == INVALCOLOR)
      {
        ctermbg = -1;
        if (id > 0)
!           syn_id2cterm_bg(id, &ctermfg, &ctermbg);
!       if (USE_WT)
        {
            cterm_normal_bg_gui_color = guibg =
                            ctermbg != -1 ? ctermtoxterm(ctermbg) : INVALCOLOR;
--- 8285,8311 ----
      {
        ctermfg = -1;
        if (id > 0)
!           syn_id2cterm_bg(id, &ctermfg, &dummynull);
!       if (vtp_working)
!       {
!           cterm_normal_fg_gui_color = guifg =
!                           ctermfg != -1 ? ctermtoxterm(ctermfg) : INVALCOLOR;
!           ctermfg = ctermfg < 0 ? 0 : ctermfg;
!       }
!       else
!       {
!           guifg = ctermfg != -1 ? ctermtoxterm(ctermfg)
                                                    : default_console_color_fg;
!           cterm_normal_fg_gui_color = guifg;
!           ctermfg = ctermfg < 0 ? 0 : ctermfg;
!       }
      }
      if (guibg == INVALCOLOR)
      {
        ctermbg = -1;
        if (id > 0)
!           syn_id2cterm_bg(id, &dummynull, &ctermbg);
!       if (vtp_working)
        {
            cterm_normal_bg_gui_color = guibg =
                            ctermbg != -1 ? ctermtoxterm(ctermbg) : INVALCOLOR;
***************
*** 8308,8318 ****
  reset_console_color_rgb(void)
  {
  # ifdef FEAT_TERMGUICOLORS
-     CONSOLE_SCREEN_BUFFER_INFOEX csbi;
  
!     if (USE_WT)
        return;
  
      csbi.cbSize = sizeof(csbi);
      GetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
  
--- 8335,8346 ----
  reset_console_color_rgb(void)
  {
  # ifdef FEAT_TERMGUICOLORS
  
!     if (vtp_working)
        return;
  
+     CONSOLE_SCREEN_BUFFER_INFOEX csbi;
+ 
      csbi.cbSize = sizeof(csbi);
      GetConsoleScreenBufferInfoEx(g_hConOut, &csbi);
  
***************
*** 8332,8337 ****
--- 8360,8368 ----
  restore_console_color_rgb(void)
  {
  # ifdef FEAT_TERMGUICOLORS
+     if (vtp_working)
+       return;
+ 
      CONSOLE_SCREEN_BUFFER_INFOEX csbi;
  
      csbi.cbSize = sizeof(csbi);
***************
*** 8349,8355 ****
      void
  control_console_color_rgb(void)
  {
!     if (USE_VTP)
        set_console_color_rgb();
      else
        reset_console_color_rgb();
--- 8380,8386 ----
      void
  control_console_color_rgb(void)
  {
!     if (vtp_working)
        set_console_color_rgb();
      else
        reset_console_color_rgb();
*** ../vim-9.0.0849/src/term.c  2022-11-02 13:30:37.542314565 +0000
--- src/term.c  2022-11-09 23:39:22.135337195 +0000
***************
*** 2987,2993 ****
      vim_snprintf(buf, MAX_COLOR_STR_LEN,
                                  (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb));
  #ifdef FEAT_VTP
!     if (use_wt())
      {
        out_flush();
        buf[1] = '[';
--- 2987,2993 ----
      vim_snprintf(buf, MAX_COLOR_STR_LEN,
                                  (char *)s, RED(rgb), GREEN(rgb), BLUE(rgb));
  #ifdef FEAT_VTP
!     if (has_vtp_working())
      {
        out_flush();
        buf[1] = '[';
***************
*** 3001,3007 ****
      void
  term_fg_rgb_color(guicolor_T rgb)
  {
!     term_rgb_color(T_8F, rgb);
  }
  
      void
--- 3001,3008 ----
      void
  term_fg_rgb_color(guicolor_T rgb)
  {
!     if (rgb != INVALCOLOR)
!       term_rgb_color(T_8F, rgb);
  }
  
      void
*** ../vim-9.0.0849/src/version.c       2022-11-09 23:29:10.611134995 +0000
--- src/version.c       2022-11-09 23:42:21.763567238 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     850,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
38. You wake up at 3 a.m. to go to the bathroom and stop and check your e-mail
    on the way back to bed.

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///                                                                      \\\
\\\        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/20221109235623.5F0751C099A%40moolenaar.net.

Raspunde prin e-mail lui