From 648dd88af67c7abac31915cbf0025f97031c96c1 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Thu, 14 Apr 2022 21:36:15 +0100 Subject: [PATCH] patch 8.2.4751: mapping name.Func does not work for autoload script Problem: Mapping name.Func does not work for script in autoload directory. Solution: Use the # form for a script in the autoload directory. (closes #10186) --- src/term.c | 33 ++++++++++++++++++++----- src/testdir/test_vim9_import.vim | 41 ++++++++++++++++++++++++++++---- src/version.c | 2 ++ 3 files changed, 65 insertions(+), 11 deletions(-) diff --git a/src/term.c b/src/term.c index e51134f16..1c6aadc86 100644 --- a/src/term.c +++ b/src/term.c @@ -5963,24 +5963,26 @@ replace_termcodes( int do_special; // recognize <> key codes int do_key_code; // recognize raw key codes char_u *result; // buffer for resulting string + garray_T ga; do_backslash = (vim_strchr(p_cpo, CPO_BSLASH) == NULL); do_special = (vim_strchr(p_cpo, CPO_SPECI) == NULL) || (flags & REPTERM_SPECIAL); do_key_code = (vim_strchr(p_cpo, CPO_KEYCODE) == NULL); + src = from; /* * Allocate space for the translation. Worst case a single character is * replaced by 6 bytes (shifted special key), plus a NUL at the end. + * In the rare case more might be needed ga_grow() must be called again. */ - result = alloc(STRLEN(from) * 6 + 1); - if (result == NULL) // out of memory + ga_init2(&ga, 1L, 100); + if (ga_grow(&ga, STRLEN(src) * 6 + 1) == FAIL) // out of memory { *bufp = NULL; return from; } - - src = from; + result = ga.ga_data; /* * Check for #n at start only: function key n @@ -6033,8 +6035,28 @@ replace_termcodes( if (imp != NULL) { - sid = imp->imp_sid; + scriptitem_T *si = SCRIPT_ITEM(imp->imp_sid); + size_t len; + src = dot + 1; + if (si->sn_autoload_prefix != NULL) + { + // Turn "name.Func" + // into "scriptname#Func". + len = STRLEN(si->sn_autoload_prefix); + if (ga_grow(&ga, STRLEN(src) * 6 + len + 1) + == FAIL) + { + ga_clear(&ga); + *bufp = NULL; + return from; + } + result = ga.ga_data; + STRCPY(result + dlen, si->sn_autoload_prefix); + dlen += len; + continue; + } + sid = imp->imp_sid; } } @@ -6048,7 +6070,6 @@ replace_termcodes( } } #endif - slen = trans_special(&src, result + dlen, FSK_KEYCODE | ((flags & REPTERM_NO_SIMPLIFY) ? 0 : FSK_SIMPLIFY), did_simplify); diff --git a/src/testdir/test_vim9_import.vim b/src/testdir/test_vim9_import.vim index 94cb76033..dd9f5668d 100644 --- a/src/testdir/test_vim9_import.vim +++ b/src/testdir/test_vim9_import.vim @@ -669,32 +669,63 @@ def Test_use_import_in_mapping() nunmap enddef -def Test_use_autoload_import_in_mapping() +def Test_use_relative_autoload_import_in_mapping() var lines =<< trim END vim9script export def Func() g:result = 42 enddef END - writefile(lines, 'XautoloadExport.vim') + writefile(lines, 'XrelautoloadExport.vim') lines =<< trim END vim9script - import autoload './XautoloadExport.vim' as some + import autoload './XrelautoloadExport.vim' as some nnoremap :call some.Func() END writefile(lines, 'Xmapscript.vim') source Xmapscript.vim - assert_match('\d\+ A: .*XautoloadExport.vim', execute('scriptnames')->split("\n")[-1]) + assert_match('\d\+ A: .*XrelautoloadExport.vim', execute('scriptnames')->split("\n")[-1]) feedkeys("\", "xt") assert_equal(42, g:result) unlet g:result - delete('XautoloadExport.vim') + delete('XrelautoloadExport.vim') delete('Xmapscript.vim') nunmap enddef +def Test_use_autoload_import_in_mapping() + var lines =<< trim END + vim9script + export def Func() + g:result = 49 + enddef + END + mkdir('Xdir/autoload', 'p') + writefile(lines, 'Xdir/autoload/XautoloadExport.vim') + var save_rtp = &rtp + exe 'set rtp^=' .. getcwd() .. '/Xdir' + + lines =<< trim END + vim9script + import autoload 'XautoloadExport.vim' as some + nnoremap :call some.Func() + END + writefile(lines, 'Xmapscript.vim') + + source Xmapscript.vim + assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1]) + feedkeys("\", "xt") + assert_equal(49, g:result) + + unlet g:result + delete('Xmapscript.vim') + nunmap + delete('Xdir', 'rf') + &rtp = save_rtp +enddef + def Test_use_import_in_command_completion() var lines =<< trim END vim9script diff --git a/src/version.c b/src/version.c index 68b61f487..db8278516 100644 --- a/src/version.c +++ b/src/version.c @@ -746,6 +746,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 4751, /**/ 4750, /**/ -- 2.40.0