diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-12-01 20:12:24 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-12-01 20:12:24 +0100 |
commit | 4324d87a4432721d9dbc72c1e336350bc6b7ebc3 (patch) | |
tree | 1f8ea56043727e3c69b51efa93b7b25633c28958 | |
parent | 4b8a065145bb53762b869cd6b8e55b7ad7341761 (diff) | |
download | vim-git-4324d87a4432721d9dbc72c1e336350bc6b7ebc3.tar.gz |
patch 8.2.2074: Vim9: using :normal from Vim9 script can't handle rangev8.2.2074
Problem: Vim9: using :normal from Vim9 script can't handle range.
Solution: Execute a :normal command in legacy script context. (closes #7401)
-rw-r--r-- | src/ex_docmd.c | 9 | ||||
-rw-r--r-- | src/structs.h | 1 | ||||
-rw-r--r-- | src/testdir/test_vim9_script.vim | 13 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 22 insertions, 3 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c index 1d5d2dedc..e7aec5e2a 100644 --- a/src/ex_docmd.c +++ b/src/ex_docmd.c @@ -7994,10 +7994,12 @@ save_current_state(save_state_T *sst) sst->save_finish_op = finish_op; sst->save_opcount = opcount; sst->save_reg_executing = reg_executing; + sst->save_script_version = current_sctx.sc_version; - msg_scroll = FALSE; // no msg scrolling in Normal mode - restart_edit = 0; // don't go to Insert mode - p_im = FALSE; // don't use 'insertmode' + msg_scroll = FALSE; // no msg scrolling in Normal mode + restart_edit = 0; // don't go to Insert mode + p_im = FALSE; // don't use 'insertmode' + current_sctx.sc_version = 1; // not in Vim9 script /* * Save the current typeahead. This is required to allow using ":normal" @@ -8021,6 +8023,7 @@ restore_current_state(save_state_T *sst) opcount = sst->save_opcount; reg_executing = sst->save_reg_executing; msg_didout |= sst->save_msg_didout; // don't reset msg_didout now + current_sctx.sc_version = sst->save_script_version; // Restore the state (needed when called from a function executed for // 'indentexpr'). Update the mouse and cursor, they may have changed. diff --git a/src/structs.h b/src/structs.h index 24baa34c5..b18134ac0 100644 --- a/src/structs.h +++ b/src/structs.h @@ -4155,6 +4155,7 @@ typedef struct { int save_finish_op; int save_opcount; int save_reg_executing; + int save_script_version; tasave_T tabuf; } save_state_T; diff --git a/src/testdir/test_vim9_script.vim b/src/testdir/test_vim9_script.vim index b58e566ca..a18e3f2a4 100644 --- a/src/testdir/test_vim9_script.vim +++ b/src/testdir/test_vim9_script.vim @@ -2958,6 +2958,19 @@ def Test_put_with_linebreak() bwipe! enddef +def InvokeNormal() + exe "norm! :m+1\r" +enddef + +def Test_invoke_normal_in_visual_mode() + xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> + new + setline(1, ['aaa', 'bbb']) + feedkeys("V\<F3>", 'xt') + assert_equal(['bbb', 'aaa'], getline(1, 2)) + xunmap <F3> +enddef + " Keep this last, it messes up highlighting. def Test_substitute_cmd() new diff --git a/src/version.c b/src/version.c index a4d6eedfc..469b92d31 100644 --- a/src/version.c +++ b/src/version.c @@ -751,6 +751,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2074, +/**/ 2073, /**/ 2072, |