| To: vim-dev@vim.org |
| Subject: Patch 7.1.185 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=ISO-8859-1 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.1.185 |
| Problem: Using "gR" with a multi-byte encoding and typing a CR pushes |
| characters onto the replace stack incorrectly, resulting in BS |
| putting back the wrong characters. (Paul B. Mahol) |
| Solution: Push multi-byte characters onto the replace stack in reverse byte |
| order. Add replace_push_mb(). |
| Files: src/edit.c, src/misc1.c, src/proto/edit.pro |
| |
| |
| |
| |
| |
| *** 6939,6944 **** |
| --- 6939,6963 ---- |
| ++replace_stack_nr; |
| } |
| |
| + #if defined(FEAT_MBYTE) || defined(PROTO) |
| + /* |
| + * Push a character onto the replace stack. Handles a multi-byte character in |
| + * reverse byte order, so that the first byte is popped off first. |
| + * Return the number of bytes done (includes composing characters). |
| + */ |
| + int |
| + replace_push_mb(p) |
| + char_u *p; |
| + { |
| + int l = (*mb_ptr2len)(p); |
| + int j; |
| + |
| + for (j = l - 1; j >= 0; --j) |
| + replace_push(p[j]); |
| + return l; |
| + } |
| + #endif |
| + |
| #if 0 |
| /* |
| * call replace_push(c) with replace_offset set to the first NUL. |
| |
| |
| |
| *** 591,597 **** |
| replace_push(NUL); |
| p = saved_line + curwin->w_cursor.col; |
| while (*p != NUL) |
| ! replace_push(*p++); |
| saved_line[curwin->w_cursor.col] = NUL; |
| } |
| #endif |
| --- 592,605 ---- |
| replace_push(NUL); |
| p = saved_line + curwin->w_cursor.col; |
| while (*p != NUL) |
| ! { |
| ! #ifdef FEAT_MBYTE |
| ! if (has_mbyte) |
| ! p += replace_push_mb(p); |
| ! else |
| ! #endif |
| ! replace_push(*p++); |
| ! } |
| saved_line[curwin->w_cursor.col] = NUL; |
| } |
| #endif |
| |
| *** 1914,1920 **** |
| int charlen; |
| { |
| int c = buf[0]; |
| - int l, j; |
| #endif |
| int newlen; /* nr of bytes inserted */ |
| int oldlen; /* nr of bytes deleted (0 when not replacing) */ |
| --- 1922,1927 ---- |
| |
| *** 2016,2028 **** |
| for (i = 0; i < oldlen; ++i) |
| { |
| #ifdef FEAT_MBYTE |
| ! l = (*mb_ptr2len)(oldp + col + i) - 1; |
| ! for (j = l; j >= 0; --j) |
| ! replace_push(oldp[col + i + j]); |
| ! i += l; |
| ! #else |
| ! replace_push(oldp[col + i]); |
| #endif |
| } |
| } |
| |
| --- 2023,2033 ---- |
| for (i = 0; i < oldlen; ++i) |
| { |
| #ifdef FEAT_MBYTE |
| ! if (has_mbyte) |
| ! i += replace_push_mb(oldp + col + i) - 1; |
| ! else |
| #endif |
| + replace_push(oldp[col + i]); |
| } |
| } |
| |
| |
| |
| |
| *** 32,37 **** |
| --- 32,38 ---- |
| char_u *get_last_insert __ARGS((void)); |
| char_u *get_last_insert_save __ARGS((void)); |
| void replace_push __ARGS((int c)); |
| + int replace_push_mb __ARGS((char_u *p)); |
| void fixthisline __ARGS((int (*get_the_indent)(void))); |
| void fix_indent __ARGS((void)); |
| int in_cinkeys __ARGS((int keytyped, int when, int line_is_empty)); |
| |
| |
| |
| *** 668,669 **** |
| --- 668,671 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 185, |
| /**/ |
| |
| -- |
| Not too long ago, a keyboard was something to make music with... |
| |
| /// 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 /// |