mirror of
https://github.com/vim/vim.git
synced 2025-09-23 03:43:49 -04:00
patch 7.4.1917
Problem: History lines read from viminfo in different encoding than when writing are not converted. Solution: Convert the history lines.
This commit is contained in:
@@ -2543,6 +2543,10 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
|
|||||||
int count = 0;
|
int count = 0;
|
||||||
int i;
|
int i;
|
||||||
int allocated = FALSE;
|
int allocated = FALSE;
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
char_u *sconv;
|
||||||
|
int converted;
|
||||||
|
#endif
|
||||||
|
|
||||||
while (*p == ',')
|
while (*p == ',')
|
||||||
{
|
{
|
||||||
@@ -2560,7 +2564,8 @@ barline_parse(vir_T *virp, char_u *text, bval_T *values)
|
|||||||
if (!allocated)
|
if (!allocated)
|
||||||
{
|
{
|
||||||
for (i = 0; i < count; ++i)
|
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 = vim_strnsave(
|
||||||
values[i].bv_string, values[i].bv_len);
|
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;
|
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)
|
if (s != buf && allocated)
|
||||||
s = vim_strsave(s);
|
s = vim_strsave(s);
|
||||||
values[count].bv_string = s;
|
values[count].bv_string = s;
|
||||||
values[count].bv_type = BVAL_STRING;
|
values[count].bv_type = BVAL_STRING;
|
||||||
values[count].bv_len = len;
|
values[count].bv_len = len;
|
||||||
values[count].bv_allocated = allocated;
|
values[count].bv_allocated = allocated
|
||||||
|
#ifdef FEAT_MBYTE
|
||||||
|
|| converted
|
||||||
|
#endif
|
||||||
|
;
|
||||||
++count;
|
++count;
|
||||||
if (nextp != NULL)
|
if (nextp != NULL)
|
||||||
{
|
{
|
||||||
|
@@ -179,3 +179,25 @@ func Test_cmdline_history_order()
|
|||||||
|
|
||||||
call delete('Xviminfo')
|
call delete('Xviminfo')
|
||||||
endfunc
|
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
|
||||||
|
@@ -753,6 +753,8 @@ static char *(features[]) =
|
|||||||
|
|
||||||
static int included_patches[] =
|
static int included_patches[] =
|
||||||
{ /* Add new patch number below this line */
|
{ /* Add new patch number below this line */
|
||||||
|
/**/
|
||||||
|
1917,
|
||||||
/**/
|
/**/
|
||||||
1916,
|
1916,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user