Patch 7.4.064
Problem:    When replacing a character in Visual block mode, entering a CR
            does not cause a repeated line break.
Solution:   Recognize the situation and repeat the line break. (Christian
            Brabandt)
Files:      src/normal.c, src/ops.c, src/testdir/test39.in,
            src/testdir/test39.ok


*** ../vim-7.4.063/src/normal.c 2013-09-25 18:54:20.000000000 +0200
--- src/normal.c        2013-11-04 01:14:53.000000000 +0100
***************
*** 7036,7041 ****
--- 7036,7048 ----
      {
        if (got_int)
            reset_VIsual();
+       if (had_ctrl_v)
+       {
+           if (cap->nchar == '\r')
+               cap->nchar = -1;
+           else if (cap->nchar == '\n')
+               cap->nchar = -2;
+       }
        nv_operator(cap);
        return;
      }
*** ../vim-7.4.063/src/ops.c    2013-11-02 23:59:30.000000000 +0100
--- src/ops.c   2013-11-04 01:28:54.000000000 +0100
***************
*** 2074,2083 ****
--- 2074,2088 ----
      char_u            *newp, *oldp;
      size_t            oldlen;
      struct block_def  bd;
+     char_u            *after_p = NULL;
+     int                       had_ctrl_v_cr = (c == -1 || c == -2);
  
      if ((curbuf->b_ml.ml_flags & ML_EMPTY ) || oap->empty)
        return OK;          /* nothing to do */
  
+     if (had_ctrl_v_cr)
+       c = (c == -1 ? '\r' : '\n');
+ 
  #ifdef FEAT_MBYTE
      if (has_mbyte)
        mb_adjust_opend(oap);
***************
*** 2164,2188 ****
            /* insert pre-spaces */
            copy_spaces(newp + bd.textcol, (size_t)bd.startspaces);
            /* insert replacement chars CHECK FOR ALLOCATED SPACE */
! #ifdef FEAT_MBYTE
!           if (has_mbyte)
            {
!               n = (int)STRLEN(newp);
!               while (--num_chars >= 0)
!                   n += (*mb_char2bytes)(c, newp + n);
            }
            else
- #endif
-               copy_chars(newp + STRLEN(newp), (size_t)numc, c);
-           if (!bd.is_short)
            {
!               /* insert post-spaces */
!               copy_spaces(newp + STRLEN(newp), (size_t)bd.endspaces);
!               /* copy the part after the changed part */
!               STRMOVE(newp + STRLEN(newp), oldp);
            }
            /* replace the line */
            ml_replace(curwin->w_cursor.lnum, newp, FALSE);
        }
      }
      else
--- 2169,2211 ----
            /* insert pre-spaces */
            copy_spaces(newp + bd.textcol, (size_t)bd.startspaces);
            /* insert replacement chars CHECK FOR ALLOCATED SPACE */
!           /* -1/-2 is used for entering CR literally. */
!           if (had_ctrl_v_cr || (c != '\r' && c != '\n'))
            {
! #ifdef FEAT_MBYTE
!               if (has_mbyte)
!               {
!                   n = (int)STRLEN(newp);
!                   while (--num_chars >= 0)
!                       n += (*mb_char2bytes)(c, newp + n);
!               }
!               else
! #endif
!                   copy_chars(newp + STRLEN(newp), (size_t)numc, c);
!               if (!bd.is_short)
!               {
!                   /* insert post-spaces */
!                   copy_spaces(newp + STRLEN(newp), (size_t)bd.endspaces);
!                   /* copy the part after the changed part */
!                   STRMOVE(newp + STRLEN(newp), oldp);
!               }
            }
            else
            {
!               /* Replacing with \r or \n means splitting the line. */
!               after_p = alloc_check((unsigned)oldlen + 1 + n - STRLEN(newp));
!               if (after_p != NULL)
!                   STRMOVE(after_p, oldp);
            }
            /* replace the line */
            ml_replace(curwin->w_cursor.lnum, newp, FALSE);
+           if (after_p != NULL)
+           {
+               ml_append(curwin->w_cursor.lnum++, after_p, 0, FALSE);
+               appended_lines_mark(curwin->w_cursor.lnum, 1L);
+               oap->end.lnum++;
+               vim_free(after_p);
+           }
        }
      }
      else
*** ../vim-7.4.063/src/testdir/test39.in        2013-03-07 18:30:38.000000000 
+0100
--- src/testdir/test39.in       2013-11-04 01:36:34.000000000 +0100
***************
*** 32,37 ****
--- 32,41 ----
  doh dut VkUj
  :" Uppercase part of two lines
  ddppi333 k0i222 fyllvjfuUk
+ :" visual replace using Enter or NL
+ G3o123456789 2k05l 2jr
G3o98765 2k02l 2jr 
+ G3o123456789 2k05l 2jr
+ G3o98765 2k02l 2jr 
  :/^the/,$w >> test.out
  :qa!
  ENDTEST
*** ../vim-7.4.063/src/testdir/test39.ok        2013-03-07 18:28:51.000000000 
+0100
--- src/testdir/test39.ok       2013-11-04 01:37:12.000000000 +0100
***************
*** 11,13 ****
--- 11,31 ----
  DOH DUT
  222the yoUTUSSEUU END
  333THE YOUTUßeuu end
+ 12345
+ 789
+ 12345
+ 789
+ 12345
+ 789
+ 98
65
+ 98
65
+ 98
65
+ 12345
+ 789
+ 12345
+ 789
+ 12345
+ 789
+ 98

-- 
-- 
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/groups/opt_out.

Raspunde prin e-mail lui