mirror of
https://github.com/neovim/neovim.git
synced 2025-02-25 18:55:25 -06:00
vim-patch:8.0.0736: OptionSet not triggered when entering diff mode
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)
04f62f881c
This commit is contained in:
parent
ce92e784e1
commit
61f9a7b0d0
@ -1058,6 +1058,20 @@ void ex_diffthis(exarg_T *eap)
|
||||
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("diff", (long)value, NULL, OPT_LOCAL);
|
||||
curbuf_lock--;
|
||||
curwin = old_curwin;
|
||||
curbuf = curwin->w_buffer;
|
||||
}
|
||||
|
||||
|
||||
/// Set options in window "wp" for diff mode.
|
||||
///
|
||||
/// @param addbuf Add buffer to diff.
|
||||
@ -1115,10 +1129,10 @@ void diff_win_options(win_T *wp, int addbuf)
|
||||
do_cmdline_cmd("set sbo+=hor");
|
||||
}
|
||||
|
||||
// Saved the current values, to be restored in ex_diffoff().
|
||||
wp->w_p_diff_saved = TRUE;
|
||||
// Save the current values, to be restored in ex_diffoff().
|
||||
wp->w_p_diff_saved = true;
|
||||
|
||||
wp->w_p_diff = true;
|
||||
set_diff_option(wp, true);
|
||||
|
||||
if (addbuf) {
|
||||
diff_buf_add(wp->w_buffer);
|
||||
@ -1139,7 +1153,7 @@ void ex_diffoff(exarg_T *eap)
|
||||
// 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;
|
||||
set_diff_option(wp, false);
|
||||
|
||||
if (wp->w_p_diff_saved) {
|
||||
if (wp->w_p_scb) {
|
||||
|
@ -1336,7 +1336,8 @@ recover_names (
|
||||
&& len > 1
|
||||
&& p[-1] == p[-2]) {
|
||||
// Ends with '//', Use Full path for swap name
|
||||
tail = (char_u *)make_percent_swname((char *)dir_name, (char *)fname_res);
|
||||
tail = (char_u *)make_percent_swname((char *)dir_name,
|
||||
(char *)fname_res);
|
||||
} else {
|
||||
tail = path_tail(fname_res);
|
||||
tail = (char_u *)concat_fnames((char *)dir_name, (char *)tail, TRUE);
|
||||
|
@ -2,13 +2,13 @@
|
||||
|
||||
set belloff=all
|
||||
|
||||
function! s:cleanup_buffers() abort
|
||||
func! s:cleanup_buffers() abort
|
||||
for bnr in range(1, bufnr('$'))
|
||||
if bufloaded(bnr) && bufnr('%') != bnr
|
||||
execute 'bd! ' . bnr
|
||||
endif
|
||||
endfor
|
||||
endfunction
|
||||
endfunc
|
||||
|
||||
func Test_vim_did_enter()
|
||||
call assert_false(v:vim_did_enter)
|
||||
@ -49,7 +49,7 @@ if has('timers')
|
||||
endfunc
|
||||
endif
|
||||
|
||||
function Test_bufunload()
|
||||
func Test_bufunload()
|
||||
augroup test_bufunload_group
|
||||
autocmd!
|
||||
autocmd BufUnload * call add(s:li, "bufunload")
|
||||
@ -80,7 +80,7 @@ function Test_bufunload()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions. (At least 7.4.2005 or older)
|
||||
function Test_autocmd_bufunload_with_tabnext()
|
||||
func Test_autocmd_bufunload_with_tabnext()
|
||||
tabedit
|
||||
tabfirst
|
||||
|
||||
@ -98,7 +98,7 @@ function Test_autocmd_bufunload_with_tabnext()
|
||||
quit
|
||||
endfunc
|
||||
|
||||
function Test_autocmd_bufwinleave_with_tabfirst()
|
||||
func Test_autocmd_bufwinleave_with_tabfirst()
|
||||
tabedit
|
||||
augroup sample
|
||||
autocmd!
|
||||
@ -110,7 +110,7 @@ function Test_autocmd_bufwinleave_with_tabfirst()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions. (At least 7.4.2321 or older)
|
||||
function Test_autocmd_bufunload_avoiding_SEGV_01()
|
||||
func Test_autocmd_bufunload_avoiding_SEGV_01()
|
||||
split aa.txt
|
||||
let lastbuf = bufnr('$')
|
||||
|
||||
@ -128,7 +128,7 @@ function Test_autocmd_bufunload_avoiding_SEGV_01()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions. (At least 7.4.2321 or older)
|
||||
function Test_autocmd_bufunload_avoiding_SEGV_02()
|
||||
func Test_autocmd_bufunload_avoiding_SEGV_02()
|
||||
setlocal buftype=nowrite
|
||||
let lastbuf = bufnr('$')
|
||||
|
||||
@ -353,7 +353,7 @@ endfunc
|
||||
|
||||
" Closing a window might cause an endless loop
|
||||
" E814 for older Vims
|
||||
function Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
func Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
tabnew
|
||||
set noswapfile
|
||||
mksession!
|
||||
@ -382,7 +382,7 @@ function Test_autocmd_bufwipe_in_SessLoadPost()
|
||||
endfunc
|
||||
|
||||
" SEGV occurs in older versions.
|
||||
function Test_autocmd_bufwipe_in_SessLoadPost2()
|
||||
func Test_autocmd_bufwipe_in_SessLoadPost2()
|
||||
tabnew
|
||||
set noswapfile
|
||||
mksession!
|
||||
@ -606,3 +606,194 @@ func Test_BufLeave_Wipe()
|
||||
%bwipe
|
||||
au! BufLeave
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user