From: naohiro ono Date: Tue, 19 Oct 2021 10:15:41 +0000 (+0100) Subject: patch 8.2.3537: mode() does not return the right value in 'operatorfunc' X-Git-Tag: v8.2.3537 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=75c30e96cf280a8cc01ac01c41a9252db3e503cc;p=vim patch 8.2.3537: mode() does not return the right value in 'operatorfunc' Problem: mode() does not return the right value in 'operatorfunc'. Solution: Reset finish_op while calling 'operatorfunc'. --- diff --git a/src/ops.c b/src/ops.c index dedeebfb2..5a4855014 100644 --- a/src/ops.c +++ b/src/ops.c @@ -3314,6 +3314,7 @@ op_function(oparg_T *oap UNUSED) #ifdef FEAT_EVAL typval_T argv[2]; int save_virtual_op = virtual_op; + int save_finish_op = finish_op; pos_T orig_start = curbuf->b_op_start; pos_T orig_end = curbuf->b_op_end; @@ -3341,9 +3342,13 @@ op_function(oparg_T *oap UNUSED) // function. virtual_op = MAYBE; + // Reset finish_op so that mode() returns the right value. + finish_op = FALSE; + (void)call_func_noret(p_opfunc, 1, argv); virtual_op = save_virtual_op; + finish_op = save_finish_op; if (cmdmod.cmod_flags & CMOD_LOCKMARKS) { curbuf->b_op_start = orig_start; diff --git a/src/testdir/test_functions.vim b/src/testdir/test_functions.vim index 7dd1894fa..ac9bb4cfa 100644 --- a/src/testdir/test_functions.vim +++ b/src/testdir/test_functions.vim @@ -912,6 +912,20 @@ func Test_mode() call assert_equal('c-ce', g:current_modes) " How to test Ex mode? + " Test mode in operatorfunc (it used to be Operator-pending). + set operatorfunc=OperatorFunc + function OperatorFunc(_) + call Save_mode() + endfunction + execute "normal! g@l\" + call assert_equal('n-n', g:current_modes) + execute "normal! i\g@l\" + call assert_equal('n-niI', g:current_modes) + execute "normal! R\g@l\" + call assert_equal('n-niR', g:current_modes) + execute "normal! gR\g@l\" + call assert_equal('n-niV', g:current_modes) + if has('terminal') term call feedkeys("\N", 'xt') @@ -924,6 +938,8 @@ func Test_mode() iunmap xunmap set complete& + set operatorfunc& + delfunction OperatorFunc endfunc " Test for append() diff --git a/src/version.c b/src/version.c index 204988911..2e076cbee 100644 --- a/src/version.c +++ b/src/version.c @@ -757,6 +757,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 3537, /**/ 3536, /**/