Thanks, works for me.

вторник, 11 января 2022 г. в 14:59:43 UTC+3, Bram Moolenaar: 

>
> 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 <expr>": 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'\<CR>"
> + enddef
> + END
> + writefile(lines, 'Xdir/autoload/toggle.vim')
> + 
> + lines =<< trim END
> + vim9script
> + 
> + import autoload 'toggle.vim'
> + 
> + nnoremap <silent> <expr> 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 -- [email protected] -- http://www.Moolenaar.net \\\
> /// \\\
> \\\ sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ ///
> \\\ help me help AIDS victims -- http://ICCF-Holland.org ///
>

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/cf78d48c-3fb1-4cdd-bf58-bb1be403c420n%40googlegroups.com.

Raspunde prin e-mail lui