summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornaohiro ono <obcat@icloud.com>2021-10-19 11:15:41 +0100
committerBram Moolenaar <Bram@vim.org>2021-10-19 11:15:41 +0100
commit75c30e96cf280a8cc01ac01c41a9252db3e503cc (patch)
tree772920dcede7279046602574c24221e9645360a9
parentad6b90c33cc239794a6694ef53e8baeee2ed97bd (diff)
patch 8.2.3537: mode() does not return the right value in 'operatorfunc'v8.2.3537
Problem: mode() does not return the right value in 'operatorfunc'. Solution: Reset finish_op while calling 'operatorfunc'.
-rw-r--r--src/ops.c5
-rw-r--r--src/testdir/test_functions.vim16
-rw-r--r--src/version.c2
3 files changed, 23 insertions, 0 deletions
diff --git a/src/ops.c b/src/ops.c
index dedeebfb28..5a48550146 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 7dd1894fa1..ac9bb4cfab 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\<Esc>"
+ call assert_equal('n-n', g:current_modes)
+ execute "normal! i\<C-o>g@l\<Esc>"
+ call assert_equal('n-niI', g:current_modes)
+ execute "normal! R\<C-o>g@l\<Esc>"
+ call assert_equal('n-niR', g:current_modes)
+ execute "normal! gR\<C-o>g@l\<Esc>"
+ call assert_equal('n-niV', g:current_modes)
+
if has('terminal')
term
call feedkeys("\<C-W>N", 'xt')
@@ -924,6 +938,8 @@ func Test_mode()
iunmap <F2>
xunmap <F2>
set complete&
+ set operatorfunc&
+ delfunction OperatorFunc
endfunc
" Test for append()
diff --git a/src/version.c b/src/version.c
index 204988911c..2e076cbee1 100644
--- a/src/version.c
+++ b/src/version.c
@@ -758,6 +758,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 3537,
+/**/
3536,
/**/
3535,