Patch 8.1.1116
Problem:    Cannot enforce a Vim script style.
Solution:   Add the :scriptversion command. (closes #3857)
Files:      runtime/doc/repeat.txt, runtime/doc/eval.txt, src/eval.c,
            src/ex_cmds.h, src/evalfunc.c, src/ex_cmds2.c,
            src/proto/ex_cmds2.pro, src/structs.h, src/buffer.c, src/main.c,
            src/option.c, src/ex_cmdidxs.h, src/testdir/test_eval_stuff.vim


*** ../vim-8.1.1115/runtime/doc/repeat.txt      2018-11-30 22:40:09.098211991 
+0100
--- runtime/doc/repeat.txt      2019-04-04 16:16:57.187793562 +0200
***************
*** 323,332 ****
                                set encoding=utf-8
                                scriptencoding utf-8
  <
-                       When compiled without the |+multi_byte| feature this
-                       command is ignored.
                        {not in Vi}
  
                                                *:scr* *:scriptnames*
  :scr[iptnames]                List all sourced script names, in the order 
they were
                        first sourced.  The number is used for the script ID
--- 323,341 ----
                                set encoding=utf-8
                                scriptencoding utf-8
  <
                        {not in Vi}
  
+ :scriptv[ersion] {version}            *:scriptv* *:scriptversion*
+                                                               *E999* *E984*
+                       Specify the version of Vim for the lines that follow.
+                       Does not apply to sourced scripts.
+ 
+                       If {version} is higher than what the current Vim
+                       version supports E999 will be given.  You either need
+                       to rewrite the script to make it work with an older
+                       Vim version, or update Vim to a newer version.  See
+                       |vimscript-version| for what changed between versions.
+ 
                                                *:scr* *:scriptnames*
  :scr[iptnames]                List all sourced script names, in the order 
they were
                        first sourced.  The number is used for the script ID
*** ../vim-8.1.1115/runtime/doc/eval.txt        2019-04-04 15:35:42.833132544 
+0200
--- runtime/doc/eval.txt        2019-04-04 18:13:06.835496283 +0200
***************
*** 1024,1029 ****
--- 1038,1044 ----
  
  For String concatenation ".." is preferred, since "." is ambiguous, it is also
  used for |Dict| member access and floating point numbers.
+ When |vimscript-version| is 2 or higher, using "." is not allowed.
  
  expr7 * expr7  Number multiplication                          *expr-star*
  expr7 / expr7  Number division                                        *expr-/*
***************
*** 10418,10444 ****
  vcon                  Win32: Virtual console support is working, can use
                        'termguicolors'. Also see |+vtp|.
  vertsplit             Compiled with vertically split windows |:vsplit|.
  vim_starting          True while initial source'ing takes place. |startup|
                        *vim_starting*
  viminfo                       Compiled with viminfo support.
! virtualedit           Compiled with 'virtualedit' option.
! visual                        Compiled with Visual mode.
! visualextra           Compiled with extra Visual mode commands.
!                       |blockwise-operators|.
  vms                   VMS version of Vim.
! vreplace              Compiled with |gR| and |gr| commands.
  vtp                   Compiled for vcon support |+vtp| (check vcon to find
                        out if it works in the current console).
  wildignore            Compiled with 'wildignore' option.
  wildmenu              Compiled with 'wildmenu' option.
! win16                 old version for MS-Windows 3.1 (always False)
  win32                 Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
  win32unix             Win32 version of Vim, using Unix files (Cygwin)
  win64                 Win64 version of Vim (MS-Windows 64 bit).
! win95                 Win32 version for MS-Windows 95/98/ME (always False)
  winaltkeys            Compiled with 'winaltkeys' option.
  windows                       Compiled with support for more than one window.
  writebackup           Compiled with 'writebackup' default on.
  xfontset              Compiled with X fontset support |xfontset|.
  xim                   Compiled with X input method support |xim|.
--- 10474,10504 ----
  vcon                  Win32: Virtual console support is working, can use
                        'termguicolors'. Also see |+vtp|.
  vertsplit             Compiled with vertically split windows |:vsplit|.
+                       (always true)
  vim_starting          True while initial source'ing takes place. |startup|
                        *vim_starting*
  viminfo                       Compiled with viminfo support.
! vimscript-1           Compiled Vim script version 1 support
! vimscript-2           Compiled Vim script version 2 support
! virtualedit           Compiled with 'virtualedit' option. (always true)
! visual                        Compiled with Visual mode. (always true)
! visualextra           Compiled with extra Visual mode commands. (always
!                       true) |blockwise-operators|.
  vms                   VMS version of Vim.
! vreplace              Compiled with |gR| and |gr| commands. (always true)
  vtp                   Compiled for vcon support |+vtp| (check vcon to find
                        out if it works in the current console).
  wildignore            Compiled with 'wildignore' option.
  wildmenu              Compiled with 'wildmenu' option.
! win16                 old version for MS-Windows 3.1 (always false)
  win32                 Win32 version of Vim (MS-Windows 95 and later, 32 or
                        64 bits)
  win32unix             Win32 version of Vim, using Unix files (Cygwin)
  win64                 Win64 version of Vim (MS-Windows 64 bit).
! win95                 Win32 version for MS-Windows 95/98/ME (always false)
  winaltkeys            Compiled with 'winaltkeys' option.
  windows                       Compiled with support for more than one window.
+                       (always true)
  writebackup           Compiled with 'writebackup' default on.
  xfontset              Compiled with X fontset support |xfontset|.
  xim                   Compiled with X input method support |xim|.
***************
*** 10910,10925 ****
                        When the selected range of items is partly past the
                        end of the list, items will be added.
  
!                                             *:let+=* *:let-=* *:letstar=*
!                                             *:let/=* *:let%=* *:let.=* *E734*
  :let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
  :let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
  :let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
  :let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
  :let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
  :let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
                        These fail if {var} was not set yet and when the type
                        of {var} and {expr1} don't fit the operator.
  
  
  :let ${env-name} = {expr1}                    *:let-environment* *:let-$*
--- 10970,10988 ----
                        When the selected range of items is partly past the
                        end of the list, items will be added.
  
!                       *:let+=* *:let-=* *:letstar=*
!                       *:let/=* *:let%=* *:let.=* *:let..=* *E734* *E985*
  :let {var} += {expr1} Like ":let {var} = {var} + {expr1}".
  :let {var} -= {expr1} Like ":let {var} = {var} - {expr1}".
  :let {var} *= {expr1} Like ":let {var} = {var} * {expr1}".
  :let {var} /= {expr1} Like ":let {var} = {var} / {expr1}".
  :let {var} %= {expr1} Like ":let {var} = {var} % {expr1}".
  :let {var} .= {expr1} Like ":let {var} = {var} . {expr1}".
+ :let {var} ..= {expr1}        Like ":let {var} = {var} .. {expr1}".
                        These fail if {var} was not set yet and when the type
                        of {var} and {expr1} don't fit the operator.
+                       `.=` is not supported with Vim script version 2 and
+                       later, see |vimscript-version|.
  
  
  :let ${env-name} = {expr1}                    *:let-environment* *:let-$*
***************
*** 12547,12553 ****
      unlet scriptnames_output
  
  ==============================================================================
! 10. No +eval feature                          *no-eval-feature*
  
  When the |+eval| feature was disabled at compile time, none of the expression
  evaluation commands are available.  To prevent this from causing Vim scripts
--- 12616,12649 ----
      unlet scriptnames_output
  
  ==============================================================================
! 10. Vim script versions               *vimscript-version* *vimscript-versions*
! 
! Over time many features have been added to Vim script.  This includes Ex
! commands, functions, variable types, etc.  Each individual feature can be
! checked with the |has()| and |exists()| functions.
! 
! Sometimes old syntax of functionality gets in the way of making Vim better.
! When support is taken away this will break older Vim scripts.  To make this
! explicit the |:scriptversion| command can be used.  When a Vim script is not
! compatible with older versions of Vim this will give an explicit error,
! instead of failing in mysterious ways. >
! 
!  :scriptversion 1
! <     This is the original Vim script, same as not using a |:scriptversion|
!       command.  Can be used to go back to old syntax for a range of lines.
!       Test for support with: >
!               has('vimscript-1')
! 
!  :scriptversion 2
! <     String concatenation with "." is not supported, use ".." instead.
!       This avoids the ambiguity using "." for Dict member access and
!       floating point numbers.  Now ".5" means the number 0.5.
!       Test for support with: >
!               has('vimscript-2')
! 
! 
! ==============================================================================
! 11. No +eval feature                          *no-eval-feature*
  
  When the |+eval| feature was disabled at compile time, none of the expression
  evaluation commands are available.  To prevent this from causing Vim scripts
***************
*** 12578,12584 ****
  silently ignored, and the command is executed.
  
  ==============================================================================
! 11. The sandbox                                       *eval-sandbox* 
*sandbox* *E48*
  
  The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
  'foldtext' options may be evaluated in a sandbox.  This means that you are
--- 12674,12680 ----
  silently ignored, and the command is executed.
  
  ==============================================================================
! 12. The sandbox                                       *eval-sandbox* 
*sandbox* *E48*
  
  The 'foldexpr', 'formatexpr', 'includeexpr', 'indentexpr', 'statusline' and
  'foldtext' options may be evaluated in a sandbox.  This means that you are
***************
*** 12611,12622 ****
  - sourcing a .vimrc or .exrc in the current directory
  - while executing in the sandbox
  - value coming from a modeline
  
  Note that when in the sandbox and saving an option value and restoring it, the
  option will still be marked as it was set in the sandbox.
  
  ==============================================================================
! 12. Textlock                                                  *textlock*
  
  In a few situations it is not allowed to change the text in the buffer, jump
  to another window and some other things that might confuse or break what Vim
--- 12707,12719 ----
  - sourcing a .vimrc or .exrc in the current directory
  - while executing in the sandbox
  - value coming from a modeline
+ - executing a function that was defined in the sandbox
  
  Note that when in the sandbox and saving an option value and restoring it, the
  option will still be marked as it was set in the sandbox.
  
  ==============================================================================
! 13. Textlock                                                  *textlock*
  
  In a few situations it is not allowed to change the text in the buffer, jump
  to another window and some other things that might confuse or break what Vim
***************
*** 12632,12638 ****
        - etc.
  
  ==============================================================================
! 13. Testing                                                   *testing*
  
  Vim can be tested after building it, usually with "make test".
  The tests are located in the directory "src/testdir".
--- 12729,12735 ----
        - etc.
  
  ==============================================================================
! 14. Testing                                                   *testing*
  
  Vim can be tested after building it, usually with "make test".
  The tests are located in the directory "src/testdir".
*** ../vim-8.1.1115/src/eval.c  2019-04-04 15:35:42.829132566 +0200
--- src/eval.c  2019-04-04 18:09:27.848677159 +0200
***************
*** 1249,1254 ****
--- 1249,1255 ----
      char_u    op[2];
      char_u    *argend;
      int               first = TRUE;
+     int               concat;
  
      argend = skip_var_list(arg, &var_count, &semicolon);
      if (argend == NULL)
***************
*** 1256,1269 ****
      if (argend > arg && argend[-1] == '.')  // for var.='str'
        --argend;
      expr = skipwhite(argend);
!     if (*expr != '=' && !((vim_strchr((char_u *)"+-*/%.", *expr) != NULL
!                          && expr[1] == '=') || STRNCMP(expr, "..=", 3) == 0))
      {
        /*
         * ":let" without "=": list variables
         */
        if (*arg == '[')
            emsg(_(e_invarg));
        else if (!ends_excmd(*arg))
            /* ":let var1 var2" */
            arg = list_arg_vars(eap, arg, &first);
--- 1257,1275 ----
      if (argend > arg && argend[-1] == '.')  // for var.='str'
        --argend;
      expr = skipwhite(argend);
!     concat = expr[0] == '.'
!       && ((expr[1] == '=' && current_sctx.sc_version < 2)
!               || (expr[1] == '.' && expr[2] == '='));
!     if (*expr != '=' && !((vim_strchr((char_u *)"+-*/%", *expr) != NULL
!                                                && expr[1] == '=') || concat))
      {
        /*
         * ":let" without "=": list variables
         */
        if (*arg == '[')
            emsg(_(e_invarg));
+       else if (expr[0] == '.')
+           emsg(_("E985: .= is not supported with script version 2"));
        else if (!ends_excmd(*arg))
            /* ":let var1 var2" */
            arg = list_arg_vars(eap, arg, &first);
***************
*** 3817,3823 ****
   * Handle fourth level expression:
   *    +       number addition
   *    -       number subtraction
!  *    .       string concatenation
   *    ..      string concatenation
   *
   * "arg" must point to the first non-white of the expression.
--- 3823,3829 ----
   * Handle fourth level expression:
   *    +       number addition
   *    -       number subtraction
!  *    .       string concatenation (if script version is 1)
   *    ..      string concatenation
   *
   * "arg" must point to the first non-white of the expression.
***************
*** 3838,3843 ****
--- 3844,3850 ----
      char_u    *s1, *s2;
      char_u    buf1[NUMBUFLEN], buf2[NUMBUFLEN];
      char_u    *p;
+     int               concat;
  
      /*
       * Get the first variable.
***************
*** 3850,3857 ****
       */
      for (;;)
      {
        op = **arg;
!       if (op != '+' && op != '-' && op != '.')
            break;
  
        if ((op != '+' || (rettv->v_type != VAR_LIST
--- 3857,3867 ----
       */
      for (;;)
      {
+       // "." is only string concatenation when scriptversion is 1
        op = **arg;
!       concat = op == '.'
!                       && (*(*arg + 1) == '.' || current_sctx.sc_version < 2);
!       if (op != '+' && op != '-' && !concat)
            break;
  
        if ((op != '+' || (rettv->v_type != VAR_LIST
***************
*** 4224,4229 ****
--- 4234,4250 ----
        *arg = skipwhite(*arg + 1);
      end_leader = *arg;
  
+     if (**arg == '.' && (!isdigit(*(*arg + 1))
+ #ifdef FEAT_FLOAT
+           || current_sctx.sc_version < 2
+ #endif
+           ))
+     {
+       semsg(_(e_invexpr2), *arg);
+       ++*arg;
+       return FAIL;
+     }
+ 
      switch (**arg)
      {
      /*
***************
*** 4239,4254 ****
      case '7':
      case '8':
      case '9':
        {
  #ifdef FEAT_FLOAT
!               char_u *p = skipdigits(*arg + 1);
                int    get_float = FALSE;
  
                /* We accept a float when the format matches
                 * "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?".  This is very
                 * strict to avoid backwards compatibility problems.
                 * Don't look for a float after the "." operator, so that
                 * ":let vers = 1.2.3" doesn't fail. */
                if (!want_string && p[0] == '.' && vim_isdigit(p[1]))
                {
                    get_float = TRUE;
--- 4260,4282 ----
      case '7':
      case '8':
      case '9':
+     case '.':
        {
  #ifdef FEAT_FLOAT
!               char_u *p;
                int    get_float = FALSE;
  
                /* We accept a float when the format matches
                 * "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?".  This is very
                 * strict to avoid backwards compatibility problems.
+                * With script version 2 and later the leading digit can be
+                * omitted.
                 * Don't look for a float after the "." operator, so that
                 * ":let vers = 1.2.3" doesn't fail. */
+               if (**arg == '.')
+                   p = *arg;
+               else
+                   p = skipdigits(*arg + 1);
                if (!want_string && p[0] == '.' && vim_isdigit(p[1]))
                {
                    get_float = TRUE;
*** ../vim-8.1.1115/src/ex_cmds.h       2019-02-08 16:50:22.786660536 +0100
--- src/ex_cmds.h       2019-04-04 16:14:40.560510525 +0200
***************
*** 1269,1274 ****
--- 1269,1277 ----
  EX(CMD_scriptencoding,        "scriptencoding", ex_scriptencoding,
                        WORD1|TRLBAR|CMDWIN,
                        ADDR_LINES),
+ EX(CMD_scriptversion, "scriptversion", ex_scriptversion,
+                       WORD1|TRLBAR|CMDWIN,
+                       ADDR_LINES),
  EX(CMD_scscope,               "scscope",      ex_scscope,
                        EXTRA|NOTRLCOM,
                        ADDR_LINES),
*** ../vim-8.1.1115/src/evalfunc.c      2019-04-04 13:44:31.031594540 +0200
--- src/evalfunc.c      2019-04-04 15:50:54.400014083 +0200
***************
*** 6631,6640 ****
  #ifdef FEAT_VARTABS
        "vartabs",
  #endif
  #ifdef FEAT_VIMINFO
        "viminfo",
  #endif
!       "vertsplit",
        "virtualedit",
        "visual",
        "visualextra",
--- 6631,6642 ----
  #ifdef FEAT_VARTABS
        "vartabs",
  #endif
+       "vertsplit",
  #ifdef FEAT_VIMINFO
        "viminfo",
  #endif
!       "vimscript-1",
!       "vimscript-2",
        "virtualedit",
        "visual",
        "visualextra",
*** ../vim-8.1.1115/src/ex_cmds2.c      2019-03-02 10:13:36.792974862 +0100
--- src/ex_cmds2.c      2019-04-04 16:46:05.875239523 +0200
***************
*** 2321,2327 ****
            else
  #endif
            /* Try auto-writing the buffer.  If this fails but the buffer no
!           * longer exists it's not changed, that's OK. */
            if (check_changed(buf, (p_awa ? CCGD_AW : 0)
                                 | CCGD_MULTWIN
                                 | CCGD_ALLBUF) && bufref_valid(&bufref))
--- 2321,2327 ----
            else
  #endif
            /* Try auto-writing the buffer.  If this fails but the buffer no
!            * longer exists it's not changed, that's OK. */
            if (check_changed(buf, (p_awa ? CCGD_AW : 0)
                                 | CCGD_MULTWIN
                                 | CCGD_ALLBUF) && bufref_valid(&bufref))
***************
*** 4501,4512 ****
       * Also starts profiling timer for nested script. */
      save_funccal(&funccalp_entry);
  
      // Check if this script was sourced before to finds its SID.
      // If it's new, generate a new SID.
      // Always use a new sequence number.
-     save_current_sctx = current_sctx;
      current_sctx.sc_seq = ++last_current_SID_seq;
-     current_sctx.sc_lnum = 0;
  # ifdef UNIX
      stat_ok = (mch_stat((char *)fname_exp, &st) >= 0);
  # endif
--- 4501,4514 ----
       * Also starts profiling timer for nested script. */
      save_funccal(&funccalp_entry);
  
+     save_current_sctx = current_sctx;
+     current_sctx.sc_lnum = 0;
+     current_sctx.sc_version = 1;
+ 
      // Check if this script was sourced before to finds its SID.
      // If it's new, generate a new SID.
      // Always use a new sequence number.
      current_sctx.sc_seq = ++last_current_SID_seq;
  # ifdef UNIX
      stat_ok = (mch_stat((char *)fname_exp, &st) >= 0);
  # endif
***************
*** 5077,5086 ****
  
  /*
   * ":scriptencoding": Set encoding conversion for a sourced script.
-  * Without the multi-byte feature it's simply ignored.
   */
      void
! ex_scriptencoding(exarg_T *eap UNUSED)
  {
      struct source_cookie      *sp;
      char_u                    *name;
--- 5079,5087 ----
  
  /*
   * ":scriptencoding": Set encoding conversion for a sourced script.
   */
      void
! ex_scriptencoding(exarg_T *eap)
  {
      struct source_cookie      *sp;
      char_u                    *name;
***************
*** 5108,5113 ****
--- 5109,5137 ----
        vim_free(name);
  }
  
+ /*
+  * ":scriptversion": Set Vim script version for a sourced script.
+  */
+     void
+ ex_scriptversion(exarg_T *eap UNUSED)
+ {
+     int               nr;
+ 
+     if (!getline_equal(eap->getline, eap->cookie, getsourceline))
+     {
+       emsg(_("E984: :scriptversion used outside of a sourced file"));
+       return;
+     }
+ 
+     nr = getdigits(&eap->arg);
+     if (nr == 0 || *eap->arg != NUL)
+       emsg(_(e_invarg));
+     else if (nr > 2)
+       semsg(_("E999: scriptversion not supported: %d"), nr);
+     else
+       current_sctx.sc_version = nr;
+ }
+ 
  #if defined(FEAT_EVAL) || defined(PROTO)
  /*
   * ":finish": Mark a sourced file as finished.
*** ../vim-8.1.1115/src/proto/ex_cmds2.pro      2019-02-15 21:06:05.342289715 
+0100
--- src/proto/ex_cmds2.pro      2019-04-04 16:32:19.198927017 +0200
***************
*** 98,103 ****
--- 98,104 ----
  void script_line_exec(void);
  void script_line_end(void);
  void ex_scriptencoding(exarg_T *eap);
+ void ex_scriptversion(exarg_T *eap);
  void ex_finish(exarg_T *eap);
  void do_finish(exarg_T *eap, int reanimate);
  int source_finished(char_u *(*fgetline)(int, void *, int), void *cookie);
*** ../vim-8.1.1115/src/structs.h       2019-03-30 13:53:26.174425093 +0100
--- src/structs.h       2019-04-04 16:24:11.821503583 +0200
***************
*** 79,84 ****
--- 79,85 ----
      scid_T    sc_sid;         // script ID
      int               sc_seq;         // sourcing sequence number
      linenr_T  sc_lnum;        // line number
+     int               sc_version;     // :scriptversion
  } sctx_T;
  
  /*
*** ../vim-8.1.1115/src/buffer.c        2019-03-30 18:46:57.340077448 +0100
--- src/buffer.c        2019-04-04 16:25:06.765213438 +0200
***************
*** 5493,5498 ****
--- 5493,5499 ----
                current_sctx.sc_sid = SID_MODELINE;
                current_sctx.sc_seq = 0;
                current_sctx.sc_lnum = 0;
+               current_sctx.sc_version = 1;
  #endif
                // Make sure no risky things are executed as a side effect.
                secure = 1;
*** ../vim-8.1.1115/src/main.c  2019-04-03 20:30:56.085017544 +0200
--- src/main.c  2019-04-04 16:29:16.515893423 +0200
***************
*** 3166,3171 ****
--- 3166,3172 ----
        current_sctx.sc_sid = SID_ENV;
        current_sctx.sc_seq = 0;
        current_sctx.sc_lnum = 0;
+       current_sctx.sc_version = 1;
  #endif
        do_cmdline_cmd(initstr);
        sourcing_name = save_sourcing_name;
*** ../vim-8.1.1115/src/option.c        2019-03-30 18:46:57.360077328 +0100
--- src/option.c        2019-04-04 16:33:07.574671018 +0200
***************
*** 407,413 ****
      char_u    *def_val[2];    // default values for variable (vi and vim)
  #ifdef FEAT_EVAL
      sctx_T    script_ctx;     // script context where the option was last set
! # define SCTX_INIT , {0, 0, 0}
  #else
  # define SCTX_INIT
  #endif
--- 407,413 ----
      char_u    *def_val[2];    // default values for variable (vi and vim)
  #ifdef FEAT_EVAL
      sctx_T    script_ctx;     // script context where the option was last set
! # define SCTX_INIT , {0, 0, 0, 1}
  #else
  # define SCTX_INIT
  #endif
***************
*** 5911,5916 ****
--- 5911,5917 ----
                script_ctx.sc_sid = set_sid;
                script_ctx.sc_seq = 0;
                script_ctx.sc_lnum = 0;
+               script_ctx.sc_version = 1;
            }
            set_option_sctx_idx(idx, opt_flags, script_ctx);
        }
*** ../vim-8.1.1115/src/ex_cmdidxs.h    2019-01-17 15:43:21.765878343 +0100
--- src/ex_cmdidxs.h    2019-04-04 16:33:38.390507927 +0200
***************
*** 24,36 ****
    /* q */ 348,
    /* r */ 351,
    /* s */ 371,
!   /* t */ 438,
!   /* u */ 481,
!   /* v */ 492,
!   /* w */ 510,
!   /* x */ 524,
!   /* y */ 533,
!   /* z */ 534
  };
  
  /*
--- 24,36 ----
    /* q */ 348,
    /* r */ 351,
    /* s */ 371,
!   /* t */ 439,
!   /* u */ 482,
!   /* v */ 493,
!   /* w */ 511,
!   /* x */ 525,
!   /* y */ 534,
!   /* z */ 535
  };
  
  /*
***************
*** 59,65 ****
    /* p */ {  1,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  9,  
0,  0, 16, 17, 26,  0, 27,  0, 28,  0 },
    /* q */ {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* r */ {  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0, 14, 19,  0,  0,  0,  0 },
!   /* s */ {  2,  6, 15,  0, 18, 22,  0, 24, 25,  0,  0, 28, 30, 34, 38, 40,  
0, 48,  0, 49,  0, 61, 62,  0, 63,  0 },
    /* t */ {  2,  0, 19,  0, 22, 24,  0, 25,  0, 26,  0, 27, 31, 34, 36, 37,  
0, 38, 40,  0, 41,  0,  0,  0,  0,  0 },
    /* u */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* v */ {  0,  0,  0,  0,  1,  0,  0,  0,  4,  0,  0,  0,  9, 12,  0,  0,  
0,  0, 15,  0, 16,  0,  0,  0,  0,  0 },
--- 59,65 ----
    /* p */ {  1,  0,  3,  0,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  7,  9,  
0,  0, 16, 17, 26,  0, 27,  0, 28,  0 },
    /* q */ {  2,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* r */ {  0,  0,  0,  0,  0,  0,  0,  0, 12,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0, 14, 19,  0,  0,  0,  0 },
!   /* s */ {  2,  6, 15,  0, 19, 23,  0, 25, 26,  0,  0, 29, 31, 35, 39, 41,  
0, 49,  0, 50,  0, 62, 63,  0, 64,  0 },
    /* t */ {  2,  0, 19,  0, 22, 24,  0, 25,  0, 26,  0, 27, 31, 34, 36, 37,  
0, 38, 40,  0, 41,  0,  0,  0,  0,  0 },
    /* u */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 10,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 },
    /* v */ {  0,  0,  0,  0,  1,  0,  0,  0,  4,  0,  0,  0,  9, 12,  0,  0,  
0,  0, 15,  0, 16,  0,  0,  0,  0,  0 },
***************
*** 69,72 ****
    /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
  };
  
! static const int command_count = 547;
--- 69,72 ----
    /* z */ {  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  
0,  0,  0,  0,  0,  0,  0,  0,  0,  0 }
  };
  
! static const int command_count = 548;
*** ../vim-8.1.1115/src/testdir/test_eval_stuff.vim     2019-04-04 
15:35:42.829132566 +0200
--- src/testdir/test_eval_stuff.vim     2019-04-04 17:32:12.165223462 +0200
***************
*** 123,125 ****
--- 123,161 ----
    let a..=b
    call assert_equal('ab', a)
  endfunc
+ 
+ scriptversion 2
+ func Test_string_concat_scriptversion2()
+   let a = 'a'
+   let b = 'b'
+ 
+   call assert_fails('echo a . b', 'E15:')
+   call assert_fails('let a .= b', 'E985:')
+   call assert_fails('let vers = 1.2.3', 'E15:')
+ 
+   if has('float')
+     let f = .5
+     call assert_equal(0.5, f)
+   endif
+ endfunc
+ 
+ scriptversion 1
+ func Test_string_concat_scriptversion1()
+   let a = 'a'
+   let b = 'b'
+ 
+   echo a . b
+   let a .= b
+   let vers = 1.2.3
+   call assert_equal('123', vers)
+ 
+   if has('float')
+     call assert_fails('let f = .5', 'E15:')
+   endif
+ endfunc
+ 
+ func Test_scriptversion()
+   call writefile(['scriptversion 9'], 'Xversionscript')
+   call assert_fails('source Xversionscript', 'E999:')
+   call delete('Xversionscript')
+ endfunc
*** ../vim-8.1.1115/src/version.c       2019-04-04 15:40:53.011337945 +0200
--- src/version.c       2019-04-04 15:49:17.156543611 +0200
***************
*** 773,774 ****
--- 773,776 ----
  {   /* Add new patch number below this line */
+ /**/
+     1116,
  /**/

-- 
Some of the well known MS-Windows errors:
        ESLEEP          Operator fell asleep
        ENOERR          No error yet
        EDOLLAR         OS too expensive
        EWINDOWS        MS-Windows loaded, system in danger

 /// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui