]> granicus.if.org Git - vim/commitdiff
updated for version 7.4.324 v7.4.324
authorBram Moolenaar <Bram@vim.org>
Thu, 12 Jun 2014 17:44:48 +0000 (19:44 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 12 Jun 2014 17:44:48 +0000 (19:44 +0200)
Problem:    In Ex mode, cyrillic characters are not handled. (Stas Malavin)
Solution:   Support multi-byte characters in Ex mode. (Yukihiro Nakadaira)

src/ex_getln.c
src/version.c

index 7659a37ff6e21703c7504a8c32258e5c2ea185e8..2678184bcabeb42500c6658c60b07f0a95bf1842 100644 (file)
@@ -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);
index 93046ddd54a1f0ee06b6d76b15dc4a85c07e96f0..15db5ad50a211f6a5c70ef2716a270a2189a5568 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    324,
 /**/
     323,
 /**/