]> granicus.if.org Git - vim/commitdiff
patch 8.1.1423: popup windows use options from current window and buffer v8.1.1423
authorBram Moolenaar <Bram@vim.org>
Thu, 30 May 2019 13:22:43 +0000 (15:22 +0200)
committerBram Moolenaar <Bram@vim.org>
Thu, 30 May 2019 13:22:43 +0000 (15:22 +0200)
Problem:    Popup windows use options from current window and buffer.
Solution:   Clear all local options when creating a popup window.

src/option.c
src/popupwin.c
src/proto/option.pro
src/testdir/test_popupwin.vim
src/version.c

index c365ca6214406d022118b1ee3fb38ec22b649709..2146be7ef6fb03d74a41556273583319fafa16f6 100644 (file)
@@ -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;
index 0ad24cf877702dc070cc0ef96df1197d53953089..c9265367bfca1d81f9c6a55a3e08d14f1a0d3706 100644 (file)
@@ -253,6 +253,10 @@ f_popup_create(typval_T *argvars, typval_T *rettv)
     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,8 +266,6 @@ f_popup_create(typval_T *argvars, typval_T *rettv)
     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)
     {
index 4a0da1cd44351da099ff8d14e6bbe27627584aa7..49b2b657065438a85b2ee61e4ccc13ea0092319a 100644 (file)
@@ -2,6 +2,7 @@
 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);
index a11e5a03f34457d115f1016acbc0ef0d8a398a50..3e71c97ea91a64433d4b5eb41cf470a67d6b0b5d 100644 (file)
@@ -264,3 +264,26 @@ func Test_popup_getoptions()
   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
index 8519fd5cdbbcd88955a9567f2a3831e6bc27d533..2d70ed51d05a11047b44f75ba6d2ea326438be99 100644 (file)
@@ -767,6 +767,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1423,
 /**/
     1422,
 /**/