Patch 8.2.1035
Problem:    setreg() does not always clear the register.
Solution:   Clear the register if the dict argument is empty. (Andy Massimino,
            closes #3370)
Files:      src/evalfunc.c, src/testdir/test_registers.vim


*** ../vim-8.2.1034/src/evalfunc.c      2020-06-18 18:45:46.001900050 +0200
--- src/evalfunc.c      2020-06-22 19:08:18.058329319 +0200
***************
*** 6002,6012 ****
  f_test_srand_seed(typval_T *argvars, typval_T *rettv UNUSED)
  {
      if (argvars[0].v_type == VAR_UNKNOWN)
!         srand_seed_for_testing_is_used = FALSE;
      else
      {
!         srand_seed_for_testing = (UINT32_T)tv_get_number(&argvars[0]);
!         srand_seed_for_testing_is_used = TRUE;
      }
  }
  
--- 6002,6012 ----
  f_test_srand_seed(typval_T *argvars, typval_T *rettv UNUSED)
  {
      if (argvars[0].v_type == VAR_UNKNOWN)
!       srand_seed_for_testing_is_used = FALSE;
      else
      {
!       srand_seed_for_testing = (UINT32_T)tv_get_number(&argvars[0]);
!       srand_seed_for_testing_is_used = TRUE;
      }
  }
  
***************
*** 6019,6025 ****
  
      if (srand_seed_for_testing_is_used)
      {
!         *x = srand_seed_for_testing;
        return;
      }
  #ifndef MSWIN
--- 6019,6025 ----
  
      if (srand_seed_for_testing_is_used)
      {
!       *x = srand_seed_for_testing;
        return;
      }
  #ifndef MSWIN
***************
*** 7269,7274 ****
--- 7269,7305 ----
  }
  
  /*
+  * Translate a register type string to the yank type and block length
+  */
+     static int
+ get_yank_type(char_u **pp, char_u *yank_type, long *block_len)
+ {
+     char_u *stropt = *pp;
+     switch (*stropt)
+     {
+       case 'v': case 'c':     // character-wise selection
+           *yank_type = MCHAR;
+           break;
+       case 'V': case 'l':     // line-wise selection
+           *yank_type = MLINE;
+           break;
+       case 'b': case Ctrl_V:  // block-wise selection
+           *yank_type = MBLOCK;
+           if (VIM_ISDIGIT(stropt[1]))
+           {
+               ++stropt;
+               *block_len = getdigits(&stropt) - 1;
+               --stropt;
+           }
+           break;
+       default:
+           return FAIL;
+     }
+     *pp = stropt;
+     return OK;
+ }
+ 
+ /*
   * "setreg()" function
   */
      static void
***************
*** 7302,7331 ****
      if (argvars[1].v_type == VAR_DICT)
      {
        dict_T      *d = argvars[1].vval.v_dict;
!       dictitem_T  *di = dict_find(d, (char_u *)"regcontents", -1);
        if (di != NULL)
            regcontents = &di->di_tv;
  
        stropt = dict_get_string(d, (char_u *)"regtype", FALSE);
        if (stropt != NULL)
!           switch (*stropt)
            {
!               case 'v':               // character-wise selection
!                   yank_type = MCHAR;
!                   break;
!               case 'V':               // line-wise selection
!                   yank_type = MLINE;
!                   break;
!               case Ctrl_V:            // block-wise selection
!                   yank_type = MBLOCK;
!                   if (VIM_ISDIGIT(stropt[1]))
!                   {
!                       ++stropt;
!                       block_len = getdigits(&stropt) - 1;
!                       --stropt;
!                   }
!                   break;
            }
  
        if (regname == '"')
        {
--- 7333,7363 ----
      if (argvars[1].v_type == VAR_DICT)
      {
        dict_T      *d = argvars[1].vval.v_dict;
!       dictitem_T  *di;
! 
!       if (d == NULL || d->dv_hashtab.ht_used == 0)
!       {
!           // Empty dict, clear the register (like setreg(0, []))
!           char_u *lstval[2] = {NULL, NULL};
!           write_reg_contents_lst(regname, lstval, 0, FALSE, MAUTO, -1);
!           return;
!       }
! 
!       di = dict_find(d, (char_u *)"regcontents", -1);
        if (di != NULL)
            regcontents = &di->di_tv;
  
        stropt = dict_get_string(d, (char_u *)"regtype", FALSE);
        if (stropt != NULL)
!       {
!           int ret = get_yank_type(&stropt, &yank_type, &block_len);
! 
!           if (ret == FAIL || *++stropt != NUL)
            {
!               semsg(_(e_invargval), "value");
!               return;
            }
+       }
  
        if (regname == '"')
        {
***************
*** 7344,7349 ****
--- 7376,7387 ----
  
      if (argvars[2].v_type != VAR_UNKNOWN)
      {
+       if (yank_type != MAUTO)
+       {
+           semsg(_(e_toomanyarg), "setreg");
+           return;
+       }
+ 
        stropt = tv_get_string_chk(&argvars[2]);
        if (stropt == NULL)
            return;             // type error
***************
*** 7353,7373 ****
                case 'a': case 'A':     // append
                    append = TRUE;
                    break;
!               case 'v': case 'c':     // character-wise selection
!                   yank_type = MCHAR;
!                   break;
!               case 'V': case 'l':     // line-wise selection
!                   yank_type = MLINE;
!                   break;
!               case 'b': case Ctrl_V:  // block-wise selection
!                   yank_type = MBLOCK;
!                   if (VIM_ISDIGIT(stropt[1]))
!                   {
!                       ++stropt;
!                       block_len = getdigits(&stropt) - 1;
!                       --stropt;
!                   }
!                   break;
            }
      }
  
--- 7391,7398 ----
                case 'a': case 'A':     // append
                    append = TRUE;
                    break;
!               default:
!                   get_yank_type(&stropt, &yank_type, &block_len);
            }
      }
  
*** ../vim-8.2.1034/src/testdir/test_registers.vim      2020-06-17 
21:47:19.912798036 +0200
--- src/testdir/test_registers.vim      2020-06-22 19:04:22.959291681 +0200
***************
*** 485,490 ****
--- 485,498 ----
    call assert_equal(['six'], getreginfo('0').regcontents)
    call assert_equal(['six'], getreginfo('"').regcontents)
  
+   let @x = 'one'
+   call setreg('x', {})
+   call assert_equal(1, len(split(execute('reg x'), '\n')))
+ 
+   call assert_fails("call setreg('0', #{regtype: 'V'}, 'v')", 'E118:')
+   call assert_fails("call setreg('0', #{regtype: 'X'})", 'E475:')
+   call assert_fails("call setreg('0', #{regtype: 'vy'})", 'E475:')
+ 
    bwipe!
  endfunc
  
*** ../vim-8.2.1034/src/version.c       2020-06-21 22:17:15.060232625 +0200
--- src/version.c       2020-06-22 19:06:25.962773200 +0200
***************
*** 756,757 ****
--- 756,759 ----
  {   /* Add new patch number below this line */
+ /**/
+     1035,
  /**/

-- 
Shaw's Principle: Build a system that even a fool can use, and
only a fool will want to use it.

 /// 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].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/202006221711.05MHBUkr1439448%40masaka.moolenaar.net.

Raspunde prin e-mail lui