To: vim_dev@googlegroups.com Subject: Patch 8.0.1783 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.0.1783 Problem: Cannot use 256 colors in a MS-Windows console. Solution: Add 256 color support. (Nobuhiro Takasaki, closes #2821) Files: src/misc1.c, src/option.c, src/os_win32.c, src/proto/os_win32.pro, src/term.c, src/proto/term.pro, src/terminal.c *** ../vim-8.0.1782/src/misc1.c 2018-04-24 19:36:37.496162909 +0200 --- src/misc1.c 2018-05-01 15:12:10.274489103 +0200 *************** *** 3723,3729 **** /* No restore color information, refresh the screen. */ if (has_vtp_working() != 0 # ifdef FEAT_TERMGUICOLORS ! && p_tgc # endif ) { --- 3723,3729 ---- /* No restore color information, refresh the screen. */ if (has_vtp_working() != 0 # ifdef FEAT_TERMGUICOLORS ! && (p_tgc || (!p_tgc && t_colors >= 256)) # endif ) { *** ../vim-8.0.1782/src/option.c 2018-04-27 22:53:03.930590711 +0200 --- src/option.c 2018-05-01 15:12:10.278489078 +0200 *************** *** 6082,6087 **** --- 6082,6090 ---- int redraw_gui_only = FALSE; #endif int ft_changed = FALSE; + #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) + int did_swaptcap = FALSE; + #endif /* Get the global option to compare with, otherwise we would have to check * two values for all local options. */ *************** *** 6821,6826 **** --- 6824,6836 ---- vim_free(T_CCO); T_CCO = empty_option; } + #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) + if (is_term_win32()) + { + swap_tcap(); + did_swaptcap = TRUE; + } + #endif /* We now have a different color setup, initialize it again. */ init_highlight(TRUE, FALSE); } *************** *** 7674,7679 **** --- 7684,7699 ---- #endif check_redraw(options[opt_idx].flags); + #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) + if (did_swaptcap) + { + if (t_colors < 256) + p_tgc = 0; + set_termname((char_u *)"win32"); + init_highlight(TRUE, FALSE); + } + #endif + return errmsg; } *************** *** 8716,8722 **** p_tgc = 0; return (char_u*)N_("E954: 24-bit colors are not supported on this environment"); } ! swap_tcap(); # endif # ifdef FEAT_GUI if (!gui.in_use && !gui.starting) --- 8736,8743 ---- p_tgc = 0; return (char_u*)N_("E954: 24-bit colors are not supported on this environment"); } ! if (is_term_win32()) ! swap_tcap(); # endif # ifdef FEAT_GUI if (!gui.in_use && !gui.starting) *************** *** 8725,8731 **** # ifdef FEAT_VTP control_console_color_rgb(); /* reset t_Co */ ! if (STRCMP(T_NAME, "win32") == 0) set_termname(T_NAME); # endif } --- 8746,8752 ---- # ifdef FEAT_VTP control_console_color_rgb(); /* reset t_Co */ ! if (is_term_win32()) set_termname(T_NAME); # endif } *** ../vim-8.0.1782/src/os_win32.c 2018-03-20 11:41:40.644367052 +0100 --- src/os_win32.c 2018-05-01 15:34:57.709760723 +0200 *************** *** 214,220 **** static guicolor_T save_console_fg_rgb; # ifdef FEAT_TERMGUICOLORS ! # define USE_VTP (vtp_working && p_tgc) # else # define USE_VTP 0 # endif --- 214,220 ---- static guicolor_T save_console_fg_rgb; # ifdef FEAT_TERMGUICOLORS ! # define USE_VTP (vtp_working && is_term_win32() && (p_tgc || (!p_tgc && t_colors >= 256))) # else # define USE_VTP 0 # endif *************** *** 2630,2636 **** /* set termcap codes to current text attributes */ update_tcap(g_attrCurrent); - swap_tcap(); GetConsoleCursorInfo(g_hConOut, &g_cci); GetConsoleMode(g_hConIn, &g_cmodein); --- 2630,2635 ---- *************** *** 5763,5769 **** if (!USE_VTP) FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, n, coord, &dwDummy); else ! FillConsoleOutputAttribute(g_hConOut, 0, n, coord, &dwDummy); } --- 5762,5772 ---- if (!USE_VTP) FillConsoleOutputAttribute(g_hConOut, g_attrCurrent, n, coord, &dwDummy); else ! { ! set_console_color_rgb(); ! gotoxy(coord.X + 1, coord.Y + 1); ! vtp_printf("\033[%dX", n); ! } } *************** *** 7653,7658 **** --- 7656,7671 ---- vtp_printf((char *)buf); } + static int + ctermtoxterm( + int cterm) + { + uint8_t r, g, b, idx; + + cterm_color2rgb(cterm, &r, &g, &b, &idx); + return (((int)r << 16) | ((int)g << 8) | (int)b); + } + static void set_console_color_rgb(void) { *************** *** 7661,7666 **** --- 7674,7681 ---- int id; guicolor_T fg = INVALCOLOR; guicolor_T bg = INVALCOLOR; + int ctermfg; + int ctermbg; if (!USE_VTP) return; *************** *** 7669,7677 **** if (id > 0) syn_id2colors(id, &fg, &bg); if (fg == INVALCOLOR) ! fg = 0xc0c0c0; /* white text */ if (bg == INVALCOLOR) ! bg = 0x000000; /* black background */ fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg); bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); --- 7684,7702 ---- if (id > 0) syn_id2colors(id, &fg, &bg); if (fg == INVALCOLOR) ! { ! ctermfg = -1; ! if (id > 0) ! syn_id2cterm_bg(id, &ctermfg, &ctermbg); ! fg = ctermfg != -1 ? ctermtoxterm(ctermfg) : 0xc0c0c0; /* white */ ! } if (bg == INVALCOLOR) ! { ! ctermbg = -1; ! if (id > 0) ! syn_id2cterm_bg(id, &ctermfg, &ctermbg); ! bg = ctermbg != -1 ? ctermtoxterm(ctermbg) : 0x000000; /* black */ ! } fg = (GetRValue(fg) << 16) | (GetGValue(fg) << 8) | GetBValue(fg); bg = (GetRValue(bg) << 16) | (GetGValue(bg) << 8) | GetBValue(bg); *************** *** 7730,7733 **** --- 7755,7764 ---- return USE_VTP; } + int + is_term_win32(void) + { + return T_NAME != NULL && STRCMP(T_NAME, "win32") == 0; + } + #endif *** ../vim-8.0.1782/src/proto/os_win32.pro 2018-03-06 17:09:14.785600245 +0100 --- src/proto/os_win32.pro 2018-05-01 15:12:15.990452861 +0200 *************** *** 72,75 **** --- 72,76 ---- void control_console_color_rgb(void); int has_vtp_working(void); int use_vtp(void); + int is_term_win32(void); /* vim: set ft=c : */ *** ../vim-8.0.1782/src/term.c 2018-04-24 21:40:06.091502653 +0200 --- src/term.c 2018-05-01 15:38:28.180416981 +0200 *************** *** 2009,2019 **** may_req_termresponse(); #endif - #if defined(WIN3264) && !defined(FEAT_GUI) && defined(FEAT_TERMGUICOLORS) - if (STRCMP(term, "win32") == 0) - set_color_count((p_tgc) ? 256 : 16); - #endif - return OK; } --- 2009,2014 ---- *************** *** 2851,2857 **** /* Also accept "\e[3%dm" for TERMINFO, it is sometimes used */ /* Also accept CSI instead of [ */ if (n >= 8 && t_colors >= 16 ! && ((s[0] == ESC && s[1] == '[') || (s[0] == CSI && (i = 1) == 1)) && s[i] != NUL && (STRCMP(s + i + 1, "%p1%dm") == 0 || STRCMP(s + i + 1, "%dm") == 0) --- 2846,2856 ---- /* Also accept "\e[3%dm" for TERMINFO, it is sometimes used */ /* Also accept CSI instead of [ */ if (n >= 8 && t_colors >= 16 ! && ((s[0] == ESC && s[1] == '[') ! #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) ! || (s[0] == ESC && s[1] == '|') ! #endif ! || (s[0] == CSI && (i = 1) == 1)) && s[i] != NUL && (STRCMP(s + i + 1, "%p1%dm") == 0 || STRCMP(s + i + 1, "%dm") == 0) *************** *** 2863,2869 **** char *format = "%s%s%%dm"; #endif sprintf(buf, format, ! i == 2 ? IF_EB("\033[", ESC_STR "[") : "\233", s[i] == '3' ? (n >= 16 ? "38;5;" : "9") : (n >= 16 ? "48;5;" : "10")); OUT_STR(tgoto(buf, 0, n >= 16 ? n : n - 8)); --- 2862,2872 ---- char *format = "%s%s%%dm"; #endif sprintf(buf, format, ! i == 2 ? ! #if defined(FEAT_VTP) && defined(FEAT_TERMGUICOLORS) ! s[1] == '|' ? IF_EB("\033|", ESC_STR "|") : ! #endif ! IF_EB("\033[", ESC_STR "[") : "\233", s[i] == '3' ? (n >= 16 ? "38;5;" : "9") : (n >= 16 ? "48;5;" : "10")); OUT_STR(tgoto(buf, 0, n >= 16 ? n : n - 8)); *************** *** 6640,6665 **** } # ifdef FEAT_TERMGUICOLORS struct ks_tbl_s { ! int code; /* value of KS_ */ ! char *vtp; /* code in vtp mode */ ! char *buf; /* buffer in non-vtp mode */ ! char *vbuf; /* buffer in vtp mode */ }; static struct ks_tbl_s ks_tbl[] = { ! {(int)KS_ME, "\033|0m" }, /* normal */ ! {(int)KS_MR, "\033|7m" }, /* reverse */ ! {(int)KS_MD, "\033|1m" }, /* bold */ ! {(int)KS_SO, "\033|91m"}, /* standout: bright red text */ ! {(int)KS_SE, "\033|39m"}, /* standout end: default color */ ! {(int)KS_CZH, "\033|95m"}, /* italic: bright magenta text */ ! {(int)KS_CZR, "\033|0m",}, /* italic end */ ! {(int)KS_US, "\033|4m",}, /* underscore */ ! {(int)KS_UE, "\033|24m"}, /* underscore end */ ! {(int)KS_NAME, NULL} }; static struct builtin_term * --- 6643,6680 ---- } # ifdef FEAT_TERMGUICOLORS + # define KSSIZE 20 struct ks_tbl_s { ! int code; /* value of KS_ */ ! char *vtp; /* code in vtp mode */ ! char *vtp2; /* code in vtp2 mode */ ! char buf[KSSIZE]; /* save buffer in non-vtp mode */ ! char vbuf[KSSIZE]; /* save buffer in vtp mode */ ! char v2buf[KSSIZE]; /* save buffer in vtp2 mode */ ! char arr[KSSIZE]; /* real buffer */ }; static struct ks_tbl_s ks_tbl[] = { ! {(int)KS_ME, "\033|0m", "\033|0m"}, /* normal */ ! {(int)KS_MR, "\033|7m", "\033|7m"}, /* reverse */ ! {(int)KS_MD, "\033|1m", "\033|1m"}, /* bold */ ! {(int)KS_SO, "\033|91m", "\033|91m"}, /* standout: bright red text */ ! {(int)KS_SE, "\033|39m", "\033|39m"}, /* standout end: default color */ ! {(int)KS_CZH, "\033|95m", "\033|95m"}, /* italic: bright magenta text */ ! {(int)KS_CZR, "\033|0m", "\033|0m"}, /* italic end */ ! {(int)KS_US, "\033|4m", "\033|4m"}, /* underscore */ ! {(int)KS_UE, "\033|24m", "\033|24m"}, /* underscore end */ ! # ifdef TERMINFO ! {(int)KS_CAB, "\033|%p1%db", "\033|%p14%dm"}, /* set background color */ ! {(int)KS_CAF, "\033|%p1%df", "\033|%p13%dm"}, /* set foreground color */ ! # else ! {(int)KS_CAB, "\033|%db", "\033|4%dm"}, /* set background color */ ! {(int)KS_CAF, "\033|%df", "\033|3%dm"}, /* set foreground color */ ! # endif ! {(int)KS_CCO, "16", "256"}, /* colors */ ! {(int)KS_NAME} /* terminator */ }; static struct builtin_term * *************** *** 6684,6740 **** { # ifdef FEAT_TERMGUICOLORS static int init_done = FALSE; ! static int last_tgc; struct ks_tbl_s *ks; struct builtin_term *bt; /* buffer initialization */ if (!init_done) { ! for (ks = ks_tbl; ks->vtp != NULL; ks++) { bt = find_first_tcap(DEFAULT_TERM, ks->code); if (bt != NULL) { ! ks->buf = bt->bt_string; ! ks->vbuf = ks->vtp; } } init_done = TRUE; ! last_tgc = p_tgc; ! return; } ! if (last_tgc != p_tgc) { ! if (p_tgc) { ! /* switch to special character sequence */ ! for (ks = ks_tbl; ks->vtp != NULL; ks++) { ! bt = find_first_tcap(DEFAULT_TERM, ks->code); ! if (bt != NULL) ! { ! ks->buf = bt->bt_string; ! bt->bt_string = ks->vbuf; ! } } } ! else { ! /* switch to index color */ ! for (ks = ks_tbl; ks->vtp != NULL; ks++) { ! bt = find_first_tcap(DEFAULT_TERM, ks->code); ! if (bt != NULL) { ! ks->vbuf = bt->bt_string; ! bt->bt_string = ks->buf; } } } ! last_tgc = p_tgc; } # endif } --- 6699,6783 ---- { # ifdef FEAT_TERMGUICOLORS static int init_done = FALSE; ! static int curr_mode; struct ks_tbl_s *ks; struct builtin_term *bt; + int mode; + enum + { + CMODEINDEX, + CMODE24, + CMODE256 + }; /* buffer initialization */ if (!init_done) { ! for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++) { bt = find_first_tcap(DEFAULT_TERM, ks->code); if (bt != NULL) { ! STRNCPY(ks->buf, bt->bt_string, KSSIZE); ! STRNCPY(ks->vbuf, ks->vtp, KSSIZE); ! STRNCPY(ks->v2buf, ks->vtp2, KSSIZE); ! ! STRNCPY(ks->arr, bt->bt_string, KSSIZE); ! bt->bt_string = &ks->arr[0]; } } init_done = TRUE; ! curr_mode = CMODEINDEX; } ! if (p_tgc) ! mode = CMODE24; ! else if (t_colors >= 256) ! mode = CMODE256; ! else ! mode = CMODEINDEX; ! ! for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++) { ! bt = find_first_tcap(DEFAULT_TERM, ks->code); ! if (bt != NULL) { ! switch (curr_mode) { ! case CMODEINDEX: ! STRNCPY(&ks->buf[0], bt->bt_string, KSSIZE); ! break; ! case CMODE24: ! STRNCPY(&ks->vbuf[0], bt->bt_string, KSSIZE); ! break; ! default: ! STRNCPY(&ks->v2buf[0], bt->bt_string, KSSIZE); } } ! } ! ! if (mode != curr_mode) ! { ! for (ks = ks_tbl; ks->code != (int)KS_NAME; ks++) { ! bt = find_first_tcap(DEFAULT_TERM, ks->code); ! if (bt != NULL) { ! switch (mode) { ! case CMODEINDEX: ! STRNCPY(bt->bt_string, &ks->buf[0], KSSIZE); ! break; ! case CMODE24: ! STRNCPY(bt->bt_string, &ks->vbuf[0], KSSIZE); ! break; ! default: ! STRNCPY(bt->bt_string, &ks->v2buf[0], KSSIZE); } } } ! curr_mode = mode; } # endif } *************** *** 6920,6922 **** --- 6963,7041 ---- return color; } #endif + + #if (defined(WIN3264) && !defined(FEAT_GUI_W32)) || defined(FEAT_TERMINAL) \ + || defined(PROTO) + static int cube_value[] = { + 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF + }; + + static int grey_ramp[] = { + 0x08, 0x12, 0x1C, 0x26, 0x30, 0x3A, 0x44, 0x4E, 0x58, 0x62, 0x6C, 0x76, + 0x80, 0x8A, 0x94, 0x9E, 0xA8, 0xB2, 0xBC, 0xC6, 0xD0, 0xDA, 0xE4, 0xEE + }; + + # ifdef FEAT_TERMINAL + # include "libvterm/include/vterm.h" // for VTERM_ANSI_INDEX_NONE + # endif + + static uint8_t ansi_table[16][4] = { + // R G B idx + { 0, 0, 0, 1}, // black + {224, 0, 0, 2}, // dark red + { 0, 224, 0, 3}, // dark green + {224, 224, 0, 4}, // dark yellow / brown + { 0, 0, 224, 5}, // dark blue + {224, 0, 224, 6}, // dark magenta + { 0, 224, 224, 7}, // dark cyan + {224, 224, 224, 8}, // light grey + + {128, 128, 128, 9}, // dark grey + {255, 64, 64, 10}, // light red + { 64, 255, 64, 11}, // light green + {255, 255, 64, 12}, // yellow + { 64, 64, 255, 13}, // light blue + {255, 64, 255, 14}, // light magenta + { 64, 255, 255, 15}, // light cyan + {255, 255, 255, 16}, // white + }; + + void + cterm_color2rgb(int nr, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *ansi_idx) + { + int idx; + + if (nr < 16) + { + *r = ansi_table[nr][0]; + *g = ansi_table[nr][1]; + *b = ansi_table[nr][2]; + *ansi_idx = ansi_table[nr][3]; + } + else if (nr < 232) + { + /* 216 color cube */ + idx = nr - 16; + *r = cube_value[idx / 36 % 6]; + *g = cube_value[idx / 6 % 6]; + *b = cube_value[idx % 6]; + *ansi_idx = VTERM_ANSI_INDEX_NONE; + } + else if (nr < 256) + { + /* 24 grey scale ramp */ + idx = nr - 232; + *r = grey_ramp[idx]; + *g = grey_ramp[idx]; + *b = grey_ramp[idx]; + *ansi_idx = VTERM_ANSI_INDEX_NONE; + } + else + { + *r = 0; + *g = 0; + *b = 0; + *ansi_idx = 0; + } + } + #endif *** ../vim-8.0.1782/src/proto/term.pro 2018-03-03 21:29:46.918813940 +0100 --- src/proto/term.pro 2018-05-01 15:33:45.726221905 +0200 *************** *** 76,79 **** --- 76,80 ---- void swap_tcap(void); guicolor_T gui_get_color_cmn(char_u *name); guicolor_T gui_get_rgb_color_cmn(int r, int g, int b); + void cterm_color2rgb(int nr, uint8_t *r, uint8_t *g, uint8_t *b, uint8_t *ansi_idx); /* vim: set ft=c : */ *** ../vim-8.0.1782/src/terminal.c 2018-04-21 23:34:38.526654077 +0200 --- src/terminal.c 2018-05-01 15:25:48.069316925 +0200 *************** *** 43,49 **** * - Win32: Redirecting output does not work, Test_terminal_redir_file() * is disabled. * - Add test for 'termwinkey'. - * - libvterm: bringg back using // comments and trailing comma in enum * - When starting terminal window with shell in terminal, then using :gui to * switch to GUI, shell stops working. Scrollback seems wrong, command * running in shell is still running. --- 43,48 ---- *************** *** 3016,3081 **** return cell2attr(cellattr->attrs, cellattr->fg, cellattr->bg); } - static VTermColor ansi_table[16] = { - { 0, 0, 0, 1}, /* black */ - {224, 0, 0, 2}, /* dark red */ - { 0, 224, 0, 3}, /* dark green */ - {224, 224, 0, 4}, /* dark yellow / brown */ - { 0, 0, 224, 5}, /* dark blue */ - {224, 0, 224, 6}, /* dark magenta */ - { 0, 224, 224, 7}, /* dark cyan */ - {224, 224, 224, 8}, /* light grey */ - - {128, 128, 128, 9}, /* dark grey */ - {255, 64, 64, 10}, /* light red */ - { 64, 255, 64, 11}, /* light green */ - {255, 255, 64, 12}, /* yellow */ - { 64, 64, 255, 13}, /* light blue */ - {255, 64, 255, 14}, /* light magenta */ - { 64, 255, 255, 15}, /* light cyan */ - {255, 255, 255, 16}, /* white */ - }; - - static int cube_value[] = { - 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF - }; - - static int grey_ramp[] = { - 0x08, 0x12, 0x1C, 0x26, 0x30, 0x3A, 0x44, 0x4E, 0x58, 0x62, 0x6C, 0x76, - 0x80, 0x8A, 0x94, 0x9E, 0xA8, 0xB2, 0xBC, 0xC6, 0xD0, 0xDA, 0xE4, 0xEE - }; - /* * Convert a cterm color number 0 - 255 to RGB. * This is compatible with xterm. */ static void ! cterm_color2rgb(int nr, VTermColor *rgb) { ! int idx; ! ! if (nr < 16) ! { ! *rgb = ansi_table[nr]; ! } ! else if (nr < 232) ! { ! /* 216 color cube */ ! idx = nr - 16; ! rgb->blue = cube_value[idx % 6]; ! rgb->green = cube_value[idx / 6 % 6]; ! rgb->red = cube_value[idx / 36 % 6]; ! rgb->ansi_index = VTERM_ANSI_INDEX_NONE; ! } ! else if (nr < 256) ! { ! /* 24 grey scale ramp */ ! idx = nr - 232; ! rgb->blue = grey_ramp[idx]; ! rgb->green = grey_ramp[idx]; ! rgb->red = grey_ramp[idx]; ! rgb->ansi_index = VTERM_ANSI_INDEX_NONE; ! } } /* --- 3015,3028 ---- return cell2attr(cellattr->attrs, cellattr->fg, cellattr->bg); } /* * Convert a cterm color number 0 - 255 to RGB. * This is compatible with xterm. */ static void ! cterm_color2vterm(int nr, VTermColor *rgb) { ! cterm_color2rgb(nr, &rgb->red, &rgb->green, &rgb->blue, &rgb->ansi_index); } /* *************** *** 3120,3125 **** --- 3067,3076 ---- # endif # ifdef FEAT_TERMGUICOLORS || p_tgc + # ifdef FEAT_VTP + /* Finally get INVALCOLOR on this execution path */ + || (!p_tgc && t_colors >= 256) + # endif # endif ) { *************** *** 3171,3179 **** if (id != 0 && t_colors >= 16) { if (term_default_cterm_fg >= 0) ! cterm_color2rgb(term_default_cterm_fg, fg); if (term_default_cterm_bg >= 0) ! cterm_color2rgb(term_default_cterm_bg, bg); } else { --- 3122,3130 ---- if (id != 0 && t_colors >= 16) { if (term_default_cterm_fg >= 0) ! cterm_color2vterm(term_default_cterm_fg, fg); if (term_default_cterm_bg >= 0) ! cterm_color2vterm(term_default_cterm_bg, bg); } else { *************** *** 3184,3190 **** /* In an MS-Windows console we know the normal colors. */ if (cterm_normal_fg_color > 0) { ! cterm_color2rgb(cterm_normal_fg_color - 1, fg); # if defined(WIN3264) && !defined(FEAT_GUI_W32) tmp = fg->red; fg->red = fg->blue; --- 3135,3141 ---- /* In an MS-Windows console we know the normal colors. */ if (cterm_normal_fg_color > 0) { ! cterm_color2vterm(cterm_normal_fg_color - 1, fg); # if defined(WIN3264) && !defined(FEAT_GUI_W32) tmp = fg->red; fg->red = fg->blue; *************** *** 3198,3204 **** if (cterm_normal_bg_color > 0) { ! cterm_color2rgb(cterm_normal_bg_color - 1, bg); # if defined(WIN3264) && !defined(FEAT_GUI_W32) tmp = bg->red; bg->red = bg->blue; --- 3149,3155 ---- if (cterm_normal_bg_color > 0) { ! cterm_color2vterm(cterm_normal_bg_color - 1, bg); # if defined(WIN3264) && !defined(FEAT_GUI_W32) tmp = bg->red; bg->red = bg->blue; *** ../vim-8.0.1782/src/version.c 2018-05-01 15:01:56.938414623 +0200 --- src/version.c 2018-05-01 15:13:10.810105462 +0200 *************** *** 763,764 **** --- 763,766 ---- { /* Add new patch number below this line */ + /**/ + 1783, /**/ -- FATHER: Who are you? PRINCE: I'm ... your son ... FATHER: Not you. LAUNCELOT: I'm ... er ... Sir Launcelot, sir. "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 ///