]> granicus.if.org Git - vim/commitdiff
patch 9.0.0347: MS-Windows: cannot set cursor shape in Windows Terminal v9.0.0347
authorK.Takata <kentkt@csc.jp>
Thu, 1 Sep 2022 12:20:16 +0000 (13:20 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 1 Sep 2022 12:20:16 +0000 (13:20 +0100)
Problem:    MS-Windows: cannot set cursor shape in Windows Terminal.
Solution:   Make cursor shape work with Windows Terminal. (Ken Takata,
            closes #11028, closes #6576)

runtime/doc/term.txt
src/os_win32.c
src/version.c

index 7acfba78c6eb4555936c70996d32c9b232543f33..906e44404d6ccd239c35c9aa00172d2f67149075 100644 (file)
@@ -643,6 +643,18 @@ Example for an xterm, this changes the color of the cursor: >
     endif
 NOTE: When Vim exits the shape for Normal mode will remain.  The shape from
 before Vim started will not be restored.
+
+For Windows Terminal you can use something like this: >
+    " Note: This should be set after `set termguicolors` or `set t_Co=256`.
+    if &term =~ 'xterm' || &term == 'win32'
+       " Use DECSCUSR escape sequences
+       let &t_SI = "\e[5 q"    " blink bar
+       let &t_SR = "\e[3 q"    " blink underline
+       let &t_EI = "\e[1 q"    " blink block
+       let &t_ti ..= "\e[1 q"   " blink block
+       let &t_te ..= "\e[0 q"   " default (depends on terminal, normally blink block)
+    endif
+
 {not available when compiled without the |+cursorshape| feature}
 
                                                        *termcap-title*
index e6ffcbac9212df980c291604c7e5b29b3a351a39..f6bf91d9fa1a7c6733b64ee803fb986f49e3ac27 100644 (file)
@@ -1528,13 +1528,27 @@ decode_mouse_event(
     static void
 mch_set_cursor_shape(int thickness)
 {
-    CONSOLE_CURSOR_INFO ConsoleCursorInfo;
-    ConsoleCursorInfo.dwSize = thickness;
-    ConsoleCursorInfo.bVisible = s_cursor_visible;
+    if (USE_VTP || USE_WT)
+    {
+       if (*T_CSI == NUL)
+       {
+           // If 't_SI' is not set, use the default cursor styles.
+           if (thickness < 50)
+               vtp_printf("\033[3 q"); // underline
+           else
+               vtp_printf("\033[0 q"); // default
+       }
+    }
+    else
+    {
+       CONSOLE_CURSOR_INFO ConsoleCursorInfo;
+       ConsoleCursorInfo.dwSize = thickness;
+       ConsoleCursorInfo.bVisible = s_cursor_visible;
 
-    SetConsoleCursorInfo(g_hConOut, &ConsoleCursorInfo);
-    if (s_cursor_visible)
-       SetConsoleCursorPosition(g_hConOut, g_coord);
+       SetConsoleCursorInfo(g_hConOut, &ConsoleCursorInfo);
+       if (s_cursor_visible)
+           SetConsoleCursorPosition(g_hConOut, g_coord);
+    }
 }
 
     void
@@ -6770,6 +6784,21 @@ notsgr:
            }
 # endif
        }
+       else if (s[0] == ESC && len >= 3-1 && s[1] == '[')
+       {
+           int l = 2;
+
+           if (isdigit(s[l]))
+               l++;
+           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;
+           }
+       }
        else
        {
            // Write a single character
@@ -7953,7 +7982,7 @@ vtp_sgr_bulks(
     if (argc == 0)
     {
        sgrfgr = sgrbgr = -1;
-       vtp_printf("033[m");
+       vtp_printf("\033[m");
        return;
     }
 
index f6cdb1c5be4f654a4b838d00dfe6e19ea8fe1049..147f8766383c2262900f6ba75e28853b44c7e8f9 100644 (file)
@@ -707,6 +707,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    347,
 /**/
     346,
 /**/