To: vim_dev@googlegroups.com Subject: Patch 8.2.4107 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4107 Problem: Script context not restored after using . Solution: Also restore context when not in a script. (closes #9536) Add the 'c' flag to feedkeys() to be able to test this. Files: runtime/doc/builtin.txt, src/getchar.c, src/evalfunc.c, src/testdir/test_mapping.vim *** ../vim-8.2.4106/runtime/doc/builtin.txt 2022-01-10 13:36:31.260892426 +0000 --- runtime/doc/builtin.txt 2022-01-16 13:22:02.786692066 +0000 *************** *** 2394,2399 **** --- 2394,2402 ---- Note that if you manage to call feedkeys() while executing commands, thus calling it recursively, then all typeahead will be consumed by the last call. + 'c' Remove any script context when executing, so that + legacy script syntax applies, "s:var" does not work, + etc. '!' When used with 'x' will not end Insert mode. Can be used in a test when a timer is set to exit Insert mode a little later. Useful for testing CursorHoldI. *** ../vim-8.2.4106/src/getchar.c 2022-01-15 18:48:28.602361973 +0000 --- src/getchar.c 2022-01-16 13:29:19.257823117 +0000 *************** *** 3797,3803 **** } } else ! ga_append(&line_ga, (char)c1); cmod = 0; } --- 3797,3803 ---- } } else ! ga_append(&line_ga, c1); cmod = 0; } *************** *** 3815,3821 **** { int res; #ifdef FEAT_EVAL ! sctx_T save_current_sctx = {0, 0, 0, 0}; if (key == K_SCRIPT_COMMAND && last_used_map != NULL) { --- 3815,3821 ---- { int res; #ifdef FEAT_EVAL ! sctx_T save_current_sctx = {-1, 0, 0, 0}; if (key == K_SCRIPT_COMMAND && last_used_map != NULL) { *************** *** 3827,3833 **** res = do_cmdline(NULL, getcmdkeycmd, NULL, flags); #ifdef FEAT_EVAL ! if (save_current_sctx.sc_sid > 0) current_sctx = save_current_sctx; #endif --- 3827,3833 ---- res = do_cmdline(NULL, getcmdkeycmd, NULL, flags); #ifdef FEAT_EVAL ! if (save_current_sctx.sc_sid >= 0) current_sctx = save_current_sctx; #endif *** ../vim-8.2.4106/src/evalfunc.c 2022-01-13 21:15:17.237958552 +0000 --- src/evalfunc.c 2022-01-16 13:24:22.010406837 +0000 *************** *** 3932,3937 **** --- 3932,3938 ---- char_u nbuf[NUMBUFLEN]; int typed = FALSE; int execute = FALSE; + int context = FALSE; int dangerous = FALSE; int lowlevel = FALSE; char_u *keys_esc; *************** *** 3961,3966 **** --- 3962,3968 ---- case 't': typed = TRUE; break; case 'i': insert = TRUE; break; case 'x': execute = TRUE; break; + case 'c': context = TRUE; break; case '!': dangerous = TRUE; break; case 'L': lowlevel = TRUE; break; } *************** *** 4007,4017 **** if (execute) { ! int save_msg_scroll = msg_scroll; // Avoid a 1 second delay when the keys start Insert mode. msg_scroll = FALSE; if (!dangerous) { ++ex_normal_busy; --- 4009,4027 ---- if (execute) { ! int save_msg_scroll = msg_scroll; ! sctx_T save_sctx; // Avoid a 1 second delay when the keys start Insert mode. msg_scroll = FALSE; + if (context) + { + save_sctx = current_sctx; + current_sctx.sc_sid = 0; + current_sctx.sc_version = 0; + } + if (!dangerous) { ++ex_normal_busy; *************** *** 4025,4030 **** --- 4035,4043 ---- } msg_scroll |= save_msg_scroll; + + if (context) + current_sctx = save_sctx; } } } *** ../vim-8.2.4106/src/testdir/test_mapping.vim 2022-01-13 15:25:28.222535371 +0000 --- src/testdir/test_mapping.vim 2022-01-16 13:28:26.785924258 +0000 *************** *** 4,9 **** --- 4,10 ---- source check.vim source screendump.vim source term_util.vim + source vim9.vim func Test_abbreviation() " abbreviation with 0x80 should work *************** *** 1397,1402 **** --- 1398,1416 ---- ounmap i- endfunc + func Test_map_script_cmd_restore() + let lines =<< trim END + vim9script + nnoremap eval 1 + 2 + END + call CheckScriptSuccess(lines) + call feedkeys("\:let g:result = 3+4\", 'xtc') + call assert_equal(7, g:result) + + nunmap + unlet g:result + endfunc + " Test for using