Patch 7.4.786
Problem:    It is not possible for a plugin to adjust to a changed setting.
Solution:   Add the OptionSet autocommand event. (Christian Brabandt)
Files:      runtime/doc/autocmd.txt, runtime/doc/eval.txt, src/eval.c,
            src/fileio.c, src/option.c, src/proto/eval.pro,
            src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
            src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
            src/testdir/Make_vms.mms, src/testdir/Makefile,
            src/testdir/test_autocmd_option.in,
            src/testdir/test_autocmd_option.ok, src/vim.h


*** ../vim-7.4.785/runtime/doc/autocmd.txt      2015-07-10 17:56:18.211777230 
+0200
--- runtime/doc/autocmd.txt     2015-07-17 15:03:42.523751972 +0200
***************
*** 259,264 ****
--- 259,265 ----
  |Syntax|              when the 'syntax' option has been set
  |EncodingChanged|     after the 'encoding' option has been changed
  |TermChanged|         after the value of 'term' has changed
+ |OptionSet|           after setting any option
  
        Startup and exit
  |VimEnter|            after doing all the startup stuff
***************
*** 732,737 ****
--- 745,771 ----
                                        o       Operator-pending
                                        i       Insert
                                        c       Command line
+                                                       *OptionSet*
+ OptionSet                     After setting an option.  The pattern is
+                               matched against the long option name.
+                               The |v:option_old| variable indicates the
+                               old option value, |v:option_new| variable
+                               indicates the newly set value, the
+                               |v:option_type| variable indicates whether
+                               it's global or local scoped and |<amatch>|
+                               indicates what option has been set.
+ 
+                               Is not triggered on startup and for the 'key'
+                               option for obvious reasons.
+ 
+                               Note: It's a bad idea, to reset an option
+                               during this autocommand, since this will
+                               probably break plugins. You can always use
+                               |noa| to prevent triggering this autocommand.
+                               Could be used, to check for existence of the
+                               'backupdir' and 'undodir' options and create
+                               directories, if they don't exist yet.
+ 
                                                        *QuickFixCmdPre*
  QuickFixCmdPre                        Before a quickfix command is run 
(|:make|,
                                |:lmake|, |:grep|, |:lgrep|, |:grepadd|,
*** ../vim-7.4.785/runtime/doc/eval.txt 2015-07-10 17:56:18.211777230 +0200
--- runtime/doc/eval.txt        2015-07-17 15:05:12.834890842 +0200
***************
*** 1533,1538 ****
--- 1535,1549 ----
                than String this will cause trouble.
                {only when compiled with the |+viminfo| feature}
  
+                                                   *v:option_new*
+ v:option_new    New value of the option. Valid while executing an |OptionSet|
+               autocommand.
+                                                   *v:option_old*
+ v:option_old    Old value of the option. Valid while executing an |OptionSet|
+               autocommand.
+                                                   *v:option_type*
+ v:option_type   Scope of the set command. Valid while executing an
+               |OptionSet| autocommand. Can be either "global" or "local"
                                        *v:operator* *operator-variable*
  v:operator    The last operator given in Normal mode.  This is a single
                character except for commands starting with <g> or <z>,
*** ../vim-7.4.785/src/eval.c   2015-07-17 13:03:42.096357579 +0200
--- src/eval.c  2015-07-17 15:07:24.513630864 +0200
***************
*** 365,370 ****
--- 365,373 ----
      {VV_NAME("windowid",       VAR_NUMBER), VV_RO},
      {VV_NAME("progpath",       VAR_STRING), VV_RO},
      {VV_NAME("completed_item",         VAR_DICT), VV_RO},
+     {VV_NAME("option_new",     VAR_STRING), VV_RO},
+     {VV_NAME("option_old",     VAR_STRING), VV_RO},
+     {VV_NAME("option_type",    VAR_STRING), VV_RO},
  };
  
  /* shorthand */
***************
*** 24720,24725 ****
--- 24723,24738 ----
      }
  }
  
+ /* reset v:option_new, v:option_old and v:option_type */
+     void
+ reset_v_option_vars()
+ {
+     set_vim_var_string(VV_OPTION_NEW,  NULL, -1);
+     set_vim_var_string(VV_OPTION_OLD,  NULL, -1);
+     set_vim_var_string(VV_OPTION_TYPE, NULL, -1);
+ }
+ 
+ 
  #endif /* FEAT_EVAL */
  
  
