Patch 8.2.4751 (after 8.2.4748)
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)
Files:      src/term.c, src/testdir/test_vim9_import.vim


*** ../vim-8.2.4750/src/term.c  2022-04-14 12:58:19.604895030 +0100
--- src/term.c  2022-04-14 21:31:43.251573747 +0100
***************
*** 5963,5986 ****
      int               do_special;     // recognize <> key codes
      int               do_key_code;    // recognize raw key codes
      char_u    *result;        // buffer for resulting string
  
      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);
  
      /*
       * Allocate space for the translation.  Worst case a single character is
       * replaced by 6 bytes (shifted special key), plus a NUL at the end.
       */
!     result = alloc(STRLEN(from) * 6 + 1);
!     if (result == NULL)               // out of memory
      {
        *bufp = NULL;
        return from;
      }
! 
!     src = from;
  
      /*
       * Check for #n at start only: function key n
--- 5963,5988 ----
      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.
       */
!     ga_init2(&ga, 1L, 100);
!     if (ga_grow(&ga, STRLEN(src) * 6 + 1) == FAIL) // out of memory
      {
        *bufp = NULL;
        return from;
      }
!     result = ga.ga_data;
  
      /*
       * Check for #n at start only: function key n
***************
*** 6033,6040 ****
  
                        if (imp != NULL)
                        {
!                           sid = imp->imp_sid;
                            src = dot + 1;
                        }
                    }
  
--- 6035,6062 ----
  
                        if (imp != NULL)
                        {
!                           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,6054 ****
                }
            }
  #endif
- 
            slen = trans_special(&src, result + dlen, FSK_KEYCODE
                          | ((flags & REPTERM_NO_SIMPLIFY) ? 0 : FSK_SIMPLIFY),
                                                                 did_simplify);
--- 6070,6075 ----
*** ../vim-8.2.4750/src/testdir/test_vim9_import.vim    2022-04-14 
12:58:19.604895030 +0100
--- src/testdir/test_vim9_import.vim    2022-04-14 21:29:14.647771265 +0100
***************
*** 669,698 ****
    nunmap <F4>
  enddef
  
! def Test_use_autoload_import_in_mapping()
    var lines =<< trim END
        vim9script
        export def Func()
          g:result = 42
        enddef
    END
!   writefile(lines, 'XautoloadExport.vim')
    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: .*XautoloadExport.vim', 
execute('scriptnames')->split("\n")[-1])
    feedkeys("\<F3>", "xt")
    assert_equal(42, g:result)
  
    unlet g:result
!   delete('XautoloadExport.vim')
    delete('Xmapscript.vim')
    nunmap <F3>
  enddef
  
  def Test_use_import_in_command_completion()
--- 669,729 ----
    nunmap <F4>
  enddef
  
! def Test_use_relative_autoload_import_in_mapping()
    var lines =<< trim END
        vim9script
        export def Func()
          g:result = 42
        enddef
    END
!   writefile(lines, 'XrelautoloadExport.vim')
    lines =<< trim END
        vim9script
!       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: .*XrelautoloadExport.vim', 
execute('scriptnames')->split("\n")[-1])
    feedkeys("\<F3>", "xt")
    assert_equal(42, g:result)
  
    unlet g:result
!   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()
*** ../vim-8.2.4750/src/version.c       2022-04-14 20:43:52.642894547 +0100
--- src/version.c       2022-04-14 21:35:15.763284028 +0100
***************
*** 748,749 ****
--- 748,751 ----
  {   /* Add new patch number below this line */
+ /**/
+     4751,
  /**/

-- 
While it's true that many normal people whould prefer not to _date_ an
engineer, most normal people harbor an intense desire to _mate_ with them,
thus producing engineerlike children who will have high-paying jobs long
before losing their virginity.
                                (Scott Adams - The Dilbert principle)

 /// 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/20220415122022.2BA531C05DA%40moolenaar.net.

Raspunde prin e-mail lui