Patch 8.0.0736
Problem: The OptionSet autocommand event is not triggered when entering
diff mode.
Solution: use set_option_value() instead of setting the option directly.
Change the tests from old to new style. (Christian Brabandt)
Files: src/diff.c, src/testdir/Make_all.mak, src/Makefile,
src/testdir/test_autocmd.vim, src/testdir/test_autocmd_option.in,
src/testdir/test_autocmd_option.ok,
*** ../vim-8.0.0735/src/diff.c 2017-05-16 13:14:58.434591726 +0200
--- src/diff.c 2017-07-19 17:22:29.684100737 +0200
***************
*** 1137,1142 ****
--- 1137,1156 ----
diff_win_options(curwin, TRUE);
}
+ static void
+ set_diff_option(win_T *wp, int value)
+ {
+ win_T *old_curwin = curwin;
+
+ curwin = wp;
+ curbuf = curwin->w_buffer;
+ ++curbuf_lock;
+ set_option_value((char_u *)"diff", (long)value, NULL, OPT_LOCAL);
+ --curbuf_lock;
+ curwin = old_curwin;
+ curbuf = curwin->w_buffer;
+ }
+
/*
* Set options in window "wp" for diff mode.
*/
***************
*** 1198,1207 ****
if (vim_strchr(p_sbo, 'h') == NULL)
do_cmdline_cmd((char_u *)"set sbo+=hor");
#endif
! /* Saved the current values, to be restored in ex_diffoff(). */
wp->w_p_diff_saved = TRUE;
! wp->w_p_diff = TRUE;
if (addbuf)
diff_buf_add(wp->w_buffer);
--- 1212,1221 ----
if (vim_strchr(p_sbo, 'h') == NULL)
do_cmdline_cmd((char_u *)"set sbo+=hor");
#endif
! /* Save the current values, to be restored in ex_diffoff(). */
wp->w_p_diff_saved = TRUE;
! set_diff_option(wp, TRUE);
if (addbuf)
diff_buf_add(wp->w_buffer);
***************
*** 1227,1233 ****
/* Set 'diff' off. If option values were saved in
* diff_win_options(), restore the ones whose settings seem to have
* been left over from diff mode. */
! wp->w_p_diff = FALSE;
if (wp->w_p_diff_saved)
{
--- 1241,1247 ----
/* Set 'diff' off. If option values were saved in
* diff_win_options(), restore the ones whose settings seem to have
* been left over from diff mode. */
! set_diff_option(wp, FALSE);
if (wp->w_p_diff_saved)
{
*** ../vim-8.0.0735/src/testdir/Make_all.mak 2017-07-16 17:55:53.325531419
+0200
--- src/testdir/Make_all.mak 2017-07-19 17:13:31.779932605 +0200
***************
*** 66,72 ****
test104.out \
test107.out \
test108.out \
- test_autocmd_option.out \
test_autoformat_join.out \
test_changelist.out \
test_close_count.out \
--- 66,71 ----
*** ../vim-8.0.0735/src/Makefile 2017-07-16 17:55:53.325531419 +0200
--- src/Makefile 2017-07-19 18:16:20.829038852 +0200
***************
*** 2088,2094 ****
# Run individual OLD style test, assuming that Vim was already compiled.
test1 \
- test_autocmd_option \
test_autoformat_join \
test_changelist \
test_close_count \
--- 2088,2093 ----
*** ../vim-8.0.0735/src/testdir/test_autocmd.vim 2017-07-09
11:07:11.716971364 +0200
--- src/testdir/test_autocmd.vim 2017-07-19 17:19:46.653266060 +0200
***************
*** 2,14 ****
set belloff=all
! function! s:cleanup_buffers() abort
for bnr in range(1, bufnr('$'))
if bufloaded(bnr) && bufnr('%') != bnr
execute 'bd! ' . bnr
endif
endfor
! endfunction
func Test_vim_did_enter()
call assert_false(v:vim_did_enter)
--- 2,14 ----
set belloff=all
! func! s:cleanup_buffers() abort
for bnr in range(1, bufnr('$'))
if bufloaded(bnr) && bufnr('%') != bnr
execute 'bd! ' . bnr
endif
endfor
! endfunc
func Test_vim_did_enter()
call assert_false(v:vim_did_enter)
***************
*** 49,55 ****
endfunc
endif
! function Test_bufunload()
augroup test_bufunload_group
autocmd!
autocmd BufUnload * call add(s:li, "bufunload")
--- 49,55 ----
endfunc
endif
! func Test_bufunload()
augroup test_bufunload_group
autocmd!
autocmd BufUnload * call add(s:li, "bufunload")
***************
*** 80,86 ****
endfunc
" SEGV occurs in older versions. (At least 7.4.2005 or older)
! function Test_autocmd_bufunload_with_tabnext()
tabedit
tabfirst
--- 80,86 ----
endfunc
" SEGV occurs in older versions. (At least 7.4.2005 or older)
! func Test_autocmd_bufunload_with_tabnext()
tabedit
tabfirst
***************
*** 98,104 ****
quit
endfunc
! function Test_autocmd_bufwinleave_with_tabfirst()
tabedit
augroup sample
autocmd!
--- 98,104 ----
quit
endfunc
! func Test_autocmd_bufwinleave_with_tabfirst()
tabedit
augroup sample
autocmd!
***************
*** 110,116 ****
endfunc
" SEGV occurs in older versions. (At least 7.4.2321 or older)
! function Test_autocmd_bufunload_avoiding_SEGV_01()
split aa.txt
let lastbuf = bufnr('$')
--- 110,116 ----
endfunc
" SEGV occurs in older versions. (At least 7.4.2321 or older)
! func Test_autocmd_bufunload_avoiding_SEGV_01()
split aa.txt
let lastbuf = bufnr('$')
***************
*** 128,134 ****
endfunc
" SEGV occurs in older versions. (At least 7.4.2321 or older)
! function Test_autocmd_bufunload_avoiding_SEGV_02()
setlocal buftype=nowrite
let lastbuf = bufnr('$')
--- 128,134 ----
endfunc
" SEGV occurs in older versions. (At least 7.4.2321 or older)
! func Test_autocmd_bufunload_avoiding_SEGV_02()
setlocal buftype=nowrite
let lastbuf = bufnr('$')
***************
*** 351,357 ****
" Closing a window might cause an endless loop
" E814 for older Vims
! function Test_autocmd_bufwipe_in_SessLoadPost()
tabnew
set noswapfile
mksession!
--- 351,357 ----
" Closing a window might cause an endless loop
" E814 for older Vims
! func Test_autocmd_bufwipe_in_SessLoadPost()
tabnew
set noswapfile
mksession!
***************
*** 380,386 ****
endfunc
" SEGV occurs in older versions.
! function Test_autocmd_bufwipe_in_SessLoadPost2()
tabnew
set noswapfile
mksession!
--- 380,386 ----
endfunc
" SEGV occurs in older versions.
! func Test_autocmd_bufwipe_in_SessLoadPost2()
tabnew
set noswapfile
mksession!
***************
*** 422,424 ****
--- 422,615 ----
func Test_empty_doau()
doau \|
endfunc
+
+ func s:AutoCommandOptionSet(match)
+ let item = remove(g:options, 0)
+ let expected = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope:
<%s>\n", item[0], item[1], item[2], item[3])
+ let actual = printf("Option: <%s>, Oldval: <%s>, NewVal: <%s>, Scope:
<%s>\n", a:match, v:option_old, v:option_new, v:option_type)
+ let g:opt = [expected, actual]
+ "call assert_equal(expected, actual)
+ endfunc
+
+ func Test_OptionSet()
+ if !has("eval") || !has("autocmd") || !exists("+autochdir")
+ return
+ endif
+
+ call test_override('starting', 1)
+ set nocp
+ au OptionSet * :call s:AutoCommandOptionSet(expand("<amatch>"))
+
+ " 1: Setting number option"
+ let g:options=[['number', 0, 1, 'global']]
+ set nu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 2: Setting local number option"
+ let g:options=[['number', 1, 0, 'local']]
+ setlocal nonu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 3: Setting global number option"
+ let g:options=[['number', 1, 0, 'global']]
+ setglobal nonu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 4: Setting local autoindent option"
+ let g:options=[['autoindent', 0, 1, 'local']]
+ setlocal ai
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 5: Setting global autoindent option"
+ let g:options=[['autoindent', 0, 1, 'global']]
+ setglobal ai
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 6: Setting global autoindent option"
+ let g:options=[['autoindent', 1, 0, 'global']]
+ set ai!
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " Should not print anything, use :noa
+ " 7: don't trigger OptionSet"
+ let g:options=[['invalid', 1, 1, 'invalid']]
+ noa set nonu
+ call assert_equal([['invalid', 1, 1, 'invalid']], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 8: Setting several global list and number option"
+ let g:options=[['list', 0, 1, 'global'], ['number', 0, 1, 'global']]
+ set list nu
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 9: don't trigger OptionSet"
+ let g:options=[['invalid', 1, 1, 'invalid'], ['invalid', 1, 1, 'invalid']]
+ noa set nolist nonu
+ call assert_equal([['invalid', 1, 1, 'invalid'], ['invalid', 1, 1,
'invalid']], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 10: Setting global acd"
+ let g:options=[['autochdir', 0, 1, 'local']]
+ setlocal acd
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 11: Setting global autoread (also sets local value)"
+ let g:options=[['autoread', 0, 1, 'global']]
+ set ar
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 12: Setting local autoread"
+ let g:options=[['autoread', 1, 1, 'local']]
+ setlocal ar
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 13: Setting global autoread"
+ let g:options=[['autoread', 1, 0, 'global']]
+ setglobal invar
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 14: Setting option backspace through :let"
+ let g:options=[['backspace', '', 'eol,indent,start', 'global']]
+ let &bs="eol,indent,start"
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 15: Setting option backspace through setbufvar()"
+ let g:options=[['backup', 0, 1, 'local']]
+ " try twice, first time, shouldn't trigger because option name is invalid,
+ " second time, it should trigger
+ call assert_fails("call setbufvar(1, '&l:bk', 1)", "E355")
+ " should trigger, use correct option name
+ call setbufvar(1, '&backup', 1)
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 16: Setting number option using setwinvar"
+ let g:options=[['number', 0, 1, 'local']]
+ call setwinvar(0, '&number', 1)
+ call assert_equal([], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " 17: Setting key option, shouldn't trigger"
+ let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
+ setlocal key=blah
+ setlocal key=
+ call assert_equal([['key', 'invalid', 'invalid1', 'invalid']], g:options)
+ call assert_equal(g:opt[0], g:opt[1])
+
+ " Cleanup
+ au! OptionSet
+ for opt in ['nu', 'ai', 'acd', 'ar', 'bs', 'backup', 'cul', 'cp']
+ exe printf(":set %s&vi", opt)
+ endfor
+ call test_override('starting', 0)
+ delfunc! AutoCommandOptionSet
+ endfunc
+
+ func Test_OptionSet_diffmode()
+ call test_override('starting', 1)
+ " 18: Changing an option when enetering diff mode
+ new
+ au OptionSet diff :let &l:cul=v:option_new
+
+ call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
+ call assert_equal(0, &l:cul)
+ diffthis
+ call assert_equal(1, &l:cul)
+
+ vnew
+ call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
+ call assert_equal(0, &l:cul)
+ diffthis
+ call assert_equal(1, &l:cul)
+
+ diffoff
+ call assert_equal(0, &l:cul)
+ call assert_equal(1, getwinvar(2, '&l:cul'))
+ bw!
+
+ call assert_equal(1, &l:cul)
+ diffoff!
+ call assert_equal(0, &l:cul)
+ call assert_equal(0, getwinvar(1, '&l:cul'))
+ bw!
+
+ " Cleanup
+ au! OptionSet
+ call test_override('starting', 0)
+ endfunc
+
+ func Test_OptionSet_diffmode_close()
+ call test_override('starting', 1)
+ " 19: Try to close the current window when entering diff mode
+ " should not segfault
+ new
+ au OptionSet diff close
+
+ call setline(1, ['buffer 1', 'line2', 'line3', 'line4'])
+ call assert_fails(':diffthis', 'E788')
+ call assert_equal(1, &diff)
+ vnew
+ call setline(1, ['buffer 2', 'line 2', 'line 3', 'line4'])
+ call assert_fails(':diffthis', 'E788')
+ call assert_equal(1, &diff)
+ bw!
+ call assert_fails(':diffoff!', 'E788')
+ bw!
+
+ " Cleanup
+ au! OptionSet
+ call test_override('starting', 0)
+ "delfunc! AutoCommandOptionSet
+ endfunc
*** ../vim-8.0.0735/src/testdir/test_autocmd_option.in 2015-09-29
18:03:38.000000000 +0200
--- src/testdir/test_autocmd_option.in 1970-01-01 01:00:00.000000000 +0100
***************
*** 1,77 ****
- Test for option autocommand
-
- STARTTEST
- :so small.vim
- :if !has("eval") || !has("autocmd") || !exists("+autochdir") | 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)
- :let g:testcase="14: Setting number option using setwinvar\n"
- :let g:options=[['number', 0, 1, 'local']]
- :call setwinvar(0, '&number', 1)
- :" Write register now, because next test shouldn't output anything.
- :$put r
- :let @r=''
- :let g:testcase="\n15: Setting key option, shouldn't trigger\n"
- :let g:options=[['key', 'invalid', 'invalid1', 'invalid']]
- :setlocal key=blah
- :setlocal key=
- :$put =g:testcase
- :$put r
- :/^dummy text/,$w! test.out
- :qa!
- ENDTEST
- dummy text
--- 0 ----
*** ../vim-8.0.0735/src/testdir/test_autocmd_option.ok 2015-09-29
18:03:38.000000000 +0200
--- src/testdir/test_autocmd_option.ok 1970-01-01 01:00:00.000000000 +0100
***************
*** 1,64 ****
- 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 number option using setwinvar
- Expected: Name: <number>, Oldval: <0>, NewVal: <1>, Scope: <local>
- Autocmd Option: <number>, OldVal: <0>, NewVal: <1>, Scope: <local>
-
- 15: Setting key option, shouldn't trigger
-
--- 0 ----
*** ../vim-8.0.0735/src/version.c 2017-07-19 17:05:55.183185953 +0200
--- src/version.c 2017-07-19 18:14:26.945848611 +0200
***************
*** 771,772 ****
--- 771,774 ----
{ /* Add new patch number below this line */
+ /**/
+ 736,
/**/
--
hundred-and-one symptoms of being an internet addict:
187. You promise yourself that you'll only stay online for another
15 minutes...at least once every hour.
/// 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.