summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2014-06-12 19:44:48 +0200
committerBram Moolenaar <Bram@vim.org>2014-06-12 19:44:48 +0200
commit2d54ec92d42a659aca4ec9e16521cd32767a7faa (patch)
treeb09a262c119b3793e56d6e73303358acac12c8e4
parent8e7048ca4b699bbdb8452c0f8c642bfd66cc7bf4 (diff)
downloadvim-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.c42
-rw-r--r--src/version.c2
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,