patch 9.0.1710: scrolloff options work slightly different
Problem: sidescrolloff and scrolloff options work slightly
different than other global-local options
Solution: Make it behave consistent for all global-local options
It was noticed, that sidescrolloff and scrolloff options behave
differently in comparison to other global-local window options like
'listchars'
So make those two behave like other global-local options. Also add some
extra documentation for a few special local-window options.
Add a few tests to make sure all global-local window options behave
similar
closes: #12956
closes: #12643
Signed-off-by: Christian Brabandt <cb@256bit.org>
diff --git a/src/testdir/test_options.vim b/src/testdir/test_options.vim
index 0de5e25..5bacebc 100644
--- a/src/testdir/test_options.vim
+++ b/src/testdir/test_options.vim
@@ -1689,4 +1689,89 @@
bw!
endfunc
+func Test_set_option_window_global_local()
+ new Xbuffer1
+ let [ _gso, _lso ] = [ &g:scrolloff, &l:scrolloff ]
+ setlocal scrolloff=2
+ setglobal scrolloff=3
+ setl modified
+ " A new buffer has its own window-local options
+ hide enew
+ call assert_equal(-1, &l:scrolloff)
+ call assert_equal(3, &g:scrolloff)
+ " A new window opened with its own buffer-local options
+ new
+ call assert_equal(-1, &l:scrolloff)
+ call assert_equal(3, &g:scrolloff)
+ " Re-open Xbuffer1 and it should use
+ " the previous set window-local options
+ b Xbuffer1
+ call assert_equal(2, &l:scrolloff)
+ call assert_equal(3, &g:scrolloff)
+ bw!
+ bw!
+ let &g:scrolloff = _gso
+endfunc
+
+func GetGlobalLocalWindowOptions()
+ new
+ sil! r $VIMRUNTIME/doc/options.txt
+ " Filter for global or local to window
+ v/^'.*'.*\n.*global or local to window |global-local/d
+ " get option value and type
+ sil %s/^'\([^']*\)'.*'\s\+\(\w\+\)\s\+(default \%(\(".*"\|\d\+\|empty\)\).*/\1 \2 \3/g
+ sil %s/empty/""/g
+ " split the result
+ let result=getline(1,'$')->map({_, val -> split(val, ' ')})
+ bw!
+ return result
+endfunc
+
+func Test_set_option_window_global_local_all()
+ new Xbuffer2
+
+ let optionlist = GetGlobalLocalWindowOptions()
+ for [opt, type, default] in optionlist
+ let _old = eval('&g:' .. opt)
+ if type == 'string'
+ if opt == 'fillchars'
+ exe 'setl ' .. opt .. '=vert:+'
+ exe 'setg ' .. opt .. '=vert:+,fold:+'
+ elseif opt == 'listchars'
+ exe 'setl ' .. opt .. '=tab:>>'
+ exe 'setg ' .. opt .. '=tab:++'
+ elseif opt == 'virtualedit'
+ exe 'setl ' .. opt .. '=all'
+ exe 'setg ' .. opt .. '=block'
+ else
+ exe 'setl ' .. opt .. '=Local'
+ exe 'setg ' .. opt .. '=Global'
+ endif
+ elseif type == 'number'
+ exe 'setl ' .. opt .. '=5'
+ exe 'setg ' .. opt .. '=10'
+ endif
+ setl modified
+ hide enew
+ if type == 'string'
+ call assert_equal('', eval('&l:' .. opt))
+ if opt == 'fillchars'
+ call assert_equal('vert:+,fold:+', eval('&g:' .. opt), 'option:' .. opt)
+ elseif opt == 'listchars'
+ call assert_equal('tab:++', eval('&g:' .. opt), 'option:' .. opt)
+ elseif opt == 'virtualedit'
+ call assert_equal('block', eval('&g:' .. opt), 'option:' .. opt)
+ else
+ call assert_equal('Global', eval('&g:' .. opt), 'option:' .. opt)
+ endif
+ elseif type == 'number'
+ call assert_equal(-1, eval('&l:' .. opt), 'option:' .. opt)
+ call assert_equal(10, eval('&g:' .. opt), 'option:' .. opt)
+ endif
+ bw!
+ exe 'let &g:' .. opt .. '=' .. default
+ endfor
+ bw!
+endfunc
+
" vim: shiftwidth=2 sts=2 expandtab