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 -- [email protected] -- 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    ///

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/vim_dev/201905301322.x4UDMxIQ004760%40masaka.moolenaar.net.
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui