diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-04-05 21:38:53 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-05 21:38:53 +0800 |
commit | 969d600f2a107507c60e4ac3f3a8c03210662f96 (patch) | |
tree | 8acb7a2c9e766b07a8e321ea18e48e9ecc1a6544 /src/nvim/getchar.c | |
parent | e135adcb8c4f32332ba87ea6681f41330b909e1c (diff) | |
download | rneovim-969d600f2a107507c60e4ac3f3a8c03210662f96.tar.gz rneovim-969d600f2a107507c60e4ac3f3a8c03210662f96.tar.bz2 rneovim-969d600f2a107507c60e4ac3f3a8c03210662f96.zip |
vim-patch:8.2.{4692,4691,4690}: fix Insert mode <LeftDrag> mapping bug (#17999)
vim-patch:8.2.4692: no test for what 8.2.4691 fixes
Problem: No test for what 8.2.4691 fixes.
Solution: Add a test. Use a more generic sotlution. (closes vim/vim#10090)
https://github.com/vim/vim/commit/0f68e6c07aaf62c034a242f183b93c1bb44e7f93
Test cannot be used because it must use test_setmouse(). Use a Lua test.
Reverted patches:
vim-patch:8.2.4691: solution for <Cmd> in a mapping causes trouble
Problem: Solution for <Cmd> in a mapping causes trouble.
Solution: Use another solution: put back CTRL-O after reading the <Cmd>
sequence.
https://github.com/vim/vim/commit/ca9d8d2cb9fc6b9240f2a74ccd36f9d966488294
vim-patch:8.2.4689: using <Cmd> in a mapping does not work for mouse keys
Problem: Using <Cmd> in a mapping does not work for mouse keys in Insert
mode. (Sergey Vlasov)
Solution: When reading the <Cmd> argument do not use the stuff buffer.
(closes vim/vim#10080)
https://github.com/vim/vim/commit/d0fb2d804183c2786578b4c32ba5b92938f93d0e
Diffstat (limited to 'src/nvim/getchar.c')
-rw-r--r-- | src/nvim/getchar.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index 669d181364..eddd5ccd14 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -1253,7 +1253,14 @@ static int old_mod_mask; // mod_mask for ungotten character static int old_mouse_grid; // mouse_grid related to old_char static int old_mouse_row; // mouse_row related to old_char static int old_mouse_col; // mouse_col related to old_char +static int old_KeyStuffed; // whether old_char was stuffed +static bool can_get_old_char(void) +{ + // If the old character was not stuffed and characters have been added to + // the stuff buffer, need to first get the stuffed characters instead. + return old_char != -1 && (old_KeyStuffed || stuff_empty()); +} /* * Save all three kinds of typeahead, so that the user must type at a prompt. @@ -1454,7 +1461,7 @@ int vgetc(void) * If a character was put back with vungetc, it was already processed. * Return it directly. */ - if (old_char != -1) { + if (can_get_old_char()) { c = old_char; old_char = -1; mod_mask = old_mod_mask; @@ -1660,7 +1667,7 @@ int plain_vgetc(void) */ int vpeekc(void) { - if (old_char != -1) { + if (can_get_old_char()) { return old_char; } return vgetorpeek(false); @@ -2052,7 +2059,9 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) return map_result_nomatch; } -// unget one character (can only be done once!) +/// unget one character (can only be done once!) +/// If the character was stuffed, vgetc() will get it next time it was called. +/// Otherwise vgetc() will only get it when the stuff buffer is empty. void vungetc(int c) { old_char = c; @@ -2060,6 +2069,7 @@ void vungetc(int c) old_mouse_grid = mouse_grid; old_mouse_row = mouse_row; old_mouse_col = mouse_col; + old_KeyStuffed = KeyStuffed; } /// Gets a byte: |