Mercurial > vim
diff src/option.c @ 14867:cf4d6489c9eb v8.1.0445
patch 8.1.0445: setting 'term' does not store location for termcap options
commit https://github.com/vim/vim/commit/35bc7d6c52f516b60d683bf9f0f57266d86e25b9
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Oct 2 14:45:10 2018 +0200
patch 8.1.0445: setting 'term' does not store location for termcap options
Problem: Setting 'term' does not store location for termcap options.
Solution: Set the script context for termcap options that are changed when
'term' is set.
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Tue, 02 Oct 2018 15:00:07 +0200 |
parents | 27b9a84395b5 |
children | dc54785f9a1d |
line wrap: on
line diff
--- a/src/option.c +++ b/src/option.c @@ -1755,12 +1755,12 @@ static struct vimoption options[] = {"langmap", "lmap", P_STRING|P_VI_DEF|P_ONECOMMA|P_NODUP|P_SECURE, #ifdef FEAT_LANGMAP (char_u *)&p_langmap, PV_NONE, - {(char_u *)"", /* unmatched } */ -#else - (char_u *)NULL, PV_NONE, - {(char_u *)NULL, -#endif - (char_u *)0L} SCTX_INIT}, + {(char_u *)"", (char_u *)0L} +#else + (char_u *)NULL, PV_NONE, + {(char_u *)NULL, (char_u *)0L} +#endif + SCTX_INIT}, {"langmenu", "lm", P_STRING|P_VI_DEF|P_NFNAME, #if defined(FEAT_MENU) && defined(FEAT_MULTI_LANG) (char_u *)&p_lm, PV_NONE, @@ -5790,20 +5790,32 @@ check_string_option(char_u **pp) } /* - * Mark a terminal option as allocated, found by a pointer into term_strings[]. - */ - void -set_term_option_alloced(char_u **p) -{ - int opt_idx; + * Return the option index found by a pointer into term_strings[]. + * Return -1 if not found. + */ + int +get_term_opt_idx(char_u **p) +{ + int opt_idx; for (opt_idx = 1; options[opt_idx].fullname != NULL; opt_idx++) if (options[opt_idx].var == (char_u *)p) - { - options[opt_idx].flags |= P_ALLOCED; - return; - } - return; /* cannot happen: didn't find it! */ + return opt_idx; + return -1; // cannot happen: didn't find it! +} + +/* + * Mark a terminal option as allocated, found by a pointer into term_strings[]. + * Return the option index or -1 if not found. + */ + int +set_term_option_alloced(char_u **p) +{ + int opt_idx = get_term_opt_idx(p); + + if (opt_idx >= 0) + options[opt_idx].flags |= P_ALLOCED; + return opt_idx; } #if defined(FEAT_EVAL) || defined(PROTO) @@ -8237,6 +8249,32 @@ set_option_sctx_idx(int opt_idx, int opt curwin->w_p_script_ctx[indir & PV_MASK] = new_script_ctx; } } + +/* + * Set the script_ctx for a termcap option. + * "name" must be the two character code, e.g. "RV". + * When "name" is NULL use "opt_idx". + */ + void +set_term_option_sctx_idx(char *name, int opt_idx) +{ + char_u buf[5]; + int idx; + + if (name == NULL) + idx = opt_idx; + else + { + buf[0] = 't'; + buf[1] = '_'; + buf[2] = name[0]; + buf[3] = name[1]; + buf[4] = 0; + idx = findoption(buf); + } + if (idx >= 0) + set_option_sctx_idx(idx, OPT_GLOBAL, current_sctx); +} #endif /* @@ -10445,7 +10483,7 @@ free_termoptions(void) { struct vimoption *p; - for (p = &options[0]; p->fullname != NULL; p++) + for (p = options; p->fullname != NULL; p++) if (istermoption(p)) { if (p->flags & P_ALLOCED) @@ -10455,6 +10493,10 @@ free_termoptions(void) *(char_u **)(p->var) = empty_option; p->def_val[VI_DEFAULT] = empty_option; p->flags &= ~(P_ALLOCED|P_DEF_ALLOCED); +#ifdef FEAT_EVAL + // remember where the option was cleared + set_option_sctx_idx((int)(p - options), OPT_GLOBAL, current_sctx); +#endif } clear_termcodes(); }