diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-05-30 15:22:43 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-05-30 15:22:43 +0200 |
commit | cacc6a5c986fbc716bf53b6916f076dd7b388142 (patch) | |
tree | 0ee5ba38b112dfb23fbf987133f8cb13c5dcd1ff /src/option.c | |
parent | 8c2a600f72ca930841a5f4f7eac22884238afaf3 (diff) | |
download | vim-git-cacc6a5c986fbc716bf53b6916f076dd7b388142.tar.gz |
patch 8.1.1423: popup windows use options from current window and bufferv8.1.1423
Problem: Popup windows use options from current window and buffer.
Solution: Clear all local options when creating a popup window.
Diffstat (limited to 'src/option.c')
-rw-r--r-- | src/option.c | 42 |
1 files changed, 36 insertions, 6 deletions
diff --git a/src/option.c b/src/option.c index c365ca621..2146be7ef 100644 --- a/src/option.c +++ b/src/option.c @@ -3269,7 +3269,7 @@ static void check_redraw(long_u flags); static int findoption(char_u *); static int find_key_option(char_u *arg_arg, int has_lt); static void showoptions(int all, int opt_flags); -static int optval_default(struct vimoption *, char_u *varp); +static int optval_default(struct vimoption *, char_u *varp, int compatible); static void showoneopt(struct vimoption *, int opt_flags); static int put_setstring(FILE *fd, char *cmd, char *name, char_u **valuep, long_u flags); static int put_setnum(FILE *fd, char *cmd, char *name, long *valuep); @@ -3893,6 +3893,36 @@ set_number_default(char *name, long val) options[opt_idx].def_val[VI_DEFAULT] = (char_u *)(long_i)val; } +/* + * Set all window-local and buffer-local options to the Vim default. + * local-global options will use the global value. + */ + void +set_local_options_default(win_T *wp) +{ + win_T *save_curwin = curwin; + int i; + + curwin = wp; + curbuf = curwin->w_buffer; + block_autocmds(); + + for (i = 0; !istermoption(&options[i]); i++) + { + struct vimoption *p = &(options[i]); + char_u *varp = get_varp_scope(p, OPT_LOCAL); + + if (p->indir != PV_NONE + && !(options[i].flags & P_NODEFAULT) + && !optval_default(p, varp, FALSE)) + set_option_default(i, OPT_LOCAL, FALSE); + } + + unblock_autocmds(); + curwin = save_curwin; + curbuf = curwin->w_buffer; +} + #if defined(EXITFREE) || defined(PROTO) /* * Free all options. @@ -10149,7 +10179,7 @@ showoptions( if (varp != NULL && ((all == 2 && isterm) || (all == 1 && !isterm) - || (all == 0 && !optval_default(p, varp)))) + || (all == 0 && !optval_default(p, varp, p_cp)))) { if (p->flags & P_BOOL) len = 1; /* a toggle option fits always */ @@ -10199,13 +10229,13 @@ showoptions( * Return TRUE if option "p" has its default value. */ static int -optval_default(struct vimoption *p, char_u *varp) +optval_default(struct vimoption *p, char_u *varp, int compatible) { int dvi; if (varp == NULL) return TRUE; /* hidden option is always at default */ - dvi = ((p->flags & P_VI_DEF) || p_cp) ? VI_DEFAULT : VIM_DEFAULT; + dvi = ((p->flags & P_VI_DEF) || compatible) ? VI_DEFAULT : VIM_DEFAULT; if (p->flags & P_NUM) return (*(long *)varp == (long)(long_i)p->def_val[dvi]); if (p->flags & P_BOOL) @@ -10311,7 +10341,7 @@ makeset(FILE *fd, int opt_flags, int local_only) /* Global values are only written when not at the default value. */ varp = get_varp_scope(p, opt_flags); - if ((opt_flags & OPT_GLOBAL) && optval_default(p, varp)) + if ((opt_flags & OPT_GLOBAL) && optval_default(p, varp, p_cp)) continue; round = 2; @@ -10327,7 +10357,7 @@ makeset(FILE *fd, int opt_flags, int local_only) if (!(opt_flags & OPT_GLOBAL) && !local_only) { varp_fresh = get_varp_scope(p, OPT_GLOBAL); - if (!optval_default(p, varp_fresh)) + if (!optval_default(p, varp_fresh, p_cp)) { round = 1; varp_local = varp; |