To: vim_dev@googlegroups.com Subject: Patch 8.1.1423 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 8.1.1423 Problem: Popup windows use options from current window and buffer. Solution: Clear all local options when creating a popup window. Files: src/popupwin.c, src/option.c, src/proto/option.pro, src/testdir/test_popupwin.vim *** ../vim-8.1.1422/src/popupwin.c 2019-05-30 14:29:42.597507636 +0200 --- src/popupwin.c 2019-05-30 15:00:03.807391833 +0200 *************** *** 253,258 **** --- 253,262 ---- if (buf == NULL) return; ml_open(buf); + + win_init_popup_win(wp, buf); + + set_local_options_default(wp); set_string_option_direct_in_buf(buf, (char_u *)"buftype", -1, (char_u *)"popup", OPT_FREE|OPT_LOCAL, 0); set_string_option_direct_in_buf(buf, (char_u *)"bufhidden", -1, *************** *** 262,269 **** buf->b_p_bl = FALSE; // unlisted buffer buf->b_locked = TRUE; - win_init_popup_win(wp, buf); - nr = (int)dict_get_number(d, (char_u *)"tab"); if (nr == 0) { --- 266,271 ---- *** ../vim-8.1.1422/src/option.c 2019-05-28 23:08:12.072648675 +0200 --- src/option.c 2019-05-30 15:17:11.233968834 +0200 *************** *** 3269,3275 **** 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 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); --- 3269,3275 ---- 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, 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,3898 **** --- 3893,3928 ---- 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,10155 **** if (varp != NULL && ((all == 2 && isterm) || (all == 1 && !isterm) ! || (all == 0 && !optval_default(p, varp)))) { if (p->flags & P_BOOL) len = 1; /* a toggle option fits always */ --- 10179,10185 ---- if (varp != NULL && ((all == 2 && isterm) || (all == 1 && !isterm) ! || (all == 0 && !optval_default(p, varp, p_cp)))) { if (p->flags & P_BOOL) len = 1; /* a toggle option fits always */ *************** *** 10199,10211 **** * Return TRUE if option "p" has its default value. */ static int ! optval_default(struct vimoption *p, char_u *varp) { 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; if (p->flags & P_NUM) return (*(long *)varp == (long)(long_i)p->def_val[dvi]); if (p->flags & P_BOOL) --- 10229,10241 ---- * Return TRUE if option "p" has its default value. */ static int ! 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) || 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,10317 **** /* 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)) continue; round = 2; --- 10341,10347 ---- /* 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, p_cp)) continue; round = 2; *************** *** 10327,10333 **** if (!(opt_flags & OPT_GLOBAL) && !local_only) { varp_fresh = get_varp_scope(p, OPT_GLOBAL); ! if (!optval_default(p, varp_fresh)) { round = 1; varp_local = varp; --- 10357,10363 ---- if (!(opt_flags & OPT_GLOBAL) && !local_only) { varp_fresh = get_varp_scope(p, OPT_GLOBAL); ! if (!optval_default(p, varp_fresh, p_cp)) { round = 1; varp_local = varp; *** ../vim-8.1.1422/src/proto/option.pro 2019-05-26 21:03:19.940073927 +0200 --- src/proto/option.pro 2019-05-30 14:42:45.737186164 +0200 *************** *** 2,7 **** --- 2,8 ---- void set_init_1(int clean_arg); void set_string_default(char *name, char_u *val); void set_number_default(char *name, long val); + void set_local_options_default(win_T *wp); void free_all_options(void); void set_init_2(void); void set_init_3(void); *** ../vim-8.1.1422/src/testdir/test_popupwin.vim 2019-05-30 14:29:42.597507636 +0200 --- src/testdir/test_popupwin.vim 2019-05-30 15:18:36.037507243 +0200 *************** *** 264,266 **** --- 264,289 ---- call popup_close(winid) call assert_equal({}, popup_getoptions(winid)) endfunc + + func Test_popup_option_values() + new + " window-local + setlocal number + setlocal nowrap + " buffer-local + setlocal omnifunc=Something + " global/buffer-local + setlocal path=/there + " global/window-local + setlocal scrolloff=9 + + let winid = popup_create('hello', {}) + call assert_equal(0, getwinvar(winid, '&number')) + call assert_equal(1, getwinvar(winid, '&wrap')) + call assert_equal('', getwinvar(winid, '&omnifunc')) + call assert_equal(&g:path, getwinvar(winid, '&path')) + call assert_equal(&g:scrolloff, getwinvar(winid, '&scrolloff')) + + call popup_close(winid) + bwipe + endfunc *** ../vim-8.1.1422/src/version.c 2019-05-30 14:29:42.597507636 +0200 --- src/version.c 2019-05-30 14:42:37.873229921 +0200 *************** *** 769,770 **** --- 769,772 ---- { /* Add new patch number below this line */ + /**/ + 1423, /**/ -- hundred-and-one symptoms of being an internet addict: 51. You put a pillow case over your laptop so your lover doesn't see it while you are pretending to catch your breath. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ an exciting new programming language -- http://www.Zimbu.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///