Patch 9.0.0974
Problem:    Even when Esc is encoded a timeout is used.
Solution:   Use K_ESC when an encoded Esc is found.
Files:      src/keymap.h, src/term.c, src/getchar.c


*** ../vim-9.0.0973/src/keymap.h        2022-09-05 16:53:17.115566769 +0100
--- src/keymap.h        2022-11-29 20:07:11.635591906 +0000
***************
*** 278,290 ****
      , KE_SCRIPT_COMMAND = 104 // <ScriptCmd> special key
      , KE_S_BS = 105           // shift + <BS>
      , KE_SID = 106            // <SID> special key, followed by {nr};
  };
  
  /*
!  * the three byte codes are replaced with the following int when using vgetc()
   */
  #define K_ZERO                TERMCAP2KEY(KS_ZERO, KE_FILLER)
  
  #define K_UP          TERMCAP2KEY('k', 'u')
  #define K_DOWN                TERMCAP2KEY('k', 'd')
  #define K_LEFT                TERMCAP2KEY('k', 'l')
--- 278,293 ----
      , KE_SCRIPT_COMMAND = 104 // <ScriptCmd> special key
      , KE_S_BS = 105           // shift + <BS>
      , KE_SID = 106            // <SID> special key, followed by {nr};
+     , KE_ESC = 107            // used for K_ESC
  };
  
  /*
!  * The three-byte codes are replaced with a negative number when using 
vgetc().
   */
  #define K_ZERO                TERMCAP2KEY(KS_ZERO, KE_FILLER)
  
+ #define K_ESC         TERMCAP2KEY(KS_EXTRA, KE_ESC)
+ 
  #define K_UP          TERMCAP2KEY('k', 'u')
  #define K_DOWN                TERMCAP2KEY('k', 'd')
  #define K_LEFT                TERMCAP2KEY('k', 'l')
***************
*** 295,304 ****
--- 298,309 ----
  #define K_C_LEFT      TERMCAP2KEY(KS_EXTRA, KE_C_LEFT)
  #define K_S_RIGHT     TERMCAP2KEY('%', 'i')
  #define K_C_RIGHT     TERMCAP2KEY(KS_EXTRA, KE_C_RIGHT)
+ 
  #define K_S_HOME      TERMCAP2KEY('#', '2')
  #define K_C_HOME      TERMCAP2KEY(KS_EXTRA, KE_C_HOME)
  #define K_S_END               TERMCAP2KEY('*', '7')
  #define K_C_END               TERMCAP2KEY(KS_EXTRA, KE_C_END)
+ 
  #define K_TAB         TERMCAP2KEY(KS_EXTRA, KE_TAB)
  #define K_S_TAB               TERMCAP2KEY('k', 'B')
  #define K_S_BS                TERMCAP2KEY(KS_EXTRA, KE_S_BS)
*** ../vim-9.0.0973/src/term.c  2022-11-29 18:32:29.305191264 +0000
--- src/term.c  2022-11-29 20:30:30.112340414 +0000
***************
*** 5121,5127 ****
        int     *buflen)
  {
      char_u  string[MAX_KEY_CODE_LEN + 1];
!     int           new_slen = add_key_to_buf(arg[0], string);
  
      if (put_string_in_typebuf(offset, csi_len, string, new_slen,
                                                 buf, bufsize, buflen) == FAIL)
--- 5121,5139 ----
        int     *buflen)
  {
      char_u  string[MAX_KEY_CODE_LEN + 1];
!     int           new_slen;
! 
!     if (arg[0] == ESC)
!     {
!       // Putting Esc in the buffer creates ambiguity, it can be the start of
!       // an escape sequence.  Use K_ESC to avoid that.
!       string[0] = K_SPECIAL;
!       string[1] = KS_EXTRA;
!       string[2] = KE_ESC;
!       new_slen = 3;
!     }
!     else
!       new_slen = add_key_to_buf(arg[0], string);
  
      if (put_string_in_typebuf(offset, csi_len, string, new_slen,
                                                 buf, bufsize, buflen) == FAIL)
*** ../vim-9.0.0973/src/getchar.c       2022-11-26 19:16:44.186717893 +0000
--- src/getchar.c       2022-11-29 20:27:30.639611910 +0000
***************
*** 1765,1770 ****
--- 1765,1776 ----
                }
                c = TO_SPECIAL(c2, c);
  
+               // K_ESC is used to avoid ambiguity with the single Esc
+               // character that might be the start of an escape sequence.
+               // Convert it back to a single Esc here.
+               if (c == K_ESC)
+                   c = ESC;
+ 
  #if defined(FEAT_GUI_MSWIN) && defined(FEAT_MENU) && defined(FEAT_TEAROFF)
                // Handle K_TEAROFF here, the caller of vgetc() doesn't need to
                // know that a menu was torn off
***************
*** 3913,3918 ****
--- 3919,3930 ----
                continue;
            }
            c1 = TO_SPECIAL(c1, c2);
+ 
+           // K_ESC is used to avoid ambiguity with the single Esc character
+           // that might be the start of an escape sequence.  Convert it back
+           // to a single Esc here.
+           if (c1 == K_ESC)
+               c1 = ESC;
        }
        if (c1 == Ctrl_V)
        {
*** ../vim-9.0.0973/src/version.c       2022-11-29 18:32:29.309191253 +0000
--- src/version.c       2022-11-29 20:05:41.243699984 +0000
***************
*** 697,698 ****
--- 697,700 ----
  {   /* Add new patch number below this line */
+ /**/
+     974,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
178. You look for an icon to double-click to open your bedroom window.

 /// 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/20221129203344.3BFFE1C2588%40moolenaar.net.

Raspunde prin e-mail lui