To: vim_dev@googlegroups.com Subject: Patch 8.2.4059 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.2.4059 Problem: Vim9: an expression of a map cannot access script-local items. (Maxim Kim) Solution: Use the script ID of where the map was defined. Files: src/getchar.c, src/map.c, src/proto/map.pro, src/testdir/test_vim9_import.vim *** ../vim-8.2.4058/src/getchar.c 2022-01-04 18:01:17.889123524 +0000 --- src/getchar.c 2022-01-11 11:28:26.060819006 +0000 *************** *** 2785,2791 **** int save_m_noremap; int save_m_silent; char_u *save_m_keys; - char_u *save_m_str; #else # define save_m_noremap mp->m_noremap # define save_m_silent mp->m_silent --- 2785,2790 ---- *************** *** 2834,2840 **** save_m_noremap = mp->m_noremap; save_m_silent = mp->m_silent; save_m_keys = NULL; // only saved when needed - save_m_str = NULL; // only saved when needed /* * Handle ":map ": evaluate the {rhs} as an expression. Also --- 2833,2838 ---- *************** *** 2851,2858 **** may_garbage_collect = FALSE; save_m_keys = vim_strsave(mp->m_keys); ! save_m_str = vim_strsave(mp->m_str); ! map_str = eval_map_expr(save_m_str, NUL); // The mapping may do anything, but we expect it to take care of // redrawing. Do put the cursor back where it was. --- 2849,2855 ---- may_garbage_collect = FALSE; save_m_keys = vim_strsave(mp->m_keys); ! map_str = eval_map_expr(mp, NUL); // The mapping may do anything, but we expect it to take care of // redrawing. Do put the cursor back where it was. *************** *** 2900,2906 **** } #ifdef FEAT_EVAL vim_free(save_m_keys); - vim_free(save_m_str); #endif *keylenp = keylen; if (i == FAIL) --- 2897,2902 ---- *** ../vim-8.2.4058/src/map.c 2022-01-02 20:20:41.377033186 +0000 --- src/map.c 2022-01-11 11:40:09.263727756 +0000 *************** *** 260,265 **** --- 260,266 ---- { mp->m_script_ctx.sc_sid = sid; mp->m_script_ctx.sc_lnum = lnum; + mp->m_script_ctx.sc_version = in_vim9script() ? SCRIPT_VERSION_VIM9 : 0; } else { *************** *** 1565,1571 **** } #ifdef FEAT_EVAL if (mp->m_expr) ! s = eval_map_expr(mp->m_str, c); else #endif s = mp->m_str; --- 1566,1572 ---- } #ifdef FEAT_EVAL if (mp->m_expr) ! s = eval_map_expr(mp, c); else #endif s = mp->m_str; *************** *** 1600,1606 **** */ char_u * eval_map_expr( ! char_u *str, int c) // NUL or typed character for abbreviation { char_u *res; --- 1601,1607 ---- */ char_u * eval_map_expr( ! mapblock_T *mp, int c) // NUL or typed character for abbreviation { char_u *res; *************** *** 1609,1618 **** pos_T save_cursor; int save_msg_col; int save_msg_row; // Remove escaping of CSI, because "str" is in a format to be used as // typeahead. ! expr = vim_strsave(str); if (expr == NULL) return NULL; vim_unescape_csi(expr); --- 1610,1621 ---- pos_T save_cursor; int save_msg_col; int save_msg_row; + scid_T save_sctx_sid = current_sctx.sc_sid; + int save_sctx_version = current_sctx.sc_version; // Remove escaping of CSI, because "str" is in a format to be used as // typeahead. ! expr = vim_strsave(mp->m_str); if (expr == NULL) return NULL; vim_unescape_csi(expr); *************** *** 1625,1636 **** --- 1628,1649 ---- save_cursor = curwin->w_cursor; save_msg_col = msg_col; save_msg_row = msg_row; + if (mp->m_script_ctx.sc_version == SCRIPT_VERSION_VIM9) + { + current_sctx.sc_sid = mp->m_script_ctx.sc_sid; + current_sctx.sc_version = SCRIPT_VERSION_VIM9; + } + + // Note: the evaluation may make "mp" invalid. p = eval_to_string(expr, FALSE); + --textwinlock; --ex_normal_lock; curwin->w_cursor = save_cursor; msg_col = save_msg_col; msg_row = save_msg_row; + current_sctx.sc_sid = save_sctx_sid; + current_sctx.sc_version = save_sctx_version; vim_free(expr); *** ../vim-8.2.4058/src/proto/map.pro 2021-07-30 20:32:41.448722501 +0100 --- src/proto/map.pro 2022-01-11 11:28:31.184817355 +0000 *************** *** 10,16 **** char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx); int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file); int check_abbr(int c, char_u *ptr, int col, int mincol); ! char_u *eval_map_expr(char_u *str, int c); char_u *vim_strsave_escape_csi(char_u *p); void vim_unescape_csi(char_u *p); int makemap(FILE *fd, buf_T *buf); --- 10,16 ---- char_u *set_context_in_map_cmd(expand_T *xp, char_u *cmd, char_u *arg, int forceit, int isabbrev, int isunmap, cmdidx_T cmdidx); int ExpandMappings(regmatch_T *regmatch, int *num_file, char_u ***file); int check_abbr(int c, char_u *ptr, int col, int mincol); ! char_u *eval_map_expr(mapblock_T *mp, int c); char_u *vim_strsave_escape_csi(char_u *p); void vim_unescape_csi(char_u *p); int makemap(FILE *fd, buf_T *buf); *** ../vim-8.2.4058/src/testdir/test_vim9_import.vim 2022-01-10 21:38:59.635224879 +0000 --- src/testdir/test_vim9_import.vim 2022-01-11 11:48:24.502444638 +0000 *************** *** 1184,1189 **** --- 1184,1227 ---- &rtp = save_rtp enddef + def Test_autoload_mapping() + mkdir('Xdir/autoload', 'p') + var save_rtp = &rtp + exe 'set rtp^=' .. getcwd() .. '/Xdir' + + var lines =<< trim END + vim9script autoload + + g:toggle_loaded = 'yes' + + export def Toggle(): string + return ":g:toggle_called = 'yes'\" + enddef + END + writefile(lines, 'Xdir/autoload/toggle.vim') + + lines =<< trim END + vim9script + + import autoload 'toggle.vim' + + nnoremap tt toggle.Toggle() + END + CheckScriptSuccess(lines) + assert_false(exists("g:toggle_loaded")) + assert_false(exists("g:toggle_called")) + + feedkeys("tt", 'xt') + assert_equal('yes', g:toggle_loaded) + assert_equal('yes', g:toggle_called) + + nunmap tt + unlet g:toggle_loaded + unlet g:toggle_called + delete('Xdir', 'rf') + &rtp = save_rtp + enddef + def Test_vim9script_autoload_fails() var lines =<< trim END vim9script autoload *** ../vim-8.2.4058/src/version.c 2022-01-10 21:38:59.635224879 +0000 --- src/version.c 2022-01-11 11:49:27.846268104 +0000 *************** *** 752,753 **** --- 752,755 ---- { /* Add new patch number below this line */ + /**/ + 4059, /**/ -- In his lifetime van Gogh painted 486 oil paintings. Oddly enough, 8975 of them are to be found in the United States. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// \\\ \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///