0
0
mirror of https://github.com/vim/vim.git synced 2025-07-26 11:04:33 -04:00

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'.
This commit is contained in:
naohiro ono 2021-10-19 11:15:41 +01:00 committed by Bram Moolenaar
parent ad6b90c33c
commit 75c30e96cf
3 changed files with 23 additions and 0 deletions

View File

@ -3314,6 +3314,7 @@ op_function(oparg_T *oap UNUSED)
#ifdef FEAT_EVAL #ifdef FEAT_EVAL
typval_T argv[2]; typval_T argv[2];
int save_virtual_op = virtual_op; int save_virtual_op = virtual_op;
int save_finish_op = finish_op;
pos_T orig_start = curbuf->b_op_start; pos_T orig_start = curbuf->b_op_start;
pos_T orig_end = curbuf->b_op_end; pos_T orig_end = curbuf->b_op_end;
@ -3341,9 +3342,13 @@ op_function(oparg_T *oap UNUSED)
// function. // function.
virtual_op = MAYBE; virtual_op = MAYBE;
// Reset finish_op so that mode() returns the right value.
finish_op = FALSE;
(void)call_func_noret(p_opfunc, 1, argv); (void)call_func_noret(p_opfunc, 1, argv);
virtual_op = save_virtual_op; virtual_op = save_virtual_op;
finish_op = save_finish_op;
if (cmdmod.cmod_flags & CMOD_LOCKMARKS) if (cmdmod.cmod_flags & CMOD_LOCKMARKS)
{ {
curbuf->b_op_start = orig_start; curbuf->b_op_start = orig_start;

View File

@ -912,6 +912,20 @@ func Test_mode()
call assert_equal('c-ce', g:current_modes) call assert_equal('c-ce', g:current_modes)
" How to test Ex mode? " 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') if has('terminal')
term term
call feedkeys("\<C-W>N", 'xt') call feedkeys("\<C-W>N", 'xt')
@ -924,6 +938,8 @@ func Test_mode()
iunmap <F2> iunmap <F2>
xunmap <F2> xunmap <F2>
set complete& set complete&
set operatorfunc&
delfunction OperatorFunc
endfunc endfunc
" Test for append() " Test for append()

View File

@ -757,6 +757,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
3537,
/**/ /**/
3536, 3536,
/**/ /**/