*** ../vim-7.4.785/src/fileio.c 2015-07-17 14:16:49.846596759 +0200
--- src/fileio.c        2015-07-17 14:58:39.362642959 +0200
***************
*** 7699,7704 ****
--- 7699,7705 ----
      {"InsertLeave",   EVENT_INSERTLEAVE},
      {"InsertCharPre", EVENT_INSERTCHARPRE},
      {"MenuPopup",     EVENT_MENUPOPUP},
+     {"OptionSet",     EVENT_OPTIONSET},
      {"QuickFixCmdPost",       EVENT_QUICKFIXCMDPOST},
      {"QuickFixCmdPre",        EVENT_QUICKFIXCMDPRE},
      {"QuitPre",               EVENT_QUITPRE},
***************
*** 7736,7742 ****
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
!     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  };
  
  /*
--- 7737,7743 ----
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
      NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
!     NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
  };
  
  /*
***************
*** 9321,9327 ****
       */
      if (fname_io == NULL)
      {
!       if (event == EVENT_COLORSCHEME)
            autocmd_fname = NULL;
        else if (fname != NULL && *fname != NUL)
            autocmd_fname = fname;
--- 9322,9328 ----
       */
      if (fname_io == NULL)
      {
!       if (event == EVENT_COLORSCHEME || event == EVENT_OPTIONSET)
            autocmd_fname = NULL;
        else if (fname != NULL && *fname != NUL)
            autocmd_fname = fname;
***************
*** 9385,9390 ****
--- 9386,9392 ----
                || event == EVENT_SPELLFILEMISSING
                || event == EVENT_QUICKFIXCMDPRE
                || event == EVENT_COLORSCHEME
+               || event == EVENT_OPTIONSET
                || event == EVENT_QUICKFIXCMDPOST)
            fname = vim_strsave(fname);
        else
*** ../vim-7.4.785/src/option.c 2015-07-17 14:16:49.850596721 +0200
--- src/option.c        2015-07-17 17:30:22.703747129 +0200
***************
*** 4592,4600 ****
                    {
                        char_u      *save_arg = NULL;
                        char_u      *s = NULL;
!                       char_u      *oldval;    /* previous value if *varp */
                        char_u      *newval;
!                       char_u      *origval;
                        unsigned    newlen;
                        int         comma;
                        int         bs;
--- 4592,4603 ----
                    {
                        char_u      *save_arg = NULL;
                        char_u      *s = NULL;
!                       char_u      *oldval = NULL;     /* previous value if 
*varp */
                        char_u      *newval;
!                       char_u      *origval = NULL;
! #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
!                       char_u      *saved_origval = NULL;
! #endif
                        unsigned    newlen;
                        int         comma;
                        int         bs;
***************
*** 4914,4919 ****
--- 4917,4930 ----
                        /* Set the new value. */
                        *(char_u **)(varp) = newval;
  
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+                       if (!starting && options[opt_idx].indir != PV_KEY
+                                                          && origval != NULL)
+                           /* origval may be freed by
+                            * did_set_string_option(), make a copy. */
+                           saved_origval = vim_strsave(origval);
+ #endif
+ 
                        /* Handle side effects, and set the global value for
                         * ":set" on local options. */
                        errmsg = did_set_string_option(opt_idx, (char_u **)varp,
***************
*** 4922,4927 ****
--- 4933,4956 ----
                        /* If error detected, print the error message. */
                        if (errmsg != NULL)
                            goto skip;
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+                       if (saved_origval != NULL)
+                       {
+                           char_u buf_type[7];
+ 
+                           sprintf((char *)buf_type, "%s",
+                               (opt_flags & OPT_LOCAL) ? "local" : "global");
+                           set_vim_var_string(VV_OPTION_NEW, newval, -1);
+                           set_vim_var_string(VV_OPTION_OLD, saved_origval, 
-1);
+                           set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
+                           apply_autocmds(EVENT_OPTIONSET,
+                                         (char_u *)options[opt_idx].fullname,
+                               NULL, FALSE, NULL);
+                           reset_v_option_vars();
+                           vim_free(saved_origval);
+                       }
+ #endif
+ 
                    }
                    else            /* key code option */
                    {
***************
*** 5668,5673 ****
--- 5697,5705 ----
      char_u    *s;
      char_u    **varp;
      char_u    *oldval;
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+     char_u    *saved_oldval = NULL;
+ #endif
      char_u    *r = NULL;
  
      if (options[opt_idx].var == NULL) /* don't set hidden option */
***************
*** 5683,5691 ****
--- 5715,5744 ----
                    : opt_flags);
        oldval = *varp;
        *varp = s;
+ 
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+       if (!starting && options[opt_idx].indir != PV_KEY)
+           saved_oldval = vim_strsave(oldval);
+ #endif
        if ((r = did_set_string_option(opt_idx, varp, TRUE, oldval, NULL,
                                                           opt_flags)) == NULL)
            did_set_option(opt_idx, opt_flags, TRUE);
+ 
+       /* call autocomamnd after handling side effects */
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+       if (saved_oldval != NULL)
+       {
+           char_u buf_type[7];
+           sprintf((char *)buf_type, "%s",
+               (opt_flags & OPT_LOCAL) ? "local" : "global");
+           set_vim_var_string(VV_OPTION_NEW, s, -1);
+           set_vim_var_string(VV_OPTION_OLD, oldval, -1);
+           set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
+           apply_autocmds(EVENT_OPTIONSET, (char_u 
*)options[opt_idx].fullname, NULL, FALSE, NULL);
+           reset_v_option_vars();
+           vim_free(saved_oldval);
+       }
+ #endif
      }
      return r;
  }
***************
*** 8230,8237 ****
--- 8283,8307 ----
       * End of handling side effects for bool options.
       */
  
+     /* after handling side effects, call autocommand */
+ 
      options[opt_idx].flags |= P_WAS_SET;
  
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+     if (!starting)
+     {
+       char_u buf_old[2], buf_new[2], buf_type[7];
+       snprintf((char *)buf_old, 2, "%d", old_value ? TRUE: FALSE);
+       snprintf((char *)buf_new, 2, "%d", value ? TRUE: FALSE);
+       sprintf((char *)buf_type, "%s", (opt_flags & OPT_LOCAL) ? "local" : 
"global");
+       set_vim_var_string(VV_OPTION_NEW, buf_new, -1);
+       set_vim_var_string(VV_OPTION_OLD, buf_old, -1);
+       set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
+       apply_autocmds(EVENT_OPTIONSET, (char_u *) options[opt_idx].fullname, 
NULL, FALSE, NULL);
+       reset_v_option_vars();
+     }
+ #endif
+ 
      comp_col();                           /* in case 'ruler' or 'showcmd' 
changed */
      if (curwin->w_curswant != MAXCOL
                     && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0)
***************
*** 8767,8772 ****
--- 8837,8857 ----
  
      options[opt_idx].flags |= P_WAS_SET;
  
+ #if defined(FEAT_AUTOCMD) && defined(FEAT_EVAL)
+     if (!starting && errmsg == NULL)
+     {
+       char_u buf_old[11], buf_new[11], buf_type[7];
+       snprintf((char *)buf_old, 10, "%ld", old_value);
+       snprintf((char *)buf_new, 10, "%ld", value);
+       snprintf((char *)buf_type, 7, "%s", (opt_flags & OPT_LOCAL) ? "local" : 
"global");
+       set_vim_var_string(VV_OPTION_NEW, buf_new, -1);
+       set_vim_var_string(VV_OPTION_OLD, buf_old, -1);
+       set_vim_var_string(VV_OPTION_TYPE, buf_type, -1);
+       apply_autocmds(EVENT_OPTIONSET, (char_u *) options[opt_idx].fullname, 
NULL, FALSE, NULL);
+       reset_v_option_vars();
+     }
+ #endif
+ 
      comp_col();                           /* in case 'columns' or 'ls' 
changed */
      if (curwin->w_curswant != MAXCOL
                     && (options[opt_idx].flags & (P_CURSWANT | P_RALL)) != 0)
*** ../vim-7.4.785/src/proto/eval.pro   2015-07-10 17:56:18.219777154 +0200
--- src/proto/eval.pro  2015-07-17 17:14:38.408715248 +0200
***************
*** 133,138 ****
--- 133,139 ----
  int store_session_globals __ARGS((FILE *fd));
  void last_set_msg __ARGS((scid_T scriptID));
  void ex_oldfiles __ARGS((exarg_T *eap));
+ void reset_v_option_vars __ARGS((void));
  int modify_fname __ARGS((char_u *src, int *usedlen, char_u **fnamep, char_u 
**bufp, int *fnamelen));
  char_u *do_string_sub __ARGS((char_u *str, char_u *pat, char_u *sub, char_u 
*flags));
  /* vim: set ft=c : */
*** ../vim-7.4.785/src/testdir/Make_amiga.mak   2015-07-17 14:16:49.854596682 
+0200
--- src/testdir/Make_amiga.mak  2015-07-17 15:02:36.916377572 +0200
***************
*** 38,43 ****
--- 38,44 ----
                test104.out test105.out test106.out test107.out \
                test_argument_0count.out \
                test_argument_count.out \
+               test_autocmd_option.out \
                test_autoformat_join.out \
                test_breakindent.out \
                test_changelist.out \
***************
*** 188,193 ****
--- 189,195 ----
  test107.out: test107.in
  test_argument_0count.out: test_argument_0count.in
  test_argument_count.out: test_argument_count.in
+ test_autocmd_option.out: test_autocmd_option.in
  test_autoformat_join.out: test_autoformat_join.in
  test_breakindent.out: test_breakindent.in
  test_changelist.out: test_changelist.in
*** ../vim-7.4.785/src/testdir/Make_dos.mak     2015-07-17 14:16:49.854596682 
+0200
--- src/testdir/Make_dos.mak    2015-07-17 14:58:39.362642959 +0200
***************
*** 37,42 ****
--- 37,43 ----
                test105.out test106.out  test107.out\
                test_argument_0count.out \
                test_argument_count.out \
+               test_autocmd_option.out \
                test_autoformat_join.out \
                test_breakindent.out \
                test_changelist.out \
*** ../vim-7.4.785/src/testdir/Make_ming.mak    2015-07-17 14:16:49.854596682 
+0200
--- src/testdir/Make_ming.mak   2015-07-17 14:58:39.362642959 +0200
***************
*** 59,64 ****
--- 59,65 ----
                test105.out test106.out test107.out \
                test_argument_0count.out \
                test_argument_count.out \
+               test_autocmd_option.out \
                test_autoformat_join.out \
                test_breakindent.out \
                test_changelist.out \
*** ../vim-7.4.785/src/testdir/Make_os2.mak     2015-07-17 14:16:49.854596682 
+0200
--- src/testdir/Make_os2.mak    2015-07-17 14:58:39.362642959 +0200
***************
*** 39,44 ****
--- 39,45 ----
                test105.out test106.out test107.out \
                test_argument_0count.out \
                test_argument_count.out \
+               test_autocmd_option.out \
                test_autoformat_join.out \
                test_breakindent.out \
                test_changelist.out \
*** ../vim-7.4.785/src/testdir/Make_vms.mms     2015-07-17 14:16:49.854596682 
+0200
--- src/testdir/Make_vms.mms    2015-07-17 14:58:39.362642959 +0200
***************
*** 98,103 ****
--- 98,104 ----
         test105.out test106.out test107.out \
         test_argument_0count.out \
         test_argument_count.out \
+        test_autocmd_option.out \
         test_autoformat_join.out \
         test_breakindent.out \
         test_changelist.out \
*** ../vim-7.4.785/src/testdir/Makefile 2015-07-17 14:16:49.854596682 +0200
--- src/testdir/Makefile        2015-07-17 14:58:39.362642959 +0200
***************
*** 35,40 ****
--- 35,41 ----
                test104.out test105.out test106.out test107.out \
                test_argument_0count.out \
                test_argument_count.out \
+               test_autocmd_option.out \
                test_autoformat_join.out \
                test_breakindent.out \
                test_changelist.out \
*** ../vim-7.4.785/src/testdir/test_autocmd_option.in   2015-07-17 
17:13:44.769224683 +0200
--- src/testdir/test_autocmd_option.in  2015-07-17 14:58:39.362642959 +0200
***************
*** 0 ****
--- 1,73 ----
+ Test for option autocommand
+ 
+ STARTTEST
+ :so small.vim
+ :if !has("eval") || !has("autocmd") | e! test.ok | w! test.out | qa! | endif
+ :fu! AutoCommand(match)
+ :     let c=g:testcase
+ :       let item=remove(g:options, 0)
+ :       let c.=printf("Expected: Name: <%s>, Oldval: <%s>, NewVal: <%s>, 
Scope: <%s>\n", item[0], item[1], item[2], item[3])
+ :       let c.=printf("Autocmd Option: <%s>,", a:match)
+ :       let c.=printf(" OldVal: <%s>,", v:option_old)
+ :       let c.=printf(" NewVal: <%s>,", v:option_new)
+ :       let c.=printf(" Scope: <%s>\n", v:option_type)
+ :       call setreg('r', printf("%s\n%s", getreg('r'), c))
+ :endfu
+ :au OptionSet * :call AutoCommand(expand("<amatch>"))
+ :let g:testcase="1: Setting number option\n"
+ :let g:options=[['number', 0, 1, 'global']]
+ :set nu
+ :let g:testcase="2: Setting local number option\n"
+ :let g:options=[['number', 1, 0, 'local']]
+ :setlocal nonu
+ :let g:testcase="3: Setting global number option\n"
+ :let g:options=[['number', 1, 0, 'global']]
+ :setglobal nonu
+ :let g:testcase="4: Setting local autoindent option\n"
+ :let g:options=[['autoindent', 0, 1, 'local']]
+ :setlocal ai
+ :let g:testcase="5: Setting global autoindent option\n"
+ :let g:options=[['autoindent', 0, 1, 'global']]
+ :setglobal ai
+ :let g:testcase="6: Setting global autoindent option\n"
+ :let g:options=[['autoindent', 1, 0, 'global']]
+ :set ai!
+ : Should not print anything, use :noa
+ :noa :set nonu
+ :let g:testcase="7: Setting several global list and number option\n"
+ :let g:options=[['list', 0, 1, 'global'], ['number', 0, 1, 'global']]
+ :set list nu
+ :noa set nolist nonu
+ :let g:testcase="8: Setting global acd\n"
+ :let g:options=[['autochdir', 0, 1, 'global']]
+ :setlocal acd
+ :let g:testcase="9: Setting global autoread\n"
+ :let g:options=[['autoread', 0, 1, 'global']]
+ :set ar
+ :let g:testcase="10: Setting local autoread\n"
+ :let g:options=[['autoread', 0, 1, 'local']]
+ :setlocal ar
+ :let g:testcase="11: Setting global autoread\n"
+ :let g:options=[['autoread', 1, 0, 'global']]
+ :setglobal invar
+ :let g:testcase="12: Setting option backspace through :let\n"
+ :let g:options=[['backspace', '', 'eol,indent,start', 'global']]
+ :let &bs="eol,indent,start"
+ :let g:testcase="13: Setting option backspace through setbufvar()\n"
+ :let g:options=[['backup', '', '1', 'local']]
+ : "try twice, first time, shouldn't trigger because option name is invalid, 
second time, it should trigger
+ :call setbufvar(1, '&l:bk', 1)
+ : "should trigger, use correct option name
+ :call setbufvar(1, '&backup', 1)
+ :" Write register now, because next test shouldn't output anything.
+ :$put r
+ :let @r=''
+ :let g:testcase="\n14: Setting key option, shouldn't trigger\n"
+ :let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
+ :setlocal key=blah
+ :setlocal key=
+ :$put =g:testcase
+ :%w! test.out
+ :qa!
+ ENDTEST
+ dummy text
*** ../vim-7.4.785/src/testdir/test_autocmd_option.ok   2015-07-17 
17:13:44.777224608 +0200
--- src/testdir/test_autocmd_option.ok  2015-07-17 14:58:39.362642959 +0200
***************
*** 0 ****
--- 1,131 ----
+ Test for option autocommand
+ 
+ STARTTEST
+ :so small.vim
+ :if !has("eval") || !has("autocmd") | e! test.ok | w! test.out | qa! | endif
+ :fu! AutoCommand(match)
+ :     let c=g:testcase
+ :       let item=remove(g:options, 0)
+ :       let c.=printf("Expected: Name: <%s>, Oldval: <%s>, NewVal: <%s>, 
Scope: <%s>\n", item[0], item[1], item[2], item[3])
+ :       let c.=printf("Autocmd Option: <%s>,", a:match)
+ :       let c.=printf(" OldVal: <%s>,", v:option_old)
+ :       let c.=printf(" NewVal: <%s>,", v:option_new)
+ :       let c.=printf(" Scope: <%s>\n", v:option_type)
+ :       call setreg('r', printf("%s\n%s", getreg('r'), c))
+ :endfu
+ :au OptionSet * :call AutoCommand(expand("<amatch>"))
+ :let g:testcase="1: Setting number option\n"
+ :let g:options=[['number', 0, 1, 'global']]
+ :set nu
+ :let g:testcase="2: Setting local number option\n"
+ :let g:options=[['number', 1, 0, 'local']]
+ :setlocal nonu
+ :let g:testcase="3: Setting global number option\n"
+ :let g:options=[['number', 1, 0, 'global']]
+ :setglobal nonu
+ :let g:testcase="4: Setting local autoindent option\n"
+ :let g:options=[['autoindent', 0, 1, 'local']]
+ :setlocal ai
+ :let g:testcase="5: Setting global autoindent option\n"
+ :let g:options=[['autoindent', 0, 1, 'global']]
+ :setglobal ai
+ :let g:testcase="6: Setting global autoindent option\n"
+ :let g:options=[['autoindent', 1, 0, 'global']]
+ :set ai!
+ : Should not print anything, use :noa
+ :noa :set nonu
+ :let g:testcase="7: Setting several global list and number option\n"
+ :let g:options=[['list', 0, 1, 'global'], ['number', 0, 1, 'global']]
+ :set list nu
+ :noa set nolist nonu
+ :let g:testcase="8: Setting global acd\n"
+ :let g:options=[['autochdir', 0, 1, 'global']]
+ :setlocal acd
+ :let g:testcase="9: Setting global autoread\n"
+ :let g:options=[['autoread', 0, 1, 'global']]
+ :set ar
+ :let g:testcase="10: Setting local autoread\n"
+ :let g:options=[['autoread', 0, 1, 'local']]
+ :setlocal ar
+ :let g:testcase="11: Setting global autoread\n"
+ :let g:options=[['autoread', 1, 0, 'global']]
+ :setglobal invar
+ :let g:testcase="12: Setting option backspace through :let\n"
+ :let g:options=[['backspace', '', 'eol,indent,start', 'global']]
+ :let &bs="eol,indent,start"
+ :let g:testcase="13: Setting option backspace through setbufvar()\n"
+ :let g:options=[['backup', '', '1', 'local']]
+ : "try twice, first time, shouldn't trigger because option name is invalid, 
second time, it should trigger
+ :call setbufvar(1, '&l:bk', 1)
+ : "should trigger, use correct option name
+ :call setbufvar(1, '&backup', 1)
+ :" Write register now, because next test shouldn't output anything.
+ :$put r
+ :let @r=''
+ :let g:testcase="\n14: Setting key option, shouldn't trigger\n"
+ :let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
+ :setlocal key=blah
+ :setlocal key=
+ :$put =g:testcase
+ :%w! test.out
+ :qa!
+ ENDTEST
+ dummy text
+ 
+ 1: Setting number option
+ Expected: Name: <number>, Oldval: <0>, NewVal: <1>, Scope: <global>
+ Autocmd Option: <number>, OldVal: <0>, NewVal: <1>, Scope: <global>
+ 
+ 2: Setting local number option
+ Expected: Name: <number>, Oldval: <1>, NewVal: <0>, Scope: <local>
+ Autocmd Option: <number>, OldVal: <1>, NewVal: <0>, Scope: <local>
+ 
+ 3: Setting global number option
+ Expected: Name: <number>, Oldval: <1>, NewVal: <0>, Scope: <global>
+ Autocmd Option: <number>, OldVal: <1>, NewVal: <0>, Scope: <global>
+ 
+ 4: Setting local autoindent option
+ Expected: Name: <autoindent>, Oldval: <0>, NewVal: <1>, Scope: <local>
+ Autocmd Option: <autoindent>, OldVal: <0>, NewVal: <1>, Scope: <local>
+ 
+ 5: Setting global autoindent option
+ Expected: Name: <autoindent>, Oldval: <0>, NewVal: <1>, Scope: <global>
+ Autocmd Option: <autoindent>, OldVal: <0>, NewVal: <1>, Scope: <global>
+ 
+ 6: Setting global autoindent option
+ Expected: Name: <autoindent>, Oldval: <1>, NewVal: <0>, Scope: <global>
+ Autocmd Option: <autoindent>, OldVal: <1>, NewVal: <0>, Scope: <global>
+ 
+ 7: Setting several global list and number option
+ Expected: Name: <list>, Oldval: <0>, NewVal: <1>, Scope: <global>
+ Autocmd Option: <list>, OldVal: <0>, NewVal: <1>, Scope: <global>
+ 
+ 7: Setting several global list and number option
+ Expected: Name: <number>, Oldval: <0>, NewVal: <1>, Scope: <global>
+ Autocmd Option: <number>, OldVal: <0>, NewVal: <1>, Scope: <global>
+ 
+ 8: Setting global acd
+ Expected: Name: <autochdir>, Oldval: <0>, NewVal: <1>, Scope: <global>
+ Autocmd Option: <autochdir>, OldVal: <0>, NewVal: <1>, Scope: <local>
+ 
+ 9: Setting global autoread
+ Expected: Name: <autoread>, Oldval: <0>, NewVal: <1>, Scope: <global>
+ Autocmd Option: <autoread>, OldVal: <0>, NewVal: <1>, Scope: <global>
+ 
+ 10: Setting local autoread
+ Expected: Name: <autoread>, Oldval: <0>, NewVal: <1>, Scope: <local>
+ Autocmd Option: <autoread>, OldVal: <1>, NewVal: <1>, Scope: <local>
+ 
+ 11: Setting global autoread
+ Expected: Name: <autoread>, Oldval: <1>, NewVal: <0>, Scope: <global>
+ Autocmd Option: <autoread>, OldVal: <1>, NewVal: <0>, Scope: <global>
+ 
+ 12: Setting option backspace through :let
+ Expected: Name: <backspace>, Oldval: <>, NewVal: <eol,indent,start>, Scope: 
<global>
+ Autocmd Option: <backspace>, OldVal: <>, NewVal: <eol,indent,start>, Scope: 
<global>
+ 
+ 13: Setting option backspace through setbufvar()
+ Expected: Name: <backup>, Oldval: <>, NewVal: <1>, Scope: <local>
+ Autocmd Option: <backup>, OldVal: <0>, NewVal: <1>, Scope: <local>
+ 
+ 14: Setting key option, shouldn't trigger
*** ../vim-7.4.785/src/vim.h    2015-07-10 17:56:18.219777154 +0200
--- src/vim.h   2015-07-17 15:01:08.737218443 +0200
***************
*** 1335,1340 ****
--- 1335,1341 ----
      EVENT_TEXTCHANGED,                /* text was modified */
      EVENT_TEXTCHANGEDI,               /* text was modified in Insert mode*/
      EVENT_CMDUNDEFINED,               /* command undefined */
+     EVENT_OPTIONSET,          /* option was set */
      NUM_EVENTS                        /* MUST be the last one */
  };
  
***************
*** 1898,1904 ****
  #define VV_WINDOWID   56
  #define VV_PROGPATH   57
  #define VV_COMPLETED_ITEM 58
! #define VV_LEN                59      /* number of v: vars */
  
  #ifdef FEAT_CLIPBOARD
  
--- 1899,1908 ----
  #define VV_WINDOWID   56
  #define VV_PROGPATH   57
  #define VV_COMPLETED_ITEM 58
! #define VV_OPTION_NEW   59
! #define VV_OPTION_OLD   60
! #define VV_OPTION_TYPE  61
! #define VV_LEN                62      /* number of v: vars */
  
  #ifdef FEAT_CLIPBOARD
  
*** ../vim-7.4.785/src/version.c        2015-07-17 14:16:49.858596644 +0200
--- src/version.c       2015-07-17 17:09:30.819636167 +0200
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     786,
  /**/

-- 
hundred-and-one symptoms of being an internet addict:
231. You sprinkle Carpet Fresh on the rugs and put your vacuum cleaner
     in the front doorway permanently so it always looks like you are
     actually attempting to do something about that mess that has amassed
     since you discovered the Internet.

 /// 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].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui