]> granicus.if.org Git - vim/commitdiff
patch 8.2.4751: mapping <SID>name.Func does not work for autoload script v8.2.4751
authorBram Moolenaar <Bram@vim.org>
Thu, 14 Apr 2022 20:36:15 +0000 (21:36 +0100)
committerBram Moolenaar <Bram@vim.org>
Thu, 14 Apr 2022 20:36:15 +0000 (21:36 +0100)
Problem:    Mapping <SID>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
src/testdir/test_vim9_import.vim
src/version.c

index e51134f16e36f93cc962d0a6d1970d491db452eb..1c6aadc86404058cb7aae16ac4cd006e62ec69da 100644 (file)
@@ -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 "<SID>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);
index 94cb76033e1728a85d7281fc818ec02bef3802ed..dd9f5668db347e41766f2c70398c227358c49f92 100644 (file)
@@ -669,32 +669,63 @@ def Test_use_import_in_mapping()
   nunmap <F4>
 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 <F3> :call <SID>some.Func()<CR>
   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("\<F3>", "xt")
   assert_equal(42, g:result)
 
   unlet g:result
-  delete('XautoloadExport.vim')
+  delete('XrelautoloadExport.vim')
   delete('Xmapscript.vim')
   nunmap <F3>
 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 <F3> :call <SID>some.Func()<CR>
+  END
+  writefile(lines, 'Xmapscript.vim')
+
+  source Xmapscript.vim
+  assert_match('\d\+ A: .*autoload/XautoloadExport.vim', execute('scriptnames')->split("\n")[-1])
+  feedkeys("\<F3>", "xt")
+  assert_equal(49, g:result)
+
+  unlet g:result
+  delete('Xmapscript.vim')
+  nunmap <F3>
+  delete('Xdir', 'rf')
+  &rtp = save_rtp
+enddef
+
 def Test_use_import_in_command_completion()
   var lines =<< trim END
       vim9script
index 68b61f48715a131e6d3e9e0cf9127b43b12f51fd..db82785164bec64b839367b58fbbf45626ba7867 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4751,
 /**/
     4750,
 /**/