To: vim_dev@googlegroups.com Subject: Patch 8.2.4689 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4689 Problem: Using in a mapping does not work for mouse keys in Insert mode. (Sergey Vlasov) Solution: When reading the argument do not use the stuff buffer. (closes #10080) Files: src/getchar.c *** ../vim-8.2.4688/src/getchar.c 2022-03-18 15:41:13.366489671 +0000 --- src/getchar.c 2022-04-04 19:31:42.767169110 +0100 *************** *** 96,101 **** --- 96,105 ---- static int vgetorpeek(int); static int inchar(char_u *buf, int maxlen, long wait_time); + // flags for vgetorpeek() + #define VGOP_ADVANCE 1 // really get the character + #define VGOP_NO_STUFF 2 // do not use the stuff buffer + /* * Free and clear a buffer. */ *************** *** 1720,1726 **** ++allow_keys; did_inc = TRUE; // mod_mask may change value } ! c = vgetorpeek(TRUE); if (did_inc) { --no_mapping; --- 1724,1730 ---- ++allow_keys; did_inc = TRUE; // mod_mask may change value } ! c = vgetorpeek(VGOP_ADVANCE); if (did_inc) { --no_mapping; *************** *** 1738,1745 **** ++no_mapping; allow_keys = 0; // make sure BS is not found ! c2 = vgetorpeek(TRUE); // no mapping for these chars ! c = vgetorpeek(TRUE); --no_mapping; allow_keys = save_allow_keys; if (c2 == KS_MODIFIER) --- 1742,1749 ---- ++no_mapping; allow_keys = 0; // make sure BS is not found ! c2 = vgetorpeek(VGOP_ADVANCE); // no mapping for these chars ! c = vgetorpeek(VGOP_ADVANCE); --no_mapping; allow_keys = save_allow_keys; if (c2 == KS_MODIFIER) *************** *** 1762,1768 **** int j; // get menu path, it ends with a ! for (j = 0; (c = vgetorpeek(TRUE)) != '\r'; ) { name[j] = c; if (j < 199) --- 1766,1772 ---- int j; // get menu path, it ends with a ! for (j = 0; (c = vgetorpeek(VGOP_ADVANCE)) != '\r'; ) { name[j] = c; if (j < 199) *************** *** 1872,1878 **** buf[0] = c; for (i = 1; i < n; ++i) { ! buf[i] = vgetorpeek(TRUE); if (buf[i] == K_SPECIAL #ifdef FEAT_GUI || (buf[i] == CSI) --- 1876,1882 ---- buf[0] = c; for (i = 1; i < n; ++i) { ! buf[i] = vgetorpeek(VGOP_ADVANCE); if (buf[i] == K_SPECIAL #ifdef FEAT_GUI || (buf[i] == CSI) *************** *** 1885,1892 **** // represents a CSI (0x9B), // or a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI // too. ! c = vgetorpeek(TRUE); ! if (vgetorpeek(TRUE) == KE_CSI && c == KS_EXTRA) buf[i] = CSI; } } --- 1889,1896 ---- // represents a CSI (0x9B), // or a K_SPECIAL - KS_EXTRA - KE_CSI, which is CSI // too. ! c = vgetorpeek(VGOP_ADVANCE); ! if (vgetorpeek(VGOP_ADVANCE) == KE_CSI && c == KS_EXTRA) buf[i] = CSI; } } *************** *** 1989,1995 **** { if (old_char != -1) return old_char; ! return vgetorpeek(FALSE); } #if defined(FEAT_TERMRESPONSE) || defined(FEAT_TERMINAL) || defined(PROTO) --- 1993,1999 ---- { if (old_char != -1) return old_char; ! return vgetorpeek(0); } #if defined(FEAT_TERMRESPONSE) || defined(FEAT_TERMINAL) || defined(PROTO) *************** *** 2964,2974 **** * 3. from the user * This may do a blocking wait if "advance" is TRUE. * ! * if "advance" is TRUE (vgetc()): * Really get the character. * KeyTyped is set to TRUE in the case the user typed the key. * KeyStuffed is TRUE if the character comes from the stuff buffer. ! * if "advance" is FALSE (vpeekc()): * Just look whether there is a character available. * Return NUL if not. * --- 2968,2978 ---- * 3. from the user * This may do a blocking wait if "advance" is TRUE. * ! * if "flags & VGOP_ADVANCE" is non-zero (vgetc()): * Really get the character. * KeyTyped is set to TRUE in the case the user typed the key. * KeyStuffed is TRUE if the character comes from the stuff buffer. ! * if "flags & VGOP_ADVANCE" is zero (vpeekc()): * Just look whether there is a character available. * Return NUL if not. * *************** *** 2977,2984 **** * K_SPECIAL and CSI may be escaped, need to get two more bytes then. */ static int ! vgetorpeek(int advance) { int c, c1; int timedout = FALSE; // waited for more than 1 second // for mapping to complete --- 2981,2989 ---- * K_SPECIAL and CSI may be escaped, need to get two more bytes then. */ static int ! vgetorpeek(int flags) { + int advance = flags & VGOP_ADVANCE; int c, c1; int timedout = FALSE; // waited for more than 1 second // for mapping to complete *************** *** 3022,3028 **** /* * get a character: 1. from the stuffbuffer */ ! if (typeahead_char != 0) { c = typeahead_char; if (advance) --- 3027,3035 ---- /* * get a character: 1. from the stuffbuffer */ ! if (flags & VGOP_NO_STUFF) ! c = 0; ! else if (typeahead_char != 0) { c = typeahead_char; if (advance) *************** *** 3770,3776 **** break; } ! if (vgetorpeek(FALSE) == NUL) { // incomplete is an error, because there is not much the user // could do in this state. --- 3777,3783 ---- break; } ! if (vgetorpeek(0 | VGOP_NO_STUFF) == NUL) { // incomplete is an error, because there is not much the user // could do in this state. *************** *** 3780,3792 **** } // Get one character at a time. ! c1 = vgetorpeek(TRUE); // Get two extra bytes for special keys if (c1 == K_SPECIAL) { ! c1 = vgetorpeek(TRUE); ! c2 = vgetorpeek(TRUE); if (c1 == KS_MODIFIER) { cmod = c2; --- 3787,3799 ---- } // Get one character at a time. ! c1 = vgetorpeek(VGOP_ADVANCE | VGOP_NO_STUFF); // Get two extra bytes for special keys if (c1 == K_SPECIAL) { ! c1 = vgetorpeek(VGOP_ADVANCE | VGOP_NO_STUFF); ! c2 = vgetorpeek(VGOP_ADVANCE | VGOP_NO_STUFF); if (c1 == KS_MODIFIER) { cmod = c2; *** ../vim-8.2.4688/src/version.c 2022-04-04 18:32:29.185670084 +0100 --- src/version.c 2022-04-04 19:27:38.831375370 +0100 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4689, /**/ -- It is illegal for anyone to give lighted cigars to dogs, cats, and other domesticated animal kept as pets. [real standing law in Illinois, United States of America] /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///