To: vim-dev@vim.org Subject: Patch 6.2.517 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit ------------ Patch 6.2.517 Problem: Using "r*" in Visual mode on multi-byte characters replaces too many characters. In Visual Block mode replacing with a multi-byte character doesn't work. Solution: Adjust the operator end for the difference in byte length of the original and the replaced character. Insert all bytes of a multi-byte character, take care of double-wide characters. Files: src/ops.c *** ../vim-6.2.516/src/ops.c Fri Apr 23 15:19:46 2004 --- src/ops.c Fri Apr 30 17:21:32 2004 *************** *** 1925,1930 **** --- 1925,1933 ---- int c; { int n, numc; + #ifdef FEAT_MBYTE + int num_chars; + #endif char_u *newp, *oldp; size_t oldlen; struct block_def bd; *************** *** 1978,1988 **** #ifdef FEAT_VIRTUALEDIT && !bd.is_oneChar #endif ! && bd.end_char_vcols > 0 ? bd.end_char_vcols - 1 : 0); /* Figure out how many characters to replace. */ numc = oap->end_vcol - oap->start_vcol + 1; if (bd.is_short && (!virtual_op || bd.is_MAX)) numc -= (oap->end_vcol - bd.end_vcol) + 1; /* oldlen includes textlen, so don't double count */ n += numc - bd.textlen; --- 1981,2009 ---- #ifdef FEAT_VIRTUALEDIT && !bd.is_oneChar #endif ! && bd.end_char_vcols > 0) ? bd.end_char_vcols - 1 : 0; /* Figure out how many characters to replace. */ numc = oap->end_vcol - oap->start_vcol + 1; if (bd.is_short && (!virtual_op || bd.is_MAX)) numc -= (oap->end_vcol - bd.end_vcol) + 1; + + #ifdef FEAT_MBYTE + /* A double-wide character can be replaced only up to half the + * times. */ + if ((*mb_char2cells)(c) > 1) + { + if ((numc & 1) && !bd.is_short) + { + ++bd.endspaces; + ++n; + } + numc = numc / 2; + } + + /* Compute bytes needed, move character count to num_chars. */ + num_chars = numc; + numc *= (*mb_char2len)(c); + #endif /* oldlen includes textlen, so don't double count */ n += numc - bd.textlen; *************** *** 1998,2004 **** /* insert pre-spaces */ copy_spaces(newp + bd.textcol, (size_t)bd.startspaces); /* insert replacement chars CHECK FOR ALLOCATED SPACE */ ! copy_chars(newp + STRLEN(newp), (size_t)numc, c); if (!bd.is_short) { /* insert post-spaces */ --- 2019,2034 ---- /* 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 = 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 */ *************** *** 2036,2041 **** --- 2066,2072 ---- { /* This is slow, but it handles replacing a single-byte * with a multi-byte and the other way around. */ + oap->end.col += (*mb_char2len)(c) - (*mb_char2len)(n); n = State; State = REPLACE; ins_char(c); *** ../vim-6.2.516/src/version.c Thu Apr 29 16:36:50 2004 --- src/version.c Fri Apr 30 19:38:27 2004 *************** *** 639,640 **** --- 639,642 ---- { /* Add new patch number below this line */ + /**/ + 517, /**/ -- hundred-and-one symptoms of being an internet addict: 80. At parties, you introduce your spouse as your "service provider." /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ Project leader for A-A-P -- http://www.A-A-P.org /// \\\ Buy at Amazon and help AIDS victims -- http://ICCF.nl/click1.html ///