From 52ebe34eebf361f28b1a374399cd7e3d8201bfb2 Mon Sep 17 00:00:00 2001 From: Jan Edmund Lazo Date: Thu, 21 Jun 2018 05:15:11 -0400 Subject: vim-patch:8.0.0616: not always setting 'background' correctly after :hi Normal (#8606) Problem: When setting the cterm background with ":hi Normal" the value of 'background' may be set wrongly. Solution: Check that the color is less than 16. Don't set 'background' when it was set explicitly. (Lemonboy, closes vim/vim#1710) https://github.com/vim/vim/commit/1615b36b91b094263240d7b555283ddf33208f62 Restore reset_option_was_set(), removed in 419da839e0cbdf6251bc31dc218fa629ccc91b44 ref #8595 ref #8597 --- src/nvim/option.c | 14 +++++++++++++- src/nvim/syntax.c | 16 +++++++++++----- src/nvim/testdir/test_syntax.vim | 23 +++++++++++++++++++++++ 3 files changed, 47 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/nvim/option.c b/src/nvim/option.c index 68b0a525f1..61570a75b1 100644 --- a/src/nvim/option.c +++ b/src/nvim/option.c @@ -6599,7 +6599,7 @@ void vimrc_found(char_u *fname, char_u *envname) /// @param[in] name Option name. /// /// @return True if it was set. -static bool option_was_set(const char *name) +bool option_was_set(const char *name) { int idx; @@ -6612,6 +6612,18 @@ static bool option_was_set(const char *name) return false; } +/// Reset the flag indicating option "name" was set. +/// +/// @param[in] name Option name. +void reset_option_was_set(const char *name) +{ + const int idx = findoption(name); + + if (idx >= 0) { + options[idx].flags &= ~P_WAS_SET; + } +} + /* * fill_breakat_flags() -- called when 'breakat' changes value. */ diff --git a/src/nvim/syntax.c b/src/nvim/syntax.c index 63c7ffbadf..45f40e8592 100644 --- a/src/nvim/syntax.c +++ b/src/nvim/syntax.c @@ -6812,15 +6812,21 @@ void do_highlight(const char *line, const bool forceit, const bool init) if (!ui_rgb_attached()) { must_redraw = CLEAR; if (color >= 0) { + int dark = -1; + if (t_colors < 16) { - i = (color == 0 || color == 4); - } else { - i = (color < 7 || color == 8); + dark = (color == 0 || color == 4); + } else if (color < 16) { + // Limit the heuristic to the standard 16 colors + dark = (color < 7 || color == 8); } // Set the 'background' option if the value is // wrong. - if (i != (*p_bg == 'd')) { - set_option_value("bg", 0L, (i ? "dark" : "light"), 0); + if (dark != -1 + && dark != (*p_bg == 'd') + && !option_was_set("bg")) { + set_option_value("bg", 0L, (dark ? "dark" : "light"), 0); + reset_option_was_set("bg"); } } } diff --git a/src/nvim/testdir/test_syntax.vim b/src/nvim/testdir/test_syntax.vim index ebdfc250aa..6d164ac895 100644 --- a/src/nvim/testdir/test_syntax.vim +++ b/src/nvim/testdir/test_syntax.vim @@ -435,3 +435,26 @@ func Test_conceal() bw! endfunc +func Test_bg_detection() + if has('gui_running') + return + endif + " auto-detection of &bg, make sure sure it isn't set anywhere before + " this test + hi Normal ctermbg=0 + call assert_equal('dark', &bg) + hi Normal ctermbg=4 + call assert_equal('dark', &bg) + hi Normal ctermbg=12 + call assert_equal('light', &bg) + hi Normal ctermbg=15 + call assert_equal('light', &bg) + + " manually-set &bg takes precendence over auto-detection + set bg=light + hi Normal ctermbg=4 + call assert_equal('light', &bg) + set bg=dark + hi Normal ctermbg=12 + call assert_equal('dark', &bg) +endfunc -- cgit