To: vim-dev@vim.org Subject: Patch 5.6.087 Fcc: outbox From: Bram Moolenaar ------------ Patch 5.6.087 Problem: Multi-byte: Commands and messages with multi-byte characters are displayed wrong. Solution: Detect double-byte characters. (Yasuhiro Matsumoto) Files: src/ex_getln.c, src/message.c, src/misc2.c, src/screen.c *** ../vim-5.6.86/src/ex_getln.c Mon Apr 3 21:11:13 2000 --- src/ex_getln.c Mon Jun 5 12:35:31 2000 *************** *** 1352,1357 **** --- 1352,1363 ---- else #endif c = charsize(ccline.cmdbuff[i]); + #ifdef MULTI_BYTE + /* multibyte wrap */ + if (is_dbcs && IsLeadByte(ccline.cmdbuff[i]) + && (ccline.cmdspos % Columns + c == Columns)) + ccline.cmdspos++; + #endif /* If the cmdline doesn't fit, put cursor on last visible char. */ if ((ccline.cmdspos += c) >= m) { *************** *** 1687,1692 **** --- 1693,1699 ---- int retval; int i; int m; + int c; if (len < 0) len = STRLEN(str); *************** *** 1735,1753 **** m = Columns * Rows; else m = MAXCOL; ! while (len--) { #ifdef CRYPTV if (cmdline_crypt) ! i = 1; else #endif ! i = charsize(str[len]); /* Stop cursor at the end of the screen */ ! if (ccline.cmdspos + i >= m) break; ++ccline.cmdpos; ! ccline.cmdspos += i; } } } --- 1742,1766 ---- m = Columns * Rows; else m = MAXCOL; ! for (i = 0; i < len; ++i) { #ifdef CRYPTV if (cmdline_crypt) ! c = 1; else #endif ! c = charsize(str[i]); ! #ifdef MULTI_BYTE ! /* multibyte wrap */ ! if (is_dbcs && IsLeadByte(str[i]) ! && ccline.cmdspos % Columns + c == Columns) ! ccline.cmdspos++; ! #endif /* Stop cursor at the end of the screen */ ! if (ccline.cmdspos + c >= m) break; ++ccline.cmdpos; ! ccline.cmdspos += c; } } } *** ../vim-5.6.86/src/message.c Mon Dec 6 17:58:35 1999 --- src/message.c Mon Jun 5 12:40:41 2000 *************** *** 857,862 **** --- 857,877 ---- while (--len >= 0) { + #ifdef MULTI_BYTE + /* check multibyte */ + if (is_dbcs && *(str + 1) != NUL && IsLeadByte(*str)) + { + char_u buf[3]; + + buf[0] = *str++; + buf[1] = *str++; + buf[2] = NUL; + msg_puts_attr(buf, attr); + retval += 2; + --len; + continue; + } + #endif msg_puts_attr(transchar(*str), attr); retval += charsize(*str); ++str; *************** *** 1229,1236 **** * (some terminals scroll automatically, some don't. To avoid * problems we scroll ourselves) */ ! if (msg_row >= Rows - 1 && (*s == '\n' || msg_col >= Columns - 1 || ! (*s == TAB && msg_col >= ((Columns - 1) & ~7)))) { /* When no more prompt an no more room, truncate here */ if (msg_no_more && lines_left == 0) --- 1244,1257 ---- * (some terminals scroll automatically, some don't. To avoid * problems we scroll ourselves) */ ! if (msg_row >= Rows - 1 ! && (*s == '\n' ! || msg_col >= Columns - 1 ! || (*s == TAB && msg_col >= ((Columns - 1) & ~7)) ! #ifdef MULTI_BYTE ! || (is_dbcs && IsLeadByte(*s) && msg_col >= Columns - 2) ! #endif ! )) { /* When no more prompt an no more room, truncate here */ if (msg_no_more && lines_left == 0) *************** *** 1373,1378 **** --- 1394,1424 ---- msg_screen_putchar(' ', attr); while (msg_col & 7); } + #ifdef MULTI_BYTE + else if (is_dbcs && *(s + 1) != NUL && IsLeadByte(*s)) + { + if (msg_col % Columns == Columns - 1) + { + msg_screen_putchar('>', hl_attr(HLF_AT)); + continue; + } + else + { + char_u mbyte[3]; /* only for dbcs */ + + mbyte[0] = *s; + mbyte[1] = *(s + 1); + mbyte[2] = NUL; + screen_puts(mbyte, msg_row, msg_col, attr); + if ((msg_col += 2) >= Columns) + { + msg_col = 0; + ++msg_row; + } + ++s; + } + } + #endif else msg_screen_putchar(*s, attr); ++s; *** ../vim-5.6.86/src/misc2.c Sun Jun 4 20:25:26 2000 --- src/misc2.c Mon Jun 5 12:44:32 2000 *************** *** 673,678 **** --- 673,686 ---- length = 1; /* count the trailing '/' and NUL */ for (p = string; *p; p++) { + #ifdef MULTI_BYTE + if (is_dbcs && *(p + 1) != NUL && IsLeadByte(*p)) + { + length += 2; + ++p; /* skip multibyte */ + continue; + } + #endif if (vim_strchr(esc_chars, *p) != NULL) ++length; /* count a backslash */ ++length; /* count an ordinary char */ *************** *** 683,688 **** --- 691,704 ---- p2 = escaped_string; for (p = string; *p; p++) { + #ifdef MULTI_BYTE + if (is_dbcs && *(p + 1) != NUL && IsLeadByte(*p)) + { + *p2++ = *p++; /* skip multibyte lead */ + *p2++ = *p; /* skip multibyte trail */ + continue; + } + #endif if (vim_strchr(esc_chars, *p) != NULL) *p2++ = '\\'; *p2++ = *p; *** ../vim-5.6.86/src/screen.c Thu Apr 13 12:02:05 2000 --- src/screen.c Mon Jun 5 12:56:31 2000 *************** *** 3211,3232 **** int attr; { char_u *screenp; if (NextScreen != NULL && row < Rows) /* safety check */ { screenp = LinePointers[row] + col; while (*text && col < Columns) { ! if (*screenp != *text || *(screenp + Columns) != attr || ! exmode_active) { *screenp = *text; *(screenp + Columns) = attr; screen_char(screenp, row, col); } - ++screenp; - ++col; - ++text; } } } --- 3211,3265 ---- int attr; { char_u *screenp; + #ifdef MULTI_BYTE + int is_mbyte; + #endif if (NextScreen != NULL && row < Rows) /* safety check */ { screenp = LinePointers[row] + col; while (*text && col < Columns) { ! #ifdef MULTI_BYTE ! /* check if this is the first byte of a multibyte */ ! if (is_dbcs && text[1] != NUL && IsLeadByte(*text)) ! is_mbyte = 1; ! else ! is_mbyte = 0; ! #endif ! if (*screenp != *text ! #ifdef MULTI_BYTE ! || (is_mbyte && screenp[1] != text[1]) ! #endif ! || *(screenp + Columns) != attr ! || exmode_active) { *screenp = *text; *(screenp + Columns) = attr; screen_char(screenp, row, col); + #ifdef MULTI_BYTE + if (is_mbyte) + { + screenp[1] = text[1]; + screenp[Columns + 1] = attr; + screen_char(screenp + 1, row, col + 1); + } + #endif + } + #ifdef MULTI_BYTE + if (is_mbyte) + { + screenp += 2; + col += 2; + text += 2; + } + else + #endif + { + ++screenp; + ++col; + ++text; } } } } *** ../vim-5.6.86/src/version.c Mon Jun 5 12:25:41 2000 --- src/version.c Mon Jun 5 13:04:55 2000 *************** *** 420,421 **** --- 420,423 ---- { /* Add new patch number below this line */ + /**/ + 87, /**/ -- CART DRIVER: Bring out your dead! We follow the cart through a wretched, impoverished plague-ridden village. A few starved mongrels run about in the mud scavenging. In the open doorway of one house perhaps we jug glimpse a pair of legs dangling from the ceiling. In another doorway an OLD WOMAN is beating a cat against a wall rather like one does with a mat. The cart passes round a dead donkey or cow in the mud. And a MAN tied to a cart is being hammered to death by four NUNS with huge mallets. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /-/-- Bram Moolenaar --- Bram@moolenaar.net --- http://www.moolenaar.net --\-\ \-\-- Vim: http://www.vim.org ---- ICCF Holland: http://www.vim.org/iccf --/-/