diff options
author | Bram Moolenaar <Bram@vim.org> | 2014-06-12 19:44:48 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2014-06-12 19:44:48 +0200 |
commit | 2d54ec92d42a659aca4ec9e16521cd32767a7faa (patch) | |
tree | b09a262c119b3793e56d6e73303358acac12c8e4 | |
parent | 8e7048ca4b699bbdb8452c0f8c642bfd66cc7bf4 (diff) | |
download | vim-2d54ec92d42a659aca4ec9e16521cd32767a7faa.zip |
updated for version 7.4.324
Problem: In Ex mode, cyrillic characters are not handled. (Stas Malavin)
Solution: Support multi-byte characters in Ex mode. (Yukihiro Nakadaira)
-rw-r--r-- | src/ex_getln.c | 42 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 35 insertions, 9 deletions
diff --git a/src/ex_getln.c b/src/ex_getln.c index 7659a37ff..2678184bc 100644 --- a/src/ex_getln.c +++ b/src/ex_getln.c @@ -2188,6 +2188,7 @@ getexmodeline(promptc, cookie, indent) int vcol = 0; char_u *p; int prev_char; + int len; /* Switch cursor on now. This avoids that it happens after the "\n", which * confuses the system function that computes tabstops. */ @@ -2264,7 +2265,17 @@ getexmodeline(promptc, cookie, indent) { if (line_ga.ga_len > 0) { - --line_ga.ga_len; +#ifdef FEAT_MBYTE + if (has_mbyte) + { + p = (char_u *)line_ga.ga_data; + p[line_ga.ga_len] = NUL; + len = (*mb_head_off)(p, p + line_ga.ga_len - 1) + 1; + line_ga.ga_len -= len; + } + else +#endif + --line_ga.ga_len; goto redraw; } continue; @@ -2280,7 +2291,7 @@ getexmodeline(promptc, cookie, indent) if (c1 == Ctrl_T) { - long sw = get_sw_value(curbuf); + long sw = get_sw_value(curbuf); p = (char_u *)line_ga.ga_data; p[line_ga.ga_len] = NUL; @@ -2300,8 +2311,9 @@ redraw: /* redraw the line */ msg_col = startcol; vcol = 0; - for (p = (char_u *)line_ga.ga_data; - p < (char_u *)line_ga.ga_data + line_ga.ga_len; ++p) + p = (char_u *)line_ga.ga_data; + p[line_ga.ga_len] = NUL; + while (p < (char_u *)line_ga.ga_data + line_ga.ga_len) { if (*p == TAB) { @@ -2309,11 +2321,14 @@ redraw: { msg_putchar(' '); } while (++vcol % 8); + ++p; } else { - msg_outtrans_len(p, 1); - vcol += char2cells(*p); + len = MB_PTR2LEN(p); + msg_outtrans_len(p, len); + vcol += ptr2cells(p); + p += len; } } msg_clr_eos(); @@ -2362,7 +2377,16 @@ redraw: if (IS_SPECIAL(c1)) c1 = '?'; - ((char_u *)line_ga.ga_data)[line_ga.ga_len] = c1; +#ifdef FEAT_MBYTE + if (has_mbyte) + len = (*mb_char2bytes)(c1, + (char_u *)line_ga.ga_data + line_ga.ga_len); + else +#endif + { + len = 1; + ((char_u *)line_ga.ga_data)[line_ga.ga_len] = c1; + } if (c1 == '\n') msg_putchar('\n'); else if (c1 == TAB) @@ -2376,10 +2400,10 @@ redraw: else { msg_outtrans_len( - ((char_u *)line_ga.ga_data) + line_ga.ga_len, 1); + ((char_u *)line_ga.ga_data) + line_ga.ga_len, len); vcol += char2cells(c1); } - ++line_ga.ga_len; + line_ga.ga_len += len; escaped = FALSE; windgoto(msg_row, msg_col); diff --git a/src/version.c b/src/version.c index 93046ddd5..15db5ad50 100644 --- a/src/version.c +++ b/src/version.c @@ -735,6 +735,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 324, +/**/ 323, /**/ 322, |