Patch 7.1.107
Problem:    When doing a block selection and using "s" to change the text,
            while triggering auto-indenting, causes the wrong text to be
            repeated in other lines. (Adri Verhoef)
Solution:   Compute the change of indent and compensate for that.
Files:      src/ops.c


*** ../vim-7.1.106/src/ops.c    Thu Jun 28 22:14:28 2007
--- src/ops.c   Thu Aug 30 11:41:10 2007
***************
*** 2477,2483 ****
  
        /*
         * Spaces and tabs in the indent may have changed to other spaces and
!        * tabs.  Get the starting column again and correct the lenght.
         * Don't do this when "$" used, end-of-line will have changed.
         */
        block_prep(oap, &bd2, oap->start.lnum, TRUE);
--- 2477,2483 ----
  
        /*
         * Spaces and tabs in the indent may have changed to other spaces and
!        * tabs.  Get the starting column again and correct the length.
         * Don't do this when "$" used, end-of-line will have changed.
         */
        block_prep(oap, &bd2, oap->start.lnum, TRUE);
***************
*** 2534,2540 ****
  #ifdef FEAT_VISUALEXTRA
      long              offset;
      linenr_T          linenr;
!     long              ins_len, pre_textlen = 0;
      char_u            *firstline;
      char_u            *ins_text, *newp, *oldp;
      struct block_def  bd;
--- 2534,2542 ----
  #ifdef FEAT_VISUALEXTRA
      long              offset;
      linenr_T          linenr;
!     long              ins_len;
!     long              pre_textlen = 0;
!     long              pre_indent = 0;
      char_u            *firstline;
      char_u            *ins_text, *newp, *oldp;
      struct block_def  bd;
***************
*** 2579,2585 ****
                                                    || gchar_cursor() == NUL))
            coladvance_force(getviscol());
  # endif
!       pre_textlen = (long)STRLEN(ml_get(oap->start.lnum));
        bd.textcol = curwin->w_cursor.col;
      }
  #endif
--- 2581,2589 ----
                                                    || gchar_cursor() == NUL))
            coladvance_force(getviscol());
  # endif
!       firstline = ml_get(oap->start.lnum);
!       pre_textlen = (long)STRLEN(firstline);
!       pre_indent = (long)(skipwhite(firstline) - firstline);
        bd.textcol = curwin->w_cursor.col;
      }
  #endif
***************
*** 2598,2610 ****
       */
      if (oap->block_mode && oap->start.lnum != oap->end.lnum)
      {
        firstline = ml_get(oap->start.lnum);
!       /*
!        * Subsequent calls to ml_get() flush the firstline data - take a
!        * copy of the required bit.
!        */
!       if ((ins_len = (long)STRLEN(firstline) - pre_textlen) > 0)
        {
            if ((ins_text = alloc_check((unsigned)(ins_len + 1))) != NULL)
            {
                vim_strncpy(ins_text, firstline + bd.textcol, (size_t)ins_len);
--- 2602,2623 ----
       */
      if (oap->block_mode && oap->start.lnum != oap->end.lnum)
      {
+       /* Auto-indenting may have changed the indent.  If the cursor was past
+        * the indent, exclude that indent change from the inserted text. */
        firstline = ml_get(oap->start.lnum);
!       if (bd.textcol > pre_indent)
!       {
!           long new_indent = (long)(skipwhite(firstline) - firstline);
! 
!           pre_textlen += new_indent - pre_indent;
!           bd.textcol += new_indent - pre_indent;
!       }
! 
!       ins_len = (long)STRLEN(firstline) - pre_textlen;
!       if (ins_len > 0)
        {
+           /* Subsequent calls to ml_get() flush the firstline data - take a
+            * copy of the inserted text.  */
            if ((ins_text = alloc_check((unsigned)(ins_len + 1))) != NULL)
            {
                vim_strncpy(ins_text, firstline + bd.textcol, (size_t)ins_len);
*** ../vim-7.1.106/src/version.c        Thu Sep 13 22:04:30 2007
--- src/version.c       Thu Sep 13 22:38:28 2007
***************
*** 668,669 ****
--- 668,671 ----
  {   /* Add new patch number below this line */
+ /**/
+     107,
  /**/

-- 
Windows
M!uqoms

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Reply via email to