]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.0839: dropping modifier when putting a character back in typeahead v8.2.0839
authorBram Moolenaar <Bram@vim.org>
Fri, 29 May 2020 20:41:41 +0000 (22:41 +0200)
committerBram Moolenaar <Bram@vim.org>
Fri, 29 May 2020 20:41:41 +0000 (22:41 +0200)
Problem:    Dropping modifier when putting a character back in typeahead.
Solution:   Add modifier to ins_char_typebuf(). (closes #6158)

src/getchar.c
src/globals.h
src/message.c
src/normal.c
src/proto/getchar.pro
src/terminal.c
src/testdir/test_messages.vim
src/version.c

index e9eef25ad82884a7884928833df791c5f80d71a5..312f3c1db70a7d32d5d1f3965040f4115b4d951d 100644 (file)
@@ -1101,18 +1101,29 @@ ins_typebuf(
  * the char.
  */
     void
-ins_char_typebuf(int c)
+ins_char_typebuf(int c, int modifier)
 {
-    char_u     buf[MB_MAXBYTES + 1];
-    if (IS_SPECIAL(c))
+    char_u     buf[MB_MAXBYTES + 4];
+    int                idx = 0;
+
+    if (modifier != 0)
     {
        buf[0] = K_SPECIAL;
-       buf[1] = K_SECOND(c);
-       buf[2] = K_THIRD(c);
+       buf[1] = KS_MODIFIER;
+       buf[2] = modifier;
        buf[3] = NUL;
+       idx = 3;
+    }
+    if (IS_SPECIAL(c))
+    {
+       buf[idx] = K_SPECIAL;
+       buf[idx + 1] = K_SECOND(c);
+       buf[idx + 2] = K_THIRD(c);
+       buf[idx + 3] = NUL;
+       idx += 3;
     }
     else
-       buf[(*mb_char2bytes)(c, buf)] = NUL;
+       buf[(*mb_char2bytes)(c, buf + idx) + idx] = NUL;
     (void)ins_typebuf(buf, KeyNoremap, 0, !KeyTyped, cmd_silent);
 }
 
@@ -1640,8 +1651,11 @@ vgetc(void)
     }
     else
     {
-       mod_mask = 0x0;
+       mod_mask = 0;
+       vgetc_mod_mask = 0;
+       vgetc_char = 0;
        last_recorded_len = 0;
+
        for (;;)                // this is done twice if there are modifiers
        {
            int did_inc = FALSE;
@@ -1835,9 +1849,15 @@ vgetc(void)
            }
 
            if (!no_reduce_keys)
+           {
                // A modifier was not used for a mapping, apply it to ASCII
                // keys.  Shift would already have been applied.
+               // Remember the character and mod_mask from before, in some
+               // cases they are put back in the typeahead buffer.
+               vgetc_mod_mask = mod_mask;
+               vgetc_char = c;
                c = merge_modifyOtherKeys(c);
+           }
 
            break;
        }
@@ -2192,7 +2212,7 @@ parse_queued_messages(void)
     // If the current window or buffer changed we need to bail out of the
     // waiting loop.  E.g. when a job exit callback closes the terminal window.
     if (curwin->w_id != old_curwin_id || curbuf->b_fnum != old_curbuf_fnum)
-       ins_char_typebuf(K_IGNORE);
+       ins_char_typebuf(K_IGNORE, 0);
 
     --entered;
 }
index f0716c506cf80cb365a3e14521af8c40616c960f..387c62e7199a91e01a1d97b4c5ce7b45a78e7e49 100644 (file)
@@ -120,7 +120,12 @@ EXTERN int screen_Columns INIT(= 0);   // actual size of ScreenLines[]
  * When vgetc() is called, it sets mod_mask to the set of modifiers that are
  * held down based on the MOD_MASK_* symbols that are read first.
  */
-EXTERN int     mod_mask INIT(= 0x0);           // current key modifiers
+EXTERN int     mod_mask INIT(= 0);             // current key modifiers
+
+// The value of "mod_mask" and the unomdified character before calling
+// merge_modifyOtherKeys().
+EXTERN int     vgetc_mod_mask INIT(= 0);
+EXTERN int     vgetc_char INIT(= 0);
 
 /*
  * Cmdline_row is the row where the command line starts, just below the
index 04dc4014f3a9fd88b0070fb42a7fbbab8894a925..45217e2c894b732bb2788ec7fa15cd04c1b74922 100644 (file)
@@ -1258,7 +1258,7 @@ wait_return(int redraw)
        {
            // Put the character back in the typeahead buffer.  Don't use the
            // stuff buffer, because lmaps wouldn't work.
-           ins_char_typebuf(c);
+           ins_char_typebuf(vgetc_char, vgetc_mod_mask);
            do_redraw = TRUE;       // need a redraw even though there is
                                    // typeahead
        }
@@ -3712,7 +3712,7 @@ do_dialog(
                if (c == ':' && ex_cmd)
                {
                    retval = dfltbutton;
-                   ins_char_typebuf(':');
+                   ins_char_typebuf(':', 0);
                    break;
                }
 
index 690bb0081917b23a2eab73de3677a717224fbcd1..48e1c71aedecdbf3ed73585eeb748ff381d81db0 100644 (file)
@@ -595,7 +595,7 @@ normal_cmd(
        // restart automatically.
        // Insert the typed character in the typeahead buffer, so that it can
        // be mapped in Insert mode.  Required for ":lmap" to work.
-       ins_char_typebuf(c);
+       ins_char_typebuf(vgetc_char, vgetc_mod_mask);
        if (restart_edit != 0)
            c = 'd';
        else
index 9ff6620290ae0cfdefe596c159a43181c127f92e..57d78b594e26f04ba66f496eec08a5103d9c5b56 100644 (file)
@@ -25,7 +25,7 @@ int start_redo_ins(void);
 void stop_redo_ins(void);
 int noremap_keys(void);
 int ins_typebuf(char_u *str, int noremap, int offset, int nottyped, int silent);
-void ins_char_typebuf(int c);
+void ins_char_typebuf(int c, int modifier);
 int typebuf_changed(int tb_change_cnt);
 int typebuf_typed(void);
 int typebuf_maplen(void);
index 52f8105cacf78cb5da9a6e57483de415338ee335..59bf03995cd5c84335880cd7e11f35a764736f07 100644 (file)
@@ -3467,7 +3467,7 @@ term_channel_closed(channel_T *ch)
        redraw_statuslines();
 
        // Need to break out of vgetc().
-       ins_char_typebuf(K_IGNORE);
+       ins_char_typebuf(K_IGNORE, 0);
        typebuf_was_filled = TRUE;
 
        term = curbuf->b_term;
index e076241607560c8272643e40021d7f31930c2a82..b74ad2cb5034ab9f1aca9472acdcac503d07db85 100644 (file)
@@ -2,6 +2,7 @@
 
 source shared.vim
 source term_util.vim
+source view_util.vim
 
 func Test_messages()
   let oldmore = &more
@@ -305,4 +306,12 @@ func Test_null()
   endif
 endfunc
 
+func Test_mapping_at_hit_return_prompt()
+  nnoremap <C-B> :echo "hit ctrl-b"<CR>
+  call feedkeys(":ls\<CR>", "xt")
+  call feedkeys("\<C-B>", "xt")
+  call assert_match('hit ctrl-b', Screenline(&lines - 1))
+  nunmap <C-B>
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
index f0383244a3739dbf29e4c302e55d3f4e9e15be55..a1b6a7d8b41c93c3c462c168367cb0013a5c7b76 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    839,
 /**/
     838,
 /**/