# HG changeset patch # User Christian Brabandt # Date 1525095907 -7200 # Node ID cad480bac9e1b35610d0fd7960fd979681260d36 # Parent 1369d55a28394e8fb52cf5195e9b186159450ab3 patch 8.0.1777: cannot cleanup before loading another colorscheme commit https://github.com/vim/vim/commit/60a68362aa73f4a6cb534688978f9dc2b16e60fe Author: Bram Moolenaar Date: Mon Apr 30 15:40:48 2018 +0200 patch 8.0.1777: cannot cleanup before loading another colorscheme Problem: Cannot cleanup before loading another colorscheme. Solution: Add the ColorSchemePre autocommand event. diff --git a/runtime/colors/README.txt b/runtime/colors/README.txt --- 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 --- 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 --- 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 --- 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 --- a/src/version.c +++ b/src/version.c @@ -762,6 +762,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 1777, +/**/ 1776, /**/ 1775, diff --git a/src/vim.h b/src/vim.h --- 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 */