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:
@@ -49,8 +49,8 @@
|
|||||||
"err_io", "err_name", "err_buf", "err_modifiable", "err_msg"
|
"err_io", "err_name", "err_buf", "err_modifiable", "err_msg"
|
||||||
* Check that something is connected to the terminal.
|
* Check that something is connected to the terminal.
|
||||||
* Test: "cat" reading from a file or buffer
|
* Test: "cat" reading from a file or buffer
|
||||||
* "ls" writing stdout to a file or buffer
|
* "ls" writing stdout to a file or buffer
|
||||||
* shell writing stderr to a file or buffer
|
* shell writing stderr to a file or buffer
|
||||||
* - For the GUI fill termios with default values, perhaps like pangoterm:
|
* - For the GUI fill termios with default values, perhaps like pangoterm:
|
||||||
* http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134
|
* http://bazaar.launchpad.net/~leonerd/pangoterm/trunk/view/head:/main.c#L134
|
||||||
* - support ":term NONE" to open a terminal with a pty but not running a job
|
* - support ":term NONE" to open a terminal with a pty but not running a job
|
||||||
@@ -845,7 +845,26 @@ 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;
|
||||||
|
|
||||||
ml_append_buf(term->tl_buffer, lnum, text, len + 1, FALSE);
|
#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);
|
||||||
if (empty)
|
if (empty)
|
||||||
{
|
{
|
||||||
/* Delete the empty line that was in the empty buffer. */
|
/* Delete the empty line that was in the empty buffer. */
|
||||||
@@ -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;
|
||||||
@@ -1627,7 +1658,7 @@ color2index(VTermColor *color, int fg, int *boldp)
|
|||||||
|
|
||||||
/* 216-color cube */
|
/* 216-color cube */
|
||||||
return 17 + ((red + 25) / 0x33) * 36
|
return 17 + ((red + 25) / 0x33) * 36
|
||||||
+ ((green + 25) / 0x33) * 6
|
+ ((green + 25) / 0x33) * 6
|
||||||
+ (blue + 25) / 0x33;
|
+ (blue + 25) / 0x33;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@@ -2076,20 +2107,39 @@ term_update_window(win_T *wp)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if defined(FEAT_MBYTE)
|
#if defined(FEAT_MBYTE)
|
||||||
if (enc_utf8 && c >= 0x80)
|
if (enc_utf8)
|
||||||
{
|
{
|
||||||
ScreenLines[off] = ' ';
|
if (c >= 0x80)
|
||||||
ScreenLinesUC[off] = c;
|
{
|
||||||
}
|
ScreenLines[off] = ' ';
|
||||||
else
|
ScreenLinesUC[off] = c;
|
||||||
{
|
}
|
||||||
ScreenLines[off] = c;
|
else
|
||||||
if (enc_utf8)
|
{
|
||||||
|
ScreenLines[off] = c;
|
||||||
ScreenLinesUC[off] = NUL;
|
ScreenLinesUC[off] = NUL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#else
|
# ifdef _WIN32
|
||||||
ScreenLines[off] = c;
|
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;
|
||||||
|
}
|
||||||
|
# endif
|
||||||
|
else
|
||||||
#endif
|
#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;
|
||||||
}
|
}
|
||||||
|
@@ -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,
|
||||||
/**/
|
/**/
|
||||||
|
Reference in New Issue
Block a user