patch 7.4.1917 v7.4.1917
authorBram Moolenaar <Bram@vim.org>
Sat, 11 Jun 2016 12:47:40 +0000 (14:47 +0200)
committerBram Moolenaar <Bram@vim.org>
Sat, 11 Jun 2016 12:47:40 +0000 (14:47 +0200)
Problem:    History lines read from viminfo in different encoding than when
            writing are not converted.
Solution:   Convert the history lines.

src/ex_cmds.c
src/testdir/test_viminfo.vim
src/version.c

index 5e56489a319afc70a9e95ef3f40322714f1eb614..37e8e4c33cc474cf3f68d20b9b8444006fd8e81d 100644 (file)
@@ -2543,6 +2543,10 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
     int            count = 0;
     int            i;
     int            allocated = FALSE;
+#ifdef FEAT_MBYTE
+    char_u  *sconv;
+    int            converted;
+#endif
 
     while (*p == ',')
     {
@@ -2560,7 +2564,8 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
            if (!allocated)
            {
                for (i = 0; i < count; ++i)
-                   if (values[i].bv_type == BVAL_STRING)
+                   if (values[i].bv_type == BVAL_STRING
+                                                  && !values[i].bv_allocated)
                    {
                        values[i].bv_string = vim_strnsave(
                                       values[i].bv_string, values[i].bv_len);
@@ -2654,12 +2659,33 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
            }
            s[len] = NUL;
 
+#ifdef FEAT_MBYTE
+           converted = FALSE;
+           if (virp->vir_conv.vc_type != CONV_NONE && *s != NUL)
+           {
+               sconv = string_convert(&virp->vir_conv, s, NULL);
+               if (sconv != NULL)
+               {
+                   if (s == buf)
+                       vim_free(s);
+                   s = sconv;
+                   buf = s;
+                   converted = TRUE;
+               }
+           }
+#endif
+           /* Need to copy in allocated memory if the string wasn't allocated
+            * above and we did allocate before, thus vir_line may change. */
            if (s != buf && allocated)
                s = vim_strsave(s);
            values[count].bv_string = s;
            values[count].bv_type = BVAL_STRING;
            values[count].bv_len = len;
-           values[count].bv_allocated = allocated;
+           values[count].bv_allocated = allocated
+#ifdef FEAT_MBYTE
+                                           || converted
+#endif
+                                               ;
            ++count;
            if (nextp != NULL)
            {
index 279b1c3d18ff0629e9daea0c6a217614e599c1aa..1fefba1b604be278e2a98ce708fe08549f25d46a 100644 (file)
@@ -179,3 +179,25 @@ func Test_cmdline_history_order()
 
   call delete('Xviminfo')
 endfunc
+
+func Test_viminfo_encoding()
+  if !has('multi_byte')
+    return
+  endif
+  set enc=latin1
+  call histdel(':')
+  call histadd(':', "echo '\xe9'")
+  wviminfo Xviminfo
+
+  set fencs=utf-8,latin1
+  set enc=utf-8
+  sp Xviminfo
+  call assert_equal('latin1', &fenc)
+  close
+  
+  call histdel(':')
+  rviminfo Xviminfo
+  call assert_equal("echo 'é'", histget(':', -1))
+
+  call delete('Xviminfo')
+endfunc
index dfeee725699788b4290d465aa8e85c9b071453b6..684ec7646a6bab63589e135f5d70ead93bbbcd1a 100644 (file)
@@ -753,6 +753,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1917,
 /**/
     1916,
 /**/