From 60a68362aa73f4a6cb534688978f9dc2b16e60fe Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Mon, 30 Apr 2018 15:40:48 +0200 Subject: patch 8.0.1777: cannot cleanup before loading another colorscheme Problem: Cannot cleanup before loading another colorscheme. Solution: Add the ColorSchemePre autocommand event. --- runtime/colors/README.txt | 11 ++++++++++- src/fileio.c | 5 ++++- src/syntax.c | 2 ++ src/testdir/test_gui.vim | 12 ++++++++++++ src/version.c | 2 ++ src/vim.h | 1 + 6 files changed, 31 insertions(+), 2 deletions(-) diff --git a/runtime/colors/README.txt b/runtime/colors/README.txt index a435c2dd19..4511748daf 100644 --- a/runtime/colors/README.txt +++ b/runtime/colors/README.txt @@ -42,7 +42,16 @@ this autocmd might be useful: Replace "blue_sky" with the name of the colorscheme. In case you want to tweak a colorscheme after it was loaded, check out the -ColorScheme autocmd event. +ColorScheme autocommand event. + +To clean up just before loading another colorscheme, use the ColorSchemePre +autocommand event. For example: + let g:term_ansi_colors = ... + augroup MyColorscheme + au! + au ColorSchemePre * unlet g:term_ansi_colors + au ColorSchemePre * au! MyColorscheme + augroup END To customize a colorscheme use another name, e.g. "~/.vim/colors/mine.vim", and use `:runtime` to load the original colorscheme: diff --git a/src/fileio.c b/src/fileio.c index 6b48c39d32..63cc61c432 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -7734,6 +7734,7 @@ static struct event_name {"CmdwinLeave", EVENT_CMDWINLEAVE}, {"CmdUndefined", EVENT_CMDUNDEFINED}, {"ColorScheme", EVENT_COLORSCHEME}, + {"ColorSchemePre", EVENT_COLORSCHEMEPRE}, {"CompleteDone", EVENT_COMPLETEDONE}, {"CursorHold", EVENT_CURSORHOLD}, {"CursorHoldI", EVENT_CURSORHOLDI}, @@ -9479,7 +9480,8 @@ apply_autocmds_group( */ if (fname_io == NULL) { - if (event == EVENT_COLORSCHEME || event == EVENT_OPTIONSET) + if (event == EVENT_COLORSCHEME || event == EVENT_COLORSCHEMEPRE + || event == EVENT_OPTIONSET) autocmd_fname = NULL; else if (fname != NULL && !ends_excmd(*fname)) autocmd_fname = fname; @@ -9549,6 +9551,7 @@ apply_autocmds_group( || event == EVENT_SPELLFILEMISSING || event == EVENT_QUICKFIXCMDPRE || event == EVENT_COLORSCHEME + || event == EVENT_COLORSCHEMEPRE || event == EVENT_OPTIONSET || event == EVENT_QUICKFIXCMDPOST || event == EVENT_DIRCHANGED) diff --git a/src/syntax.c b/src/syntax.c index e945dac045..bb695b5734 100644 --- a/src/syntax.c +++ b/src/syntax.c @@ -7224,6 +7224,8 @@ load_colors(char_u *name) buf = alloc((unsigned)(STRLEN(name) + 12)); if (buf != NULL) { + apply_autocmds(EVENT_COLORSCHEMEPRE, name, + curbuf->b_fname, FALSE, curbuf); sprintf((char *)buf, "colors/%s.vim", name); retval = source_runtime(buf, DIP_START + DIP_OPT); vim_free(buf); diff --git a/src/testdir/test_gui.vim b/src/testdir/test_gui.vim index 50a629b2ee..9d8a36f188 100644 --- a/src/testdir/test_gui.vim +++ b/src/testdir/test_gui.vim @@ -33,13 +33,25 @@ endfunc func Test_colorscheme() let colorscheme_saved = exists('g:colors_name') ? g:colors_name : 'default' + let g:color_count = 0 + augroup TestColors + au! + au ColorScheme * let g:color_count += 1| let g:after_colors = g:color_count + au ColorSchemePre * let g:color_count += 1 |let g:before_colors = g:color_count + augroup END colorscheme torte redraw! sleep 200m call assert_equal('dark', &background) + call assert_equal(1, g:before_colors) + call assert_equal(2, g:after_colors) exec 'colorscheme' colorscheme_saved + augroup TestColors + au! + augroup END + unlet g:color_count g:after_colors g:before_colors redraw! endfunc diff --git a/src/version.c b/src/version.c index 9881dae868..d6be02f0a1 100644 --- a/src/version.c +++ b/src/version.c @@ -761,6 +761,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ +/**/ + 1777, /**/ 1776, /**/ diff --git a/src/vim.h b/src/vim.h index af01f1a51b..0a4a490186 100644 --- a/src/vim.h +++ b/src/vim.h @@ -1277,6 +1277,7 @@ enum auto_event EVENT_CMDWINENTER, /* after entering the cmdline window */ EVENT_CMDWINLEAVE, /* before leaving the cmdline window */ EVENT_COLORSCHEME, /* after loading a colorscheme */ + EVENT_COLORSCHEMEPRE, /* before loading a colorscheme */ EVENT_COMPLETEDONE, /* after finishing insert complete */ EVENT_CURSORHOLD, /* cursor in same position for a while */ EVENT_CURSORHOLDI, /* idem, in Insert mode */ -- cgit v1.2.3