mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	Problem:    An OptionSet autocommand does not get enough info.
Solution:   Add v:option_command, v:option_oldlocal and v:option_oldglobal.
            (Latrice Wilgus, closes vim/vim#4118)
d7c9687947
		
	
		
			
				
	
	
		
			657 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			657 lines
		
	
	
		
			22 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
local helpers = require('test.functional.helpers')(after_each)
 | 
						|
local nvim = helpers.meths
 | 
						|
local clear, eq, neq, eval = helpers.clear, helpers.eq, helpers.neq, helpers.eval
 | 
						|
local curbuf, buf = helpers.curbuf, helpers.bufmeths
 | 
						|
local curwin = helpers.curwin
 | 
						|
local exec_capture = helpers.exec_capture
 | 
						|
local source, command = helpers.source, helpers.command
 | 
						|
 | 
						|
local function declare_hook_function()
 | 
						|
  source([[
 | 
						|
    fu! AutoCommand(match, bufnr, winnr)
 | 
						|
      let l:acc = {
 | 
						|
      \   'option'   : a:match,
 | 
						|
      \   'oldval'   : v:option_old,
 | 
						|
      \   'oldval_l' : v:option_oldlocal,
 | 
						|
      \   'oldval_g' : v:option_oldglobal,
 | 
						|
      \   'newval'   : v:option_new,
 | 
						|
      \   'scope'    : v:option_type,
 | 
						|
      \   'cmd'      : v:option_command,
 | 
						|
      \   'attr'     : {
 | 
						|
      \     'bufnr' : a:bufnr,
 | 
						|
      \     'winnr' : a:winnr,
 | 
						|
      \   }
 | 
						|
      \ }
 | 
						|
      call add(g:ret, l:acc)
 | 
						|
    endfu
 | 
						|
  ]])
 | 
						|
end
 | 
						|
 | 
						|
local function set_hook(pattern)
 | 
						|
  command(
 | 
						|
    'au OptionSet '
 | 
						|
    .. pattern ..
 | 
						|
    ' :call AutoCommand(expand("<amatch>"), bufnr("%"), winnr())'
 | 
						|
  )
 | 
						|
end
 | 
						|
 | 
						|
local function init_var()
 | 
						|
  command('let g:ret = []')
 | 
						|
end
 | 
						|
 | 
						|
local function get_result()
 | 
						|
  local ret = nvim.get_var('ret')
 | 
						|
  init_var()
 | 
						|
  return ret
 | 
						|
end
 | 
						|
 | 
						|
local function expected_table(option, oldval, oldval_l, oldval_g, newval, scope, cmd, attr)
 | 
						|
  return {
 | 
						|
    option   = option,
 | 
						|
    oldval   = tostring(oldval),
 | 
						|
    oldval_l = tostring(oldval_l),
 | 
						|
    oldval_g = tostring(oldval_g),
 | 
						|
    newval   = tostring(newval),
 | 
						|
    scope    = scope,
 | 
						|
    cmd      = cmd,
 | 
						|
    attr     = attr,
 | 
						|
  }
 | 
						|
end
 | 
						|
 | 
						|
local function expected_combination(...)
 | 
						|
  local args = {...}
 | 
						|
  local ret = get_result()
 | 
						|
 | 
						|
  if not (#args == #ret) then
 | 
						|
    local expecteds = {}
 | 
						|
    for _, v in pairs(args) do
 | 
						|
      table.insert(expecteds, expected_table(unpack(v)))
 | 
						|
    end
 | 
						|
    eq(expecteds, ret)
 | 
						|
    return
 | 
						|
  end
 | 
						|
 | 
						|
  for i, v in ipairs(args) do
 | 
						|
    local attr = v[8]
 | 
						|
    if not attr then
 | 
						|
      -- remove attr entries
 | 
						|
      ret[i].attr = nil
 | 
						|
    else
 | 
						|
      -- remove attr entries which are not required
 | 
						|
      for k in pairs(ret[i].attr) do
 | 
						|
        if not attr[k] then
 | 
						|
          ret[i].attr[k] = nil
 | 
						|
        end
 | 
						|
      end
 | 
						|
    end
 | 
						|
    eq(expected_table(unpack(v)), ret[i])
 | 
						|
  end
 | 
						|
end
 | 
						|
 | 
						|
local function expected_empty()
 | 
						|
  eq({}, get_result())
 | 
						|
end
 | 
						|
 | 
						|
local function make_buffer()
 | 
						|
  local old_buf = curbuf()
 | 
						|
  command('botright new')
 | 
						|
  local new_buf = curbuf()
 | 
						|
  command('wincmd p') -- move previous window
 | 
						|
 | 
						|
  neq(old_buf, new_buf)
 | 
						|
  eq(old_buf, curbuf())
 | 
						|
 | 
						|
  return new_buf
 | 
						|
end
 | 
						|
 | 
						|
local function get_new_window_number()
 | 
						|
  local old_win = curwin()
 | 
						|
  command('botright new')
 | 
						|
  local new_win = curwin()
 | 
						|
  local new_winnr = exec_capture('echo winnr()')
 | 
						|
  command('wincmd p') -- move previous window
 | 
						|
 | 
						|
  neq(old_win, new_win)
 | 
						|
  eq(old_win, curwin())
 | 
						|
 | 
						|
  return new_winnr
 | 
						|
end
 | 
						|
 | 
						|
describe('au OptionSet', function()
 | 
						|
  describe('with any option (*)', function()
 | 
						|
 | 
						|
    before_each(function()
 | 
						|
      clear()
 | 
						|
      declare_hook_function()
 | 
						|
      init_var()
 | 
						|
      set_hook('*')
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in setting number option', function()
 | 
						|
      command('set nu')
 | 
						|
      expected_combination({'number', 0, 0, 0, 1, 'global', 'set'})
 | 
						|
 | 
						|
      command('setlocal nonu')
 | 
						|
      expected_combination({'number', 1, 1, '', 0, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('setglobal nonu')
 | 
						|
      expected_combination({'number', 1, '', 1, 0, 'global', 'setglobal'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in setting autoindent option',function()
 | 
						|
      command('setlocal ai')
 | 
						|
      expected_combination({'autoindent', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('setglobal ai')
 | 
						|
      expected_combination({'autoindent', 0, '', 0, 1, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('set noai')
 | 
						|
      expected_combination({'autoindent', 1, 1, 1, 0, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in inverting global autoindent option',function()
 | 
						|
      command('set ai!')
 | 
						|
      expected_combination({'autoindent', 0, 0, 0, 1, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in being unset local autoindent option',function()
 | 
						|
      command('setlocal ai')
 | 
						|
      expected_combination({'autoindent', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('setlocal ai<')
 | 
						|
      expected_combination({'autoindent', 1, 1, '', 0, 'local', 'setlocal'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in setting global list and number option at the same time',function()
 | 
						|
      command('set list nu')
 | 
						|
      expected_combination(
 | 
						|
        {'list', 0, 0, 0, 1, 'global', 'set'},
 | 
						|
        {'number', 0, 0, 0, 1, 'global', 'set'}
 | 
						|
      )
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should not print anything, use :noa', function()
 | 
						|
      command('noa set nolist nonu')
 | 
						|
      expected_empty()
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in setting local acd', function()
 | 
						|
      command('setlocal acd')
 | 
						|
      expected_combination({'autochdir', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in setting autoread', function()
 | 
						|
      command('set noar')
 | 
						|
      expected_combination({'autoread', 1, 1, 1, 0, 'global', 'set'})
 | 
						|
 | 
						|
      command('setlocal ar')
 | 
						|
      expected_combination({'autoread', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in inverting global autoread', function()
 | 
						|
      command('setglobal invar')
 | 
						|
      expected_combination({'autoread', 1, '', 1, 0, 'global', 'setglobal'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called in setting backspace option through :let', function()
 | 
						|
      local oldval = eval('&backspace')
 | 
						|
 | 
						|
      command('let &bs=""')
 | 
						|
      expected_combination({'backspace', oldval, oldval, oldval, '', 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    describe('being set by setbufvar()', function()
 | 
						|
      it('should not trigger because option name is invalid', function()
 | 
						|
        command('silent! call setbufvar(1, "&l:bk", 1)')
 | 
						|
        expected_empty()
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger using correct option name', function()
 | 
						|
        command('call setbufvar(1, "&backup", 1)')
 | 
						|
        expected_combination({'backup', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger if the current buffer is different from the targetted buffer', function()
 | 
						|
        local new_buffer = make_buffer()
 | 
						|
        local new_bufnr = buf.get_number(new_buffer)
 | 
						|
 | 
						|
        command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
 | 
						|
        expected_combination({'buftype', '', '', '', 'nofile', 'local', 'setlocal', {bufnr = new_bufnr}})
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with string global option', function()
 | 
						|
      local oldval = eval('&backupext')
 | 
						|
 | 
						|
      command('set backupext=foo')
 | 
						|
      expected_combination({'backupext', oldval, oldval, oldval, 'foo', 'global', 'set'})
 | 
						|
 | 
						|
      command('set backupext&')
 | 
						|
      expected_combination({'backupext', 'foo', 'foo', 'foo', oldval, 'global', 'set'})
 | 
						|
 | 
						|
      command('setglobal backupext=bar')
 | 
						|
      expected_combination({'backupext', oldval, '', oldval, 'bar', 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa set backupext&')
 | 
						|
      -- As this is a global option this sets the global value even though :setlocal is used!
 | 
						|
      command('setlocal backupext=baz')
 | 
						|
      expected_combination({'backupext', oldval, oldval, '', 'baz', 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal backupext=ext_global')
 | 
						|
      command('noa setlocal backupext=ext_local') -- Sets the global(!) value
 | 
						|
      command('set backupext=foo')
 | 
						|
      expected_combination({
 | 
						|
        'backupext', 'ext_local', 'ext_local', 'ext_local', 'foo', 'global', 'set'
 | 
						|
      })
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with string global-local (to buffer) option', function()
 | 
						|
      local oldval = eval('&tags')
 | 
						|
 | 
						|
      command('set tags=tagpath')
 | 
						|
      expected_combination({'tags', oldval, oldval, oldval, 'tagpath', 'global', 'set'})
 | 
						|
 | 
						|
      command('set tags&')
 | 
						|
      expected_combination({'tags', 'tagpath', 'tagpath', 'tagpath', oldval, 'global', 'set'})
 | 
						|
 | 
						|
      command('setglobal tags=tagpath1')
 | 
						|
      expected_combination({'tags', oldval, '', oldval, 'tagpath1', 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('setlocal tags=tagpath2')
 | 
						|
      expected_combination({'tags', 'tagpath1', 'tagpath1', '', 'tagpath2', 'local', 'setlocal'})
 | 
						|
 | 
						|
      -- Note: v:option_old is the old global value for global-local string options
 | 
						|
      -- but the old local value for all other kinds of options.
 | 
						|
      command('noa setglobal tags=tag_global')
 | 
						|
      command('noa setlocal tags=tag_local')
 | 
						|
      command('set tags=tagpath')
 | 
						|
      expected_combination({
 | 
						|
        'tags', 'tag_global', 'tag_local', 'tag_global', 'tagpath', 'global', 'set'
 | 
						|
      })
 | 
						|
 | 
						|
      -- Note: v:option_old is the old global value for global-local string options
 | 
						|
      -- but the old local value for all other kinds of options.
 | 
						|
      command('noa set tags=tag_global')
 | 
						|
      command('noa setlocal tags=')
 | 
						|
      command('set tags=tagpath')
 | 
						|
      expected_combination({'tags', 'tag_global', '', 'tag_global', 'tagpath', 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with string local (to buffer) option', function()
 | 
						|
      local oldval = eval('&spelllang')
 | 
						|
 | 
						|
      command('set spelllang=elvish,klingon')
 | 
						|
      expected_combination({'spelllang', oldval, oldval, oldval, 'elvish,klingon', 'global', 'set'})
 | 
						|
 | 
						|
      command('set spelllang&')
 | 
						|
      expected_combination({
 | 
						|
        'spelllang', 'elvish,klingon', 'elvish,klingon', 'elvish,klingon', oldval, 'global', 'set'
 | 
						|
      })
 | 
						|
 | 
						|
      command('setglobal spelllang=elvish')
 | 
						|
      expected_combination({'spelllang', oldval, '', oldval, 'elvish', 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa set spelllang&')
 | 
						|
      command('setlocal spelllang=klingon')
 | 
						|
      expected_combination({'spelllang', oldval, oldval, '', 'klingon', 'local', 'setlocal'})
 | 
						|
 | 
						|
      -- Note: v:option_old is the old global value for global-local string options
 | 
						|
      -- but the old local value for all other kinds of options.
 | 
						|
      command('noa setglobal spelllang=spellglobal')
 | 
						|
      command('noa setlocal spelllang=spelllocal')
 | 
						|
      command('set spelllang=foo')
 | 
						|
      expected_combination({
 | 
						|
        'spelllang', 'spelllocal', 'spelllocal', 'spellglobal', 'foo', 'global', 'set'
 | 
						|
      })
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with string global-local (to window) option', function()
 | 
						|
      local oldval = eval('&statusline')
 | 
						|
 | 
						|
      command('set statusline=foo')
 | 
						|
      expected_combination({'statusline', oldval, oldval, '', 'foo', 'global', 'set'})
 | 
						|
 | 
						|
      -- Note: v:option_old is the old global value for global-local string options
 | 
						|
      -- but the old local value for all other kinds of options.
 | 
						|
      command('set statusline&')
 | 
						|
      expected_combination({'statusline', 'foo', 'foo', 'foo', oldval, 'global', 'set'})
 | 
						|
 | 
						|
      command('setglobal statusline=bar')
 | 
						|
      expected_combination({'statusline', oldval, '', oldval, 'bar', 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa set statusline&')
 | 
						|
      command('setlocal statusline=baz')
 | 
						|
      expected_combination({'statusline', oldval, oldval, '', 'baz', 'local', 'setlocal'})
 | 
						|
 | 
						|
      -- Note: v:option_old is the old global value for global-local string options
 | 
						|
      -- but the old local value for all other kinds of options.
 | 
						|
      command('noa setglobal statusline=bar')
 | 
						|
      command('noa setlocal statusline=baz')
 | 
						|
      command('set statusline=foo')
 | 
						|
      expected_combination({'statusline', 'bar', 'baz', 'bar', 'foo', 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with string local (to window) option', function()
 | 
						|
      local oldval = eval('&foldignore')
 | 
						|
 | 
						|
      command('set foldignore=fo')
 | 
						|
      expected_combination({'foldignore', oldval, oldval, oldval, 'fo', 'global', 'set'})
 | 
						|
 | 
						|
      command('set foldignore&')
 | 
						|
      expected_combination({'foldignore', 'fo', 'fo', 'fo', oldval, 'global', 'set'})
 | 
						|
 | 
						|
      command('setglobal foldignore=bar')
 | 
						|
      expected_combination({'foldignore', oldval, '', oldval, 'bar', 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa set foldignore&')
 | 
						|
      command('setlocal foldignore=baz')
 | 
						|
      expected_combination({'foldignore', oldval, oldval, '', 'baz', 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal foldignore=glob')
 | 
						|
      command('noa setlocal foldignore=loc')
 | 
						|
      command('set foldignore=fo')
 | 
						|
      expected_combination({'foldignore', 'loc', 'loc', 'glob', 'fo', 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with number global option', function()
 | 
						|
      command('noa setglobal cmdheight=8')
 | 
						|
      command('noa setlocal cmdheight=1') -- Sets the global(!) value
 | 
						|
      command('setglobal cmdheight=2')
 | 
						|
      expected_combination({'cmdheight', 1, '', 1, 2, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal cmdheight=8')
 | 
						|
      command('noa setlocal cmdheight=1') -- Sets the global(!) value
 | 
						|
      command('setlocal cmdheight=2')
 | 
						|
      expected_combination({'cmdheight', 1, 1, '', 2, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal cmdheight=8')
 | 
						|
      command('noa setlocal cmdheight=1') -- Sets the global(!) value
 | 
						|
      command('set cmdheight=2')
 | 
						|
      expected_combination({'cmdheight', 1, 1, 1, 2, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set cmdheight=8')
 | 
						|
      command('set cmdheight=2')
 | 
						|
      expected_combination({'cmdheight', 8, 8, 8, 2, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with number global-local (to buffer) option', function()
 | 
						|
      command('noa setglobal undolevels=8')
 | 
						|
      command('noa setlocal undolevels=1')
 | 
						|
      command('setglobal undolevels=2')
 | 
						|
      expected_combination({'undolevels', 8, '', 8, 2, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal undolevels=8')
 | 
						|
      command('noa setlocal undolevels=1')
 | 
						|
      command('setlocal undolevels=2')
 | 
						|
      expected_combination({'undolevels', 1, 1, '', 2, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal undolevels=8')
 | 
						|
      command('noa setlocal undolevels=1')
 | 
						|
      command('set undolevels=2')
 | 
						|
      expected_combination({'undolevels', 1, 1, 8, 2, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set undolevels=8')
 | 
						|
      command('set undolevels=2')
 | 
						|
      expected_combination({'undolevels', 8, 8, 8, 2, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with number local (to buffer) option', function()
 | 
						|
      command('noa setglobal wrapmargin=8')
 | 
						|
      command('noa setlocal wrapmargin=1')
 | 
						|
      command('setglobal wrapmargin=2')
 | 
						|
      expected_combination({'wrapmargin', 8, '', 8, 2, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal wrapmargin=8')
 | 
						|
      command('noa setlocal wrapmargin=1')
 | 
						|
      command('setlocal wrapmargin=2')
 | 
						|
      expected_combination({'wrapmargin', 1, 1, '', 2, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal wrapmargin=8')
 | 
						|
      command('noa setlocal wrapmargin=1')
 | 
						|
      command('set wrapmargin=2')
 | 
						|
      expected_combination({'wrapmargin', 1, 1, 8, 2, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set wrapmargin=8')
 | 
						|
      command('set wrapmargin=2')
 | 
						|
      expected_combination({'wrapmargin', 8, 8, 8, 2, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with number global-local (to window) option', function()
 | 
						|
      command('noa setglobal scrolloff=8')
 | 
						|
      command('noa setlocal scrolloff=1')
 | 
						|
      command('setglobal scrolloff=2')
 | 
						|
      expected_combination({'scrolloff', 8, '', 8, 2, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal scrolloff=8')
 | 
						|
      command('noa setlocal scrolloff=1')
 | 
						|
      command('setlocal scrolloff=2')
 | 
						|
      expected_combination({'scrolloff', 1, 1, '', 2, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal scrolloff=8')
 | 
						|
      command('noa setlocal scrolloff=1')
 | 
						|
      command('set scrolloff=2')
 | 
						|
      expected_combination({'scrolloff', 1, 1, 8, 2, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set scrolloff=8')
 | 
						|
      command('set scrolloff=2')
 | 
						|
      expected_combination({'scrolloff', 8, 8, 8, 2, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with number local (to window) option', function()
 | 
						|
      command('noa setglobal foldcolumn=8')
 | 
						|
      command('noa setlocal foldcolumn=1')
 | 
						|
      command('setglobal foldcolumn=2')
 | 
						|
      expected_combination({'foldcolumn', 8, '', 8, 2, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal foldcolumn=8')
 | 
						|
      command('noa setlocal foldcolumn=1')
 | 
						|
      command('setlocal foldcolumn=2')
 | 
						|
      expected_combination({'foldcolumn', 1, 1, '', 2, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal foldcolumn=8')
 | 
						|
      command('noa setlocal foldcolumn=1')
 | 
						|
      command('set foldcolumn=2')
 | 
						|
      expected_combination({'foldcolumn', 1, 1, 8, 2, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set foldcolumn=8')
 | 
						|
      command('set foldcolumn=2')
 | 
						|
      expected_combination({'foldcolumn', 8, 8, 8, 2, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with boolean global option', function()
 | 
						|
      command('noa setglobal nowrapscan')
 | 
						|
      command('noa setlocal wrapscan') -- Sets the global(!) value
 | 
						|
      command('setglobal nowrapscan')
 | 
						|
      expected_combination({'wrapscan', 1, '', 1, 0, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal nowrapscan')
 | 
						|
      command('noa setlocal wrapscan') -- Sets the global(!) value
 | 
						|
      command('setlocal nowrapscan')
 | 
						|
      expected_combination({'wrapscan', 1, 1, '', 0, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal nowrapscan')
 | 
						|
      command('noa setlocal wrapscan') -- Sets the global(!) value
 | 
						|
      command('set nowrapscan')
 | 
						|
      expected_combination({'wrapscan', 1, 1, 1, 0, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set nowrapscan')
 | 
						|
      command('set wrapscan')
 | 
						|
      expected_combination({'wrapscan', 0, 0, 0, 1, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with boolean global-local (to buffer) option', function()
 | 
						|
      command('noa setglobal noautoread')
 | 
						|
      command('noa setlocal autoread')
 | 
						|
      command('setglobal autoread')
 | 
						|
      expected_combination({'autoread', 0, '', 0, 1, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal noautoread')
 | 
						|
      command('noa setlocal autoread')
 | 
						|
      command('setlocal noautoread')
 | 
						|
      expected_combination({'autoread', 1, 1, '', 0, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal noautoread')
 | 
						|
      command('noa setlocal autoread')
 | 
						|
      command('set autoread')
 | 
						|
      expected_combination({'autoread', 1, 1, 0, 1, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set noautoread')
 | 
						|
      command('set autoread')
 | 
						|
      expected_combination({'autoread', 0, 0, 0, 1, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with boolean local (to buffer) option', function()
 | 
						|
      command('noa setglobal nocindent')
 | 
						|
      command('noa setlocal cindent')
 | 
						|
      command('setglobal cindent')
 | 
						|
      expected_combination({'cindent', 0, '', 0, 1, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal nocindent')
 | 
						|
      command('noa setlocal cindent')
 | 
						|
      command('setlocal nocindent')
 | 
						|
      expected_combination({'cindent', 1, 1, '', 0, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal nocindent')
 | 
						|
      command('noa setlocal cindent')
 | 
						|
      command('set cindent')
 | 
						|
      expected_combination({'cindent', 1, 1, 0, 1, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set nocindent')
 | 
						|
      command('set cindent')
 | 
						|
      expected_combination({'cindent', 0, 0, 0, 1, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with boolean local (to window) option', function()
 | 
						|
      command('noa setglobal nocursorcolumn')
 | 
						|
      command('noa setlocal cursorcolumn')
 | 
						|
      command('setglobal cursorcolumn')
 | 
						|
      expected_combination({'cursorcolumn', 0, '', 0, 1, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('noa setglobal nocursorcolumn')
 | 
						|
      command('noa setlocal cursorcolumn')
 | 
						|
      command('setlocal nocursorcolumn')
 | 
						|
      expected_combination({'cursorcolumn', 1, 1, '', 0, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('noa setglobal nocursorcolumn')
 | 
						|
      command('noa setlocal cursorcolumn')
 | 
						|
      command('set cursorcolumn')
 | 
						|
      expected_combination({'cursorcolumn', 1, 1, 0, 1, 'global', 'set'})
 | 
						|
 | 
						|
      command('noa set nocursorcolumn')
 | 
						|
      command('set cursorcolumn')
 | 
						|
      expected_combination({'cursorcolumn', 0, 0, 0, 1, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    it('with option value converted internally', function()
 | 
						|
      command('noa set backspace=1')
 | 
						|
      command('set backspace=2')
 | 
						|
      expected_combination(({
 | 
						|
        'backspace', 'indent,eol', 'indent,eol', 'indent,eol', '2', 'global', 'set'
 | 
						|
      }))
 | 
						|
    end)
 | 
						|
  end)
 | 
						|
 | 
						|
  describe('with specific option', function()
 | 
						|
 | 
						|
    before_each(function()
 | 
						|
      clear()
 | 
						|
      declare_hook_function()
 | 
						|
      init_var()
 | 
						|
    end)
 | 
						|
 | 
						|
    it('should be called iff setting readonly', function()
 | 
						|
      set_hook('readonly')
 | 
						|
 | 
						|
      command('set nu')
 | 
						|
      expected_empty()
 | 
						|
 | 
						|
      command('setlocal ro')
 | 
						|
      expected_combination({'readonly', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
 | 
						|
      command('setglobal ro')
 | 
						|
      expected_combination({'readonly', 0, '', 0, 1, 'global', 'setglobal'})
 | 
						|
 | 
						|
      command('set noro')
 | 
						|
      expected_combination({'readonly', 1, 1, 1, 0, 'global', 'set'})
 | 
						|
    end)
 | 
						|
 | 
						|
    describe('being set by setbufvar()', function()
 | 
						|
      it('should not trigger because option name does not match with backup', function()
 | 
						|
        set_hook('backup')
 | 
						|
 | 
						|
        command('silent! call setbufvar(1, "&l:bk", 1)')
 | 
						|
        expected_empty()
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger, use correct option name backup', function()
 | 
						|
        set_hook('backup')
 | 
						|
 | 
						|
        command('call setbufvar(1, "&backup", 1)')
 | 
						|
        expected_combination({'backup', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger if the current buffer is different from the targetted buffer', function()
 | 
						|
        set_hook('buftype')
 | 
						|
 | 
						|
        local new_buffer = make_buffer()
 | 
						|
        local new_bufnr = buf.get_number(new_buffer)
 | 
						|
 | 
						|
        command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
 | 
						|
        expected_combination({'buftype', '', '', '', 'nofile', 'local', 'setlocal', {bufnr = new_bufnr}})
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
 | 
						|
    describe('being set by setwinvar()', function()
 | 
						|
      it('should not trigger because option name does not match with backup', function()
 | 
						|
        set_hook('backup')
 | 
						|
 | 
						|
        command('silent! call setwinvar(1, "&l:bk", 1)')
 | 
						|
        expected_empty()
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger, use correct option name backup', function()
 | 
						|
        set_hook('backup')
 | 
						|
 | 
						|
        command('call setwinvar(1, "&backup", 1)')
 | 
						|
        expected_combination({'backup', 0, 0, '', 1, 'local', 'setlocal'})
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should not trigger if the current window is different from the targetted window', function()
 | 
						|
        set_hook('cursorcolumn')
 | 
						|
 | 
						|
        local new_winnr = get_new_window_number()
 | 
						|
 | 
						|
        command('call setwinvar(' .. new_winnr .. ', "&cursorcolumn", 1)')
 | 
						|
        -- expected_combination({'cursorcolumn', 0, 1, 'local', {winnr = new_winnr}})
 | 
						|
        expected_empty()
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
 | 
						|
    describe('being set by neovim api', function()
 | 
						|
      it('should trigger if a boolean option be set globally', function()
 | 
						|
        set_hook('autochdir')
 | 
						|
 | 
						|
        nvim.set_option('autochdir', true)
 | 
						|
        eq(true, nvim.get_option('autochdir'))
 | 
						|
        expected_combination({'autochdir', 0, '', 0, 1, 'global', 'setglobal'})
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger if a number option be set globally', function()
 | 
						|
        set_hook('cmdheight')
 | 
						|
 | 
						|
        nvim.set_option('cmdheight', 5)
 | 
						|
        eq(5, nvim.get_option('cmdheight'))
 | 
						|
        expected_combination({'cmdheight', 1, '', 1, 5, 'global', 'setglobal'})
 | 
						|
      end)
 | 
						|
 | 
						|
      it('should trigger if a string option be set globally', function()
 | 
						|
        set_hook('ambiwidth')
 | 
						|
 | 
						|
        nvim.set_option('ambiwidth', 'double')
 | 
						|
        eq('double', nvim.get_option('ambiwidth'))
 | 
						|
        expected_combination({'ambiwidth', 'single', '', 'single', 'double', 'global', 'setglobal'})
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
  end)
 | 
						|
end)
 |