0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 8.0.0982: cannot use a terminal when 'encoding' is non-utf8 multi-byte

Problem:    When 'encoding' is set to a multi-byte encoding other than utf-8
            the characters from ther terminal are messed up.
Solution:   Convert displayed text from utf-8 to 'encoding' for MS-Windows.
            (Yasuhiro Matsumoto, close #2000)
This commit is contained in:
Bram Moolenaar
2017-08-21 22:01:27 +02:00
parent 0cbba82359
commit 740c433c59
2 changed files with 69 additions and 16 deletions

View File

@@ -845,6 +845,25 @@ add_scrollback_line_to_buffer(term_T *term, char_u *text, int len)
int empty = (buf->b_ml.ml_flags & ML_EMPTY); int empty = (buf->b_ml.ml_flags & ML_EMPTY);
linenr_T lnum = buf->b_ml.ml_line_count; linenr_T lnum = buf->b_ml.ml_line_count;
#ifdef _WIN32
if (!enc_utf8 && enc_codepage > 0)
{
WCHAR *ret = NULL;
int length = 0;
MultiByteToWideChar_alloc(CP_UTF8, 0, (char*)text, len + 1,
&ret, &length);
if (ret != NULL)
{
WideCharToMultiByte_alloc(enc_codepage, 0,
ret, length, (char **)&text, &len, 0, 0);
vim_free(ret);
ml_append_buf(term->tl_buffer, lnum, text, len, FALSE);
vim_free(text);
}
}
else
#endif
ml_append_buf(term->tl_buffer, lnum, text, len + 1, FALSE); ml_append_buf(term->tl_buffer, lnum, text, len + 1, FALSE);
if (empty) if (empty)
{ {
@@ -936,7 +955,7 @@ move_terminal_to_buffer(term_T *term)
int c; int c;
for (i = 0; (c = cell.chars[i]) > 0 || i == 0; ++i) for (i = 0; (c = cell.chars[i]) > 0 || i == 0; ++i)
ga.ga_len += mb_char2bytes(c == NUL ? ' ' : c, ga.ga_len += utf_char2bytes(c == NUL ? ' ' : c,
(char_u *)ga.ga_data + ga.ga_len); (char_u *)ga.ga_data + ga.ga_len);
} }
} }
@@ -1468,6 +1487,18 @@ terminal_loop(void)
goto theend; goto theend;
} }
} }
# ifdef _WIN32
if (!enc_utf8 && has_mbyte && c >= 0x80)
{
WCHAR wc;
char_u mb[3];
mb[0] = (unsigned)c >> 8;
mb[1] = c;
if (MultiByteToWideChar(GetACP(), 0, (char*)mb, 2, &wc, 1) > 0)
c = wc;
}
# endif
if (send_keys_to_term(curbuf->b_term, c, TRUE) != OK) if (send_keys_to_term(curbuf->b_term, c, TRUE) != OK)
{ {
ret = OK; ret = OK;
@@ -2076,7 +2107,9 @@ term_update_window(win_T *wp)
else else
{ {
#if defined(FEAT_MBYTE) #if defined(FEAT_MBYTE)
if (enc_utf8 && c >= 0x80) if (enc_utf8)
{
if (c >= 0x80)
{ {
ScreenLines[off] = ' '; ScreenLines[off] = ' ';
ScreenLinesUC[off] = c; ScreenLinesUC[off] = c;
@@ -2084,12 +2117,29 @@ term_update_window(win_T *wp)
else else
{ {
ScreenLines[off] = c; ScreenLines[off] = c;
if (enc_utf8)
ScreenLinesUC[off] = NUL; ScreenLinesUC[off] = NUL;
} }
#else }
# ifdef _WIN32
else if (has_mbyte && c >= 0x80)
{
char_u mb[MB_MAXBYTES+1];
WCHAR wc = c;
if (WideCharToMultiByte(GetACP(), 0, &wc, 1,
(char*)mb, 2, 0, 0) > 1)
{
ScreenLines[off] = mb[0];
ScreenLines[off+1] = mb[1];
cell.width = mb_ptr2cells(mb);
}
else
ScreenLines[off] = c; ScreenLines[off] = c;
}
# endif # endif
else
#endif
ScreenLines[off] = c;
} }
ScreenAttrs[off] = cell2attr(cell.attrs, cell.fg, cell.bg); ScreenAttrs[off] = cell2attr(cell.attrs, cell.fg, cell.bg);
@@ -2097,11 +2147,12 @@ term_update_window(win_T *wp)
++off; ++off;
if (cell.width == 2) if (cell.width == 2)
{ {
ScreenLines[off] = NUL;
#if defined(FEAT_MBYTE) #if defined(FEAT_MBYTE)
if (enc_utf8) if (enc_utf8)
ScreenLinesUC[off] = NUL; ScreenLinesUC[off] = NUL;
else if (!has_mbyte)
#endif #endif
ScreenLines[off] = NUL;
++pos.col; ++pos.col;
++off; ++off;
} }

View File

@@ -769,6 +769,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 */
/**/
982,
/**/ /**/
981, 981,
/**/ /**/