Mercurial > vim
changeset 11902:35d7459251fd v8.0.0831
patch 8.0.0831: with 8 colors the bold attribute is not set properly
commit https://github.com/vim/vim/commit/12d853fae1fc37c33874b5cf1e40a2dfaf04268c
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Aug 1 18:04:04 2017 +0200
patch 8.0.0831: with 8 colors the bold attribute is not set properly
Problem: With 8 colors the bold attribute is not set properly.
Solution: Move setting HL_TABLE() out of lookup_color. (closes https://github.com/vim/vim/issues/1901)
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 01 Aug 2017 18:15:05 +0200 |
parents | fa458be947f8 |
children | c7a0dd681e9f |
files | src/proto/syntax.pro src/syntax.c src/terminal.c src/version.c |
diffstat | 4 files changed, 51 insertions(+), 28 deletions(-) [+] |
line wrap: on
line diff
--- a/src/proto/syntax.pro +++ b/src/proto/syntax.pro @@ -23,7 +23,7 @@ void ex_syntime(exarg_T *eap); char_u *get_syntime_arg(expand_T *xp, int idx); void init_highlight(int both, int reset); int load_colors(char_u *name); -int lookup_color(int idx, int foreground); +int lookup_color(int idx, int foreground, int *boldp); void do_highlight(char_u *line, int forceit, int init); void free_highlight(void); void restore_cterm_colors(void);
--- a/src/syntax.c +++ b/src/syntax.c @@ -7276,9 +7276,11 @@ static int color_numbers_8[28] = {0, 4, /* * Lookup the "cterm" value to be used for color with index "idx" in * color_names[]. + * "boldp" will be set to TRUE or FALSE for a foreground color when using 8 + * colors, otherwise it will be unchanged. */ int -lookup_color(int idx, int foreground) +lookup_color(int idx, int foreground, int *boldp) { int color = color_numbers_16[idx]; char_u *p; @@ -7300,12 +7302,9 @@ lookup_color(int idx, int foreground) /* set/reset bold attribute to get light foreground * colors (on some terminals, e.g. "linux") */ if (color & 8) - { - HL_TABLE()[idx].sg_cterm |= HL_BOLD; - HL_TABLE()[idx].sg_cterm_bold = TRUE; - } + *boldp = TRUE; else - HL_TABLE()[idx].sg_cterm &= ~HL_BOLD; + *boldp = FALSE; } color &= 7; /* truncate to 8 colors */ } @@ -7837,6 +7836,8 @@ do_highlight( } else { + int bold = MAYBE; + #if defined(__QNXNTO__) static int *color_numbers_8_qansi = color_numbers_8; /* On qnx, the 8 & 16 color arrays are the same */ @@ -7857,7 +7858,17 @@ do_highlight( break; } - color = lookup_color(i, key[5] == 'F'); + color = lookup_color(i, key[5] == 'F', &bold); + + /* set/reset bold attribute to get light foreground + * colors (on some terminals, e.g. "linux") */ + if (bold == TRUE) + { + HL_TABLE()[idx].sg_cterm |= HL_BOLD; + HL_TABLE()[idx].sg_cterm_bold = TRUE; + } + else if (bold == FALSE) + HL_TABLE()[idx].sg_cterm &= ~HL_BOLD; } /* Add one to the argument, to avoid zero. Zero is used for
--- a/src/terminal.c +++ b/src/terminal.c @@ -36,7 +36,7 @@ * that buffer, attributes come from the scrollback buffer tl_scrollback. * * TODO: - * - Use "." for current line instead of optional. + * - Use "." for current line instead of optional argument. * - make row and cols one-based instead of zero-based in term_ functions. * - Add StatusLineTerm highlighting * - in bash mouse clicks are inserting characters. @@ -56,6 +56,8 @@ * - do not store terminal window in viminfo. Or prefix term:// ? * - add a character in :ls output * - add 't' to mode() + * - When making a change after the job has ended, make the buffer a normal + * buffer; needs to be written. * - when closing window and job has not ended, make terminal hidden? * - when closing window and job has ended, make buffer hidden? * - don't allow exiting Vim when a terminal is still running a job @@ -71,6 +73,8 @@ * conversions. * - update ":help function-list" for terminal functions. * - In the GUI use a terminal emulator for :!cmd. + * - Copy text in the vterm to the Vim buffer once in a while, so that + * completion works. */ #include "vim.h" @@ -1253,7 +1257,7 @@ term_channel_closed(channel_T *ch) * First color is 1. Return 0 if no match found. */ static int -color2index(VTermColor *color, int foreground) +color2index(VTermColor *color, int fg, int *boldp) { int red = color->red; int blue = color->blue; @@ -1265,16 +1269,16 @@ color2index(VTermColor *color, int foreg if (green == 0) { if (blue == 0) - return lookup_color(0, foreground) + 1; /* black */ + return lookup_color(0, fg, boldp) + 1; /* black */ if (blue == 224) - return lookup_color(1, foreground) + 1; /* dark blue */ + return lookup_color(1, fg, boldp) + 1; /* dark blue */ } else if (green == 224) { if (blue == 0) - return lookup_color(2, foreground) + 1; /* dark green */ + return lookup_color(2, fg, boldp) + 1; /* dark green */ if (blue == 224) - return lookup_color(3, foreground) + 1; /* dark cyan */ + return lookup_color(3, fg, boldp) + 1; /* dark cyan */ } } else if (red == 224) @@ -1282,38 +1286,38 @@ color2index(VTermColor *color, int foreg if (green == 0) { if (blue == 0) - return lookup_color(4, foreground) + 1; /* dark red */ + return lookup_color(4, fg, boldp) + 1; /* dark red */ if (blue == 224) - return lookup_color(5, foreground) + 1; /* dark magenta */ + return lookup_color(5, fg, boldp) + 1; /* dark magenta */ } else if (green == 224) { if (blue == 0) - return lookup_color(6, foreground) + 1; /* dark yellow / brown */ + return lookup_color(6, fg, boldp) + 1; /* dark yellow / brown */ if (blue == 224) - return lookup_color(8, foreground) + 1; /* white / light grey */ + return lookup_color(8, fg, boldp) + 1; /* white / light grey */ } } else if (red == 128) { if (green == 128 && blue == 128) - return lookup_color(12, foreground) + 1; /* high intensity black / dark grey */ + return lookup_color(12, fg, boldp) + 1; /* high intensity black / dark grey */ } else if (red == 255) { if (green == 64) { if (blue == 64) - return lookup_color(20, foreground) + 1; /* light red */ + return lookup_color(20, fg, boldp) + 1; /* light red */ if (blue == 255) - return lookup_color(22, foreground) + 1; /* light magenta */ + return lookup_color(22, fg, boldp) + 1; /* light magenta */ } else if (green == 255) { if (blue == 64) - return lookup_color(24, foreground) + 1; /* yellow */ + return lookup_color(24, fg, boldp) + 1; /* yellow */ if (blue == 255) - return lookup_color(26, foreground) + 1; /* white */ + return lookup_color(26, fg, boldp) + 1; /* white */ } } else if (red == 64) @@ -1321,14 +1325,14 @@ color2index(VTermColor *color, int foreg if (green == 64) { if (blue == 255) - return lookup_color(14, foreground) + 1; /* light blue */ + return lookup_color(14, fg, boldp) + 1; /* light blue */ } else if (green == 255) { if (blue == 64) - return lookup_color(16, foreground) + 1; /* light green */ + return lookup_color(16, fg, boldp) + 1; /* light green */ if (blue == 255) - return lookup_color(18, foreground) + 1; /* light cyan */ + return lookup_color(18, fg, boldp) + 1; /* light cyan */ } } if (t_colors >= 256) @@ -1399,8 +1403,14 @@ cell2attr(VTermScreenCell *cell) else #endif { - return get_cterm_attr_idx(attr, color2index(&cell->fg, TRUE), - color2index(&cell->bg, FALSE)); + int bold = MAYBE; + int fg = color2index(&cell->fg, TRUE, &bold); + int bg = color2index(&cell->bg, FALSE, &bold); + + /* with 8 colors set the bold attribute to get a bright foreground */ + if (bold == TRUE) + attr |= HL_BOLD; + return get_cterm_attr_idx(attr, fg, bg); } return 0; }