To: vim_dev@googlegroups.com Subject: Patch 8.0.0791 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.0791 Problem: Terminal colors depend on the system. Solution: Use the highlight color lookup tables. Files: src/syntax.c, src/proto/syntax.pro, src/terminal.c *** ../vim-8.0.0790/src/syntax.c 2017-07-23 18:07:51.050808235 +0200 --- src/syntax.c 2017-07-28 15:03:13.091153967 +0200 *************** *** 7221,7226 **** --- 7221,7336 ---- return retval; } + static char *(color_names[28]) = { + "Black", "DarkBlue", "DarkGreen", "DarkCyan", + "DarkRed", "DarkMagenta", "Brown", "DarkYellow", + "Gray", "Grey", "LightGray", "LightGrey", + "DarkGray", "DarkGrey", + "Blue", "LightBlue", "Green", "LightGreen", + "Cyan", "LightCyan", "Red", "LightRed", "Magenta", + "LightMagenta", "Yellow", "LightYellow", "White", "NONE"}; + /* indices: + * 0, 1, 2, 3, + * 4, 5, 6, 7, + * 8, 9, 10, 11, + * 12, 13, + * 14, 15, 16, 17, + * 18, 19, 20, 21, 22, + * 23, 24, 25, 26, 27 */ + static int color_numbers_16[28] = {0, 1, 2, 3, + 4, 5, 6, 6, + 7, 7, 7, 7, + 8, 8, + 9, 9, 10, 10, + 11, 11, 12, 12, 13, + 13, 14, 14, 15, -1}; + /* for xterm with 88 colors... */ + static int color_numbers_88[28] = {0, 4, 2, 6, + 1, 5, 32, 72, + 84, 84, 7, 7, + 82, 82, + 12, 43, 10, 61, + 14, 63, 9, 74, 13, + 75, 11, 78, 15, -1}; + /* for xterm with 256 colors... */ + static int color_numbers_256[28] = {0, 4, 2, 6, + 1, 5, 130, 130, + 248, 248, 7, 7, + 242, 242, + 12, 81, 10, 121, + 14, 159, 9, 224, 13, + 225, 11, 229, 15, -1}; + /* for terminals with less than 16 colors... */ + static int color_numbers_8[28] = {0, 4, 2, 6, + 1, 5, 3, 3, + 7, 7, 7, 7, + 0+8, 0+8, + 4+8, 4+8, 2+8, 2+8, + 6+8, 6+8, 1+8, 1+8, 5+8, + 5+8, 3+8, 3+8, 7+8, -1}; + + /* + * Lookup the "cterm" value to be used for color with index "idx" in + * color_names[]. + */ + int + lookup_color(int idx, int foreground) + { + int color = color_numbers_16[idx]; + char_u *p; + + /* Use the _16 table to check if it's a valid color name. */ + if (color < 0) + return -1; + + if (t_colors == 8) + { + /* t_Co is 8: use the 8 colors table */ + #if defined(__QNXNTO__) + color = color_numbers_8_qansi[idx]; + #else + color = color_numbers_8[idx]; + #endif + if (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; + } + else + HL_TABLE()[idx].sg_cterm &= ~HL_BOLD; + } + color &= 7; /* truncate to 8 colors */ + } + else if (t_colors == 16 || t_colors == 88 + || t_colors >= 256) + { + /* + * Guess: if the termcap entry ends in 'm', it is + * probably an xterm-like terminal. Use the changed + * order for colors. + */ + if (*T_CAF != NUL) + p = T_CAF; + else + p = T_CSF; + if (*p != NUL && (t_colors > 256 + || *(p + STRLEN(p) - 1) == 'm')) + { + if (t_colors == 88) + color = color_numbers_88[idx]; + else if (t_colors >= 256) + color = color_numbers_256[idx]; + else + color = color_numbers_8[idx]; + } + } + return color; + } + /* * Handle the ":highlight .." command. * When using ":hi clear" this is called recursively for each group with *************** *** 7723,7767 **** } else { - static char *(color_names[28]) = { - "Black", "DarkBlue", "DarkGreen", "DarkCyan", - "DarkRed", "DarkMagenta", "Brown", "DarkYellow", - "Gray", "Grey", - "LightGray", "LightGrey", "DarkGray", "DarkGrey", - "Blue", "LightBlue", "Green", "LightGreen", - "Cyan", "LightCyan", "Red", "LightRed", "Magenta", - "LightMagenta", "Yellow", "LightYellow", "White", "NONE"}; - static int color_numbers_16[28] = {0, 1, 2, 3, - 4, 5, 6, 6, - 7, 7, - 7, 7, 8, 8, - 9, 9, 10, 10, - 11, 11, 12, 12, 13, - 13, 14, 14, 15, -1}; - /* for xterm with 88 colors... */ - static int color_numbers_88[28] = {0, 4, 2, 6, - 1, 5, 32, 72, - 84, 84, - 7, 7, 82, 82, - 12, 43, 10, 61, - 14, 63, 9, 74, 13, - 75, 11, 78, 15, -1}; - /* for xterm with 256 colors... */ - static int color_numbers_256[28] = {0, 4, 2, 6, - 1, 5, 130, 130, - 248, 248, - 7, 7, 242, 242, - 12, 81, 10, 121, - 14, 159, 9, 224, 13, - 225, 11, 229, 15, -1}; - /* for terminals with less than 16 colors... */ - static int color_numbers_8[28] = {0, 4, 2, 6, - 1, 5, 3, 3, - 7, 7, - 7, 7, 0+8, 0+8, - 4+8, 4+8, 2+8, 2+8, - 6+8, 6+8, 1+8, 1+8, 5+8, - 5+8, 3+8, 3+8, 7+8, -1}; #if defined(__QNXNTO__) static int *color_numbers_8_qansi = color_numbers_8; /* On qnx, the 8 & 16 color arrays are the same */ --- 7833,7838 ---- *************** *** 7782,7838 **** break; } ! /* Use the _16 table to check if it's a valid color name. */ ! color = color_numbers_16[i]; ! if (color >= 0) ! { ! if (t_colors == 8) ! { ! /* t_Co is 8: use the 8 colors table */ ! #if defined(__QNXNTO__) ! color = color_numbers_8_qansi[i]; ! #else ! color = color_numbers_8[i]; ! #endif ! if (key[5] == 'F') ! { ! /* 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; ! } ! else ! HL_TABLE()[idx].sg_cterm &= ~HL_BOLD; ! } ! color &= 7; /* truncate to 8 colors */ ! } ! else if (t_colors == 16 || t_colors == 88 ! || t_colors >= 256) ! { ! /* ! * Guess: if the termcap entry ends in 'm', it is ! * probably an xterm-like terminal. Use the changed ! * order for colors. ! */ ! if (*T_CAF != NUL) ! p = T_CAF; ! else ! p = T_CSF; ! if (*p != NUL && (t_colors > 256 ! || *(p + STRLEN(p) - 1) == 'm')) ! { ! if (t_colors == 88) ! color = color_numbers_88[i]; ! else if (t_colors >= 256) ! color = color_numbers_256[i]; ! else ! color = color_numbers_8[i]; ! } ! } ! } } /* Add one to the argument, to avoid zero. Zero is used for * "NONE", then "color" is -1. */ if (key[5] == 'F') --- 7853,7861 ---- break; } ! color = lookup_color(i, key[5] == 'F'); } + /* Add one to the argument, to avoid zero. Zero is used for * "NONE", then "color" is -1. */ if (key[5] == 'F') *** ../vim-8.0.0790/src/proto/syntax.pro 2017-07-23 18:07:51.050808235 +0200 --- src/proto/syntax.pro 2017-07-28 15:02:33.679438256 +0200 *************** *** 23,28 **** --- 23,29 ---- 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); void do_highlight(char_u *line, int forceit, int init); void free_highlight(void); void restore_cterm_colors(void); *** ../vim-8.0.0790/src/terminal.c 2017-07-28 14:17:30.678540959 +0200 --- src/terminal.c 2017-07-28 15:10:40.955921276 +0200 *************** *** 33,38 **** --- 33,39 ---- * while, if the terminal window is visible, the screen contents is drawn. * * TODO: + * - if 'term' starts witth "xterm" use it for $TERM. * - To set BS correctly, check get_stty(); Pass the fd of the pty. * - include functions from #1871 * - do not store terminal buffer in viminfo. Or prefix term:// ? *************** *** 755,781 **** * First color is 1. Return 0 if no match found. */ static int ! color2index(VTermColor *color) { int red = color->red; int blue = color->blue; int green = color->green; if (red == 0) { if (green == 0) { if (blue == 0) ! return 1; /* black */ if (blue == 224) ! return 5; /* blue */ } else if (green == 224) { if (blue == 0) ! return 3; /* green */ if (blue == 224) ! return 7; /* cyan */ } } else if (red == 224) --- 756,783 ---- * First color is 1. Return 0 if no match found. */ static int ! color2index(VTermColor *color, int foreground) { int red = color->red; int blue = color->blue; int green = color->green; + /* The argument for lookup_color() is for the color_names[] table. */ if (red == 0) { if (green == 0) { if (blue == 0) ! return lookup_color(0, foreground) + 1; /* black */ if (blue == 224) ! return lookup_color(1, foreground) + 1; /* dark blue */ } else if (green == 224) { if (blue == 0) ! return lookup_color(2, foreground) + 1; /* dark green */ if (blue == 224) ! return lookup_color(3, foreground) + 1; /* dark cyan */ } } else if (red == 224) *************** *** 783,820 **** if (green == 0) { if (blue == 0) ! return 2; /* red */ if (blue == 224) ! return 6; /* magenta */ } else if (green == 224) { if (blue == 0) ! return 4; /* yellow */ if (blue == 224) ! return 8; /* white */ } } else if (red == 128) { if (green == 128 && blue == 128) ! return 9; /* high intensity black */ } else if (red == 255) { if (green == 64) { if (blue == 64) ! return 10; /* high intensity red */ if (blue == 255) ! return 14; /* high intensity magenta */ } else if (green == 255) { if (blue == 64) ! return 12; /* high intensity yellow */ if (blue == 255) ! return 16; /* high intensity white */ } } else if (red == 64) --- 785,822 ---- if (green == 0) { if (blue == 0) ! return lookup_color(4, foreground) + 1; /* dark red */ if (blue == 224) ! return lookup_color(5, foreground) + 1; /* dark magenta */ } else if (green == 224) { if (blue == 0) ! return lookup_color(6, foreground) + 1; /* dark yellow / brown */ if (blue == 224) ! return lookup_color(8, foreground) + 1; /* white / light grey */ } } else if (red == 128) { if (green == 128 && blue == 128) ! return lookup_color(12, foreground) + 1; /* high intensity black / dark grey */ } else if (red == 255) { if (green == 64) { if (blue == 64) ! return lookup_color(20, foreground) + 1; /* light red */ if (blue == 255) ! return lookup_color(22, foreground) + 1; /* light magenta */ } else if (green == 255) { if (blue == 64) ! return lookup_color(24, foreground) + 1; /* yellow */ if (blue == 255) ! return lookup_color(26, foreground) + 1; /* white */ } } else if (red == 64) *************** *** 822,835 **** if (green == 64) { if (blue == 255) ! return 13; /* high intensity blue */ } else if (green == 255) { if (blue == 64) ! return 11; /* high intensity green */ if (blue == 255) ! return 15; /* high intensity cyan */ } } if (t_colors >= 256) --- 824,837 ---- if (green == 64) { if (blue == 255) ! return lookup_color(14, foreground) + 1; /* light blue */ } else if (green == 255) { if (blue == 64) ! return lookup_color(16, foreground) + 1; /* light green */ if (blue == 255) ! return lookup_color(18, foreground) + 1; /* light cyan */ } } if (t_colors >= 256) *************** *** 902,909 **** else #endif { ! return get_cterm_attr_idx(attr, color2index(&cell->fg), ! color2index(&cell->bg)); } return 0; } --- 904,911 ---- else #endif { ! return get_cterm_attr_idx(attr, color2index(&cell->fg, TRUE), ! color2index(&cell->bg, FALSE)); } return 0; } *** ../vim-8.0.0790/src/version.c 2017-07-28 14:19:15.901799595 +0200 --- src/version.c 2017-07-28 14:40:58.768653381 +0200 *************** *** 771,772 **** --- 771,774 ---- { /* Add new patch number below this line */ + /**/ + 791, /**/ -- He was not in the least bit scared to be mashed into a pulp Or to have his eyes gouged out and his elbows broken; To have his kneecaps split and his body burned away And his limbs all hacked and mangled, brave Sir Robin. "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///