mirror of
https://github.com/neovim/neovim.git
synced 2024-12-31 17:13:26 -07:00
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)0f68e6c07a
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.ca9d8d2cb9
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)d0fb2d8041
This commit is contained in:
parent
e135adcb8c
commit
969d600f2a
@ -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:
|
||||
|
@ -1517,9 +1517,12 @@ bool do_mouse(oparg_T *oap, int c, int dir, long count, bool fixindent)
|
||||
for (;;) {
|
||||
which_button = get_mouse_button(KEY2TERMCAP1(c), &is_click, &is_drag);
|
||||
if (is_drag) {
|
||||
/* If the next character is the same mouse event then use that
|
||||
* one. Speeds up dragging the status line. */
|
||||
if (vpeekc() != NUL) {
|
||||
// If the next character is the same mouse event then use that
|
||||
// one. Speeds up dragging the status line.
|
||||
// Note: Since characters added to the stuff buffer in the code
|
||||
// below need to come before the next character, do not do this
|
||||
// when the current character was stuffed.
|
||||
if (!KeyStuffed && vpeekc() != NUL) {
|
||||
int nc;
|
||||
int save_mouse_grid = mouse_grid;
|
||||
int save_mouse_row = mouse_row;
|
||||
|
@ -676,4 +676,38 @@ func Test_plug_remap()
|
||||
%bw!
|
||||
endfunc
|
||||
|
||||
" Test for mapping <LeftDrag> in Insert mode
|
||||
func Test_mouse_drag_insert_map()
|
||||
CheckFunction test_setmouse
|
||||
set mouse=a
|
||||
func ClickExpr()
|
||||
call test_setmouse(1, 1)
|
||||
return "\<LeftMouse>"
|
||||
endfunc
|
||||
func DragExpr()
|
||||
call test_setmouse(1, 2)
|
||||
return "\<LeftDrag>"
|
||||
endfunc
|
||||
inoremap <expr> <F2> ClickExpr()
|
||||
imap <expr> <F3> DragExpr()
|
||||
|
||||
inoremap <LeftDrag> <LeftDrag><Cmd>let g:dragged = 1<CR>
|
||||
exe "normal i\<F2>\<F3>"
|
||||
call assert_equal(1, g:dragged)
|
||||
call assert_equal('v', mode())
|
||||
exe "normal! \<C-\>\<C-N>"
|
||||
unlet g:dragged
|
||||
|
||||
inoremap <LeftDrag> <LeftDrag><C-\><C-N>
|
||||
exe "normal i\<F2>\<F3>"
|
||||
call assert_equal('n', mode())
|
||||
|
||||
iunmap <LeftDrag>
|
||||
iunmap <F2>
|
||||
iunmap <F3>
|
||||
delfunc ClickExpr
|
||||
delfunc DragExpr
|
||||
set mouse&
|
||||
endfunc
|
||||
|
||||
" vim: shiftwidth=2 sts=2 expandtab
|
||||
|
@ -3,6 +3,8 @@
|
||||
local helpers = require('test.functional.helpers')(after_each)
|
||||
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
|
||||
local feed_command, expect, poke_eventloop = helpers.feed_command, helpers.expect, helpers.poke_eventloop
|
||||
local command, eq, eval, meths = helpers.command, helpers.eq, helpers.eval, helpers.meths
|
||||
local sleep = helpers.sleep
|
||||
|
||||
describe('mapping', function()
|
||||
before_each(clear)
|
||||
@ -126,4 +128,28 @@ describe('mapping', function()
|
||||
new line here
|
||||
]])
|
||||
end)
|
||||
|
||||
it('<LeftDrag> mapping in Insert mode works correctly vim-patch:8.2.4692', function()
|
||||
command('set mouse=a')
|
||||
|
||||
command([[inoremap <LeftDrag> <LeftDrag><Cmd>let g:dragged = 1<CR>]])
|
||||
feed('i')
|
||||
sleep(10)
|
||||
meths.input_mouse('left', 'press', '', 0, 0, 0)
|
||||
sleep(10)
|
||||
meths.input_mouse('left', 'drag', '', 0, 0, 1)
|
||||
sleep(10)
|
||||
eq(1, eval('g:dragged'))
|
||||
eq('v', eval('mode()'))
|
||||
feed([[<C-\><C-N>]])
|
||||
|
||||
command([[inoremap <LeftDrag> <LeftDrag><C-\><C-N>]])
|
||||
feed('i')
|
||||
sleep(10)
|
||||
meths.input_mouse('left', 'press', '', 0, 0, 0)
|
||||
sleep(10)
|
||||
meths.input_mouse('left', 'drag', '', 0, 0, 1)
|
||||
sleep(10)
|
||||
eq('n', eval('mode()'))
|
||||
end)
|
||||
end)
|
||||
|
Loading…
Reference in New Issue
Block a user