summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-12-01 20:12:24 +0100
committerBram Moolenaar <Bram@vim.org>2020-12-01 20:12:24 +0100
commit4324d87a4432721d9dbc72c1e336350bc6b7ebc3 (patch)
tree1f8ea56043727e3c69b51efa93b7b25633c28958
parent4b8a065145bb53762b869cd6b8e55b7ad7341761 (diff)
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.c9
-rw-r--r--src/structs.h1
-rw-r--r--src/testdir/test_vim9_script.vim13
-rw-r--r--src/version.c2
4 files changed, 22 insertions, 3 deletions
diff --git a/src/ex_docmd.c b/src/ex_docmd.c
index 1d5d2dedc2..e7aec5e2ab 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 24baa34c51..b18134ac0a 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 b58e566caf..a18e3f2a48 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 a4d6eedfc3..469b92d317 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,