diff --git a/7.1.107 b/7.1.107 new file mode 100644 index 0000000..586219d --- /dev/null +++ b/7.1.107 @@ -0,0 +1,130 @@ +To: vim-dev@vim.org +Subject: patch 7.1.107 +Fcc: outbox +From: Bram Moolenaar +Mime-Version: 1.0 +Content-Type: text/plain; charset=ISO-8859-1 +Content-Transfer-Encoding: 8bit +------------ + +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 -- Bram@Moolenaar.net -- 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 ///