mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-03 17:24:29 +00:00 
			
		
		
		
	test: normalise nvim bridge functions
- remove helpers.cur*meths - remove helpers.nvim
This commit is contained in:
		@@ -109,12 +109,12 @@ describe('autocmd api', function()
 | 
			
		||||
        buffer = 0,
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      meths.nvim_command 'set filetype=txt'
 | 
			
		||||
      command 'set filetype=txt'
 | 
			
		||||
      eq(1, meths.nvim_get_var('called'))
 | 
			
		||||
 | 
			
		||||
      -- switch to a new buffer
 | 
			
		||||
      meths.nvim_command 'new'
 | 
			
		||||
      meths.nvim_command 'set filetype=python'
 | 
			
		||||
      command 'new'
 | 
			
		||||
      command 'set filetype=python'
 | 
			
		||||
 | 
			
		||||
      eq(1, meths.nvim_get_var('called'))
 | 
			
		||||
    end)
 | 
			
		||||
@@ -938,7 +938,7 @@ describe('autocmd api', function()
 | 
			
		||||
      meths.nvim_exec_autocmds('CursorHold', { buffer = 1 })
 | 
			
		||||
      eq('none', meths.nvim_get_var('filename_executed'))
 | 
			
		||||
 | 
			
		||||
      meths.nvim_command('edit __init__.py')
 | 
			
		||||
      command('edit __init__.py')
 | 
			
		||||
      eq('__init__.py', meths.nvim_get_var('filename_executed'))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
@@ -955,8 +955,8 @@ describe('autocmd api', function()
 | 
			
		||||
      meths.nvim_set_var('filename_executed', 'none')
 | 
			
		||||
      eq('none', meths.nvim_get_var('filename_executed'))
 | 
			
		||||
 | 
			
		||||
      meths.nvim_command('edit other_file.txt')
 | 
			
		||||
      meths.nvim_command('edit __init__.py')
 | 
			
		||||
      command('edit other_file.txt')
 | 
			
		||||
      command('edit __init__.py')
 | 
			
		||||
      eq('none', meths.nvim_get_var('filename_executed'))
 | 
			
		||||
 | 
			
		||||
      meths.nvim_create_autocmd('CursorHoldI', {
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -2,8 +2,8 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local eq, ok = helpers.eq, helpers.ok
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local buffer, command, eval, nvim, next_msg =
 | 
			
		||||
  helpers.buffer, helpers.command, helpers.eval, helpers.nvim, helpers.next_msg
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local command, eval, next_msg = helpers.command, helpers.eval, helpers.next_msg
 | 
			
		||||
local nvim_prog = helpers.nvim_prog
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local sleep = vim.uv.sleep
 | 
			
		||||
@@ -24,7 +24,7 @@ local function expectn(name, args)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function sendkeys(keys)
 | 
			
		||||
  nvim('input', keys)
 | 
			
		||||
  meths.nvim_input(keys)
 | 
			
		||||
  -- give nvim some time to process msgpack requests before possibly sending
 | 
			
		||||
  -- more key presses - otherwise they all pile up in the queue and get
 | 
			
		||||
  -- processed at once
 | 
			
		||||
@@ -37,7 +37,7 @@ local function open(activate, lines)
 | 
			
		||||
  local filename = helpers.tmpname()
 | 
			
		||||
  write_file(filename, table.concat(lines, '\n') .. '\n', true)
 | 
			
		||||
  command('edit ' .. filename)
 | 
			
		||||
  local b = nvim('get_current_buf')
 | 
			
		||||
  local b = meths.nvim_get_current_buf()
 | 
			
		||||
  -- what is the value of b:changedtick?
 | 
			
		||||
  local tick = eval('b:changedtick')
 | 
			
		||||
 | 
			
		||||
@@ -45,7 +45,7 @@ local function open(activate, lines)
 | 
			
		||||
  -- arrive as expected
 | 
			
		||||
  if activate then
 | 
			
		||||
    local firstline = 0
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
    expectn('nvim_buf_lines_event', { b, tick, firstline, -1, lines, false })
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
@@ -62,12 +62,12 @@ local function editoriginal(activate, lines)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function reopen(buf, expectedlines)
 | 
			
		||||
  ok(buffer('detach', buf))
 | 
			
		||||
  ok(meths.nvim_buf_detach(buf))
 | 
			
		||||
  expectn('nvim_buf_detach_event', { buf })
 | 
			
		||||
  -- for some reason the :edit! increments tick by 2
 | 
			
		||||
  command('edit!')
 | 
			
		||||
  local tick = eval('b:changedtick')
 | 
			
		||||
  ok(buffer('attach', buf, true, {}))
 | 
			
		||||
  ok(meths.nvim_buf_attach(buf, true, {}))
 | 
			
		||||
  local firstline = 0
 | 
			
		||||
  expectn('nvim_buf_lines_event', { buf, tick, firstline, -1, expectedlines, false })
 | 
			
		||||
  command('normal! gg')
 | 
			
		||||
@@ -197,21 +197,21 @@ describe('API: buffer events:', function()
 | 
			
		||||
    -- add a line at the start of an empty file
 | 
			
		||||
    command('enew')
 | 
			
		||||
    tick = eval('b:changedtick')
 | 
			
		||||
    local b2 = nvim('get_current_buf')
 | 
			
		||||
    ok(buffer('attach', b2, true, {}))
 | 
			
		||||
    local b2 = meths.nvim_get_current_buf()
 | 
			
		||||
    ok(meths.nvim_buf_attach(b2, true, {}))
 | 
			
		||||
    expectn('nvim_buf_lines_event', { b2, tick, 0, -1, { '' }, false })
 | 
			
		||||
    eval('append(0, ["new line 1"])')
 | 
			
		||||
    tick = tick + 1
 | 
			
		||||
    expectn('nvim_buf_lines_event', { b2, tick, 0, 0, { 'new line 1' }, false })
 | 
			
		||||
 | 
			
		||||
    -- turn off buffer events manually
 | 
			
		||||
    buffer('detach', b2)
 | 
			
		||||
    meths.nvim_buf_detach(b2)
 | 
			
		||||
    expectn('nvim_buf_detach_event', { b2 })
 | 
			
		||||
 | 
			
		||||
    -- add multiple lines to a blank file
 | 
			
		||||
    command('enew!')
 | 
			
		||||
    local b3 = nvim('get_current_buf')
 | 
			
		||||
    ok(buffer('attach', b3, true, {}))
 | 
			
		||||
    local b3 = meths.nvim_get_current_buf()
 | 
			
		||||
    ok(meths.nvim_buf_attach(b3, true, {}))
 | 
			
		||||
    tick = eval('b:changedtick')
 | 
			
		||||
    expectn('nvim_buf_lines_event', { b3, tick, 0, -1, { '' }, false })
 | 
			
		||||
    eval('append(0, ["new line 1", "new line 2", "new line 3"])')
 | 
			
		||||
@@ -222,7 +222,7 @@ describe('API: buffer events:', function()
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    -- use the API itself to add a line to the start of the buffer
 | 
			
		||||
    buffer('set_lines', b3, 0, 0, true, { 'New First Line' })
 | 
			
		||||
    meths.nvim_buf_set_lines(b3, 0, 0, true, { 'New First Line' })
 | 
			
		||||
    tick = tick + 1
 | 
			
		||||
    expectn('nvim_buf_lines_event', { b3, tick, 0, 0, { 'New First Line' }, false })
 | 
			
		||||
  end)
 | 
			
		||||
@@ -306,8 +306,8 @@ describe('API: buffer events:', function()
 | 
			
		||||
    command('bdelete!')
 | 
			
		||||
    tick = 2
 | 
			
		||||
    expectn('nvim_buf_detach_event', { b })
 | 
			
		||||
    local bnew = nvim('get_current_buf')
 | 
			
		||||
    ok(buffer('attach', bnew, true, {}))
 | 
			
		||||
    local bnew = meths.nvim_get_current_buf()
 | 
			
		||||
    ok(meths.nvim_buf_attach(bnew, true, {}))
 | 
			
		||||
    expectn('nvim_buf_lines_event', { bnew, tick, 0, -1, { '' }, false })
 | 
			
		||||
    sendkeys('i')
 | 
			
		||||
    sendkeys('h')
 | 
			
		||||
@@ -472,25 +472,25 @@ describe('API: buffer events:', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('does not get confused if enabled/disabled many times', function()
 | 
			
		||||
    local channel = nvim('get_api_info')[1]
 | 
			
		||||
    local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
    local b, tick = editoriginal(false)
 | 
			
		||||
 | 
			
		||||
    -- Enable buffer events many times.
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
    expectn('nvim_buf_lines_event', { b, tick, 0, -1, origlines, false })
 | 
			
		||||
    eval('rpcnotify(' .. channel .. ', "Hello There")')
 | 
			
		||||
    expectn('Hello There', {})
 | 
			
		||||
 | 
			
		||||
    -- Disable buffer events many times.
 | 
			
		||||
    ok(buffer('detach', b))
 | 
			
		||||
    ok(buffer('detach', b))
 | 
			
		||||
    ok(buffer('detach', b))
 | 
			
		||||
    ok(buffer('detach', b))
 | 
			
		||||
    ok(buffer('detach', b))
 | 
			
		||||
    ok(meths.nvim_buf_detach(b))
 | 
			
		||||
    ok(meths.nvim_buf_detach(b))
 | 
			
		||||
    ok(meths.nvim_buf_detach(b))
 | 
			
		||||
    ok(meths.nvim_buf_detach(b))
 | 
			
		||||
    ok(meths.nvim_buf_detach(b))
 | 
			
		||||
    expectn('nvim_buf_detach_event', { b })
 | 
			
		||||
    eval('rpcnotify(' .. channel .. ', "Hello Again")')
 | 
			
		||||
    expectn('Hello Again', {})
 | 
			
		||||
@@ -573,7 +573,7 @@ describe('API: buffer events:', function()
 | 
			
		||||
 | 
			
		||||
  it('works with :diffput and :diffget', function()
 | 
			
		||||
    local b1, tick1 = editoriginal(true, { 'AAA', 'BBB' })
 | 
			
		||||
    local channel = nvim('get_api_info')[1]
 | 
			
		||||
    local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
    command('diffthis')
 | 
			
		||||
    command('rightbelow vsplit')
 | 
			
		||||
    local b2, tick2 = open(true, { 'BBB', 'CCC' })
 | 
			
		||||
@@ -690,7 +690,7 @@ describe('API: buffer events:', function()
 | 
			
		||||
 | 
			
		||||
  it('detaches if the buffer is closed', function()
 | 
			
		||||
    local b, tick = editoriginal(true, { 'AAA' })
 | 
			
		||||
    local channel = nvim('get_api_info')[1]
 | 
			
		||||
    local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
 | 
			
		||||
    -- Test that buffer events are working.
 | 
			
		||||
    command('normal! x')
 | 
			
		||||
@@ -729,7 +729,7 @@ describe('API: buffer events:', function()
 | 
			
		||||
 | 
			
		||||
  it(':enew! does not detach hidden buffer', function()
 | 
			
		||||
    local b, tick = editoriginal(true, { 'AAA', 'BBB' })
 | 
			
		||||
    local channel = nvim('get_api_info')[1]
 | 
			
		||||
    local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
 | 
			
		||||
    command('set undoreload=1 hidden')
 | 
			
		||||
    command('normal! x')
 | 
			
		||||
@@ -743,7 +743,7 @@ describe('API: buffer events:', function()
 | 
			
		||||
 | 
			
		||||
  it('stays attached if the buffer is hidden', function()
 | 
			
		||||
    local b, tick = editoriginal(true, { 'AAA' })
 | 
			
		||||
    local channel = nvim('get_api_info')[1]
 | 
			
		||||
    local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
 | 
			
		||||
    -- Test that buffer events are working.
 | 
			
		||||
    command('normal! x')
 | 
			
		||||
@@ -790,14 +790,14 @@ describe('API: buffer events:', function()
 | 
			
		||||
  it('does not send the buffer content if not requested', function()
 | 
			
		||||
    clear()
 | 
			
		||||
    local b, tick = editoriginal(false)
 | 
			
		||||
    ok(buffer('attach', b, false, {}))
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, false, {}))
 | 
			
		||||
    expectn('nvim_buf_changedtick_event', { b, tick })
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('returns a proper error on nonempty options dict', function()
 | 
			
		||||
    clear()
 | 
			
		||||
    local b = editoriginal(false)
 | 
			
		||||
    eq("Invalid key: 'builtin'", pcall_err(buffer, 'attach', b, false, { builtin = 'asfd' }))
 | 
			
		||||
    eq("Invalid key: 'builtin'", pcall_err(meths.nvim_buf_attach, b, false, { builtin = 'asfd' }))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('nvim_buf_attach returns response after delay #8634', function()
 | 
			
		||||
@@ -873,8 +873,8 @@ describe('API: buffer events:', function()
 | 
			
		||||
      env = { VIMRUNTIME = os.getenv('VIMRUNTIME') },
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    local b = nvim('get_current_buf')
 | 
			
		||||
    ok(buffer('attach', b, true, {}))
 | 
			
		||||
    local b = meths.nvim_get_current_buf()
 | 
			
		||||
    ok(meths.nvim_buf_attach(b, true, {}))
 | 
			
		||||
 | 
			
		||||
    for _ = 1, 22 do
 | 
			
		||||
      table.insert(expected_lines, '~')
 | 
			
		||||
 
 | 
			
		||||
@@ -3,10 +3,8 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local NIL = vim.NIL
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local bufmeths = helpers.bufmeths
 | 
			
		||||
local matches = helpers.matches
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
@@ -74,16 +72,16 @@ describe('nvim_get_commands', function()
 | 
			
		||||
  it('gets buffer-local user-defined commands', function()
 | 
			
		||||
    -- Define a buffer-local command.
 | 
			
		||||
    command('command -buffer -nargs=1 Hello echo "Hello World"')
 | 
			
		||||
    eq({ Hello = cmd_dict }, curbufmeths.get_commands({ builtin = false }))
 | 
			
		||||
    eq({ Hello = cmd_dict }, meths.nvim_buf_get_commands(0, { builtin = false }))
 | 
			
		||||
    -- Define another buffer-local command.
 | 
			
		||||
    command('command -buffer -nargs=? Pwd pwd')
 | 
			
		||||
    eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, curbufmeths.get_commands({ builtin = false }))
 | 
			
		||||
    eq({ Hello = cmd_dict, Pwd = cmd_dict2 }, meths.nvim_buf_get_commands(0, { builtin = false }))
 | 
			
		||||
    -- Delete a command.
 | 
			
		||||
    command('delcommand Pwd')
 | 
			
		||||
    eq({ Hello = cmd_dict }, curbufmeths.get_commands({ builtin = false }))
 | 
			
		||||
    eq({ Hello = cmd_dict }, meths.nvim_buf_get_commands(0, { builtin = false }))
 | 
			
		||||
 | 
			
		||||
    -- {builtin=true} always returns empty for buffer-local case.
 | 
			
		||||
    eq({}, curbufmeths.get_commands({ builtin = true }))
 | 
			
		||||
    eq({}, meths.nvim_buf_get_commands(0, { builtin = true }))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('gets various command attributes', function()
 | 
			
		||||
@@ -203,7 +201,7 @@ describe('nvim_create_user_command', function()
 | 
			
		||||
 | 
			
		||||
  it('works with strings', function()
 | 
			
		||||
    meths.nvim_create_user_command('SomeCommand', 'let g:command_fired = <args>', { nargs = 1 })
 | 
			
		||||
    meths.nvim_command('SomeCommand 42')
 | 
			
		||||
    command('SomeCommand 42')
 | 
			
		||||
    eq(42, meths.nvim_eval('g:command_fired'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -647,10 +645,10 @@ describe('nvim_create_user_command', function()
 | 
			
		||||
 | 
			
		||||
  it('can define buffer-local commands', function()
 | 
			
		||||
    local bufnr = meths.nvim_create_buf(false, false)
 | 
			
		||||
    bufmeths.create_user_command(bufnr, 'Hello', '', {})
 | 
			
		||||
    matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello'))
 | 
			
		||||
    meths.nvim_buf_create_user_command(bufnr, 'Hello', '', {})
 | 
			
		||||
    matches('Not an editor command: Hello', pcall_err(command, 'Hello'))
 | 
			
		||||
    meths.nvim_set_current_buf(bufnr)
 | 
			
		||||
    meths.nvim_command('Hello')
 | 
			
		||||
    command('Hello')
 | 
			
		||||
    assert_alive()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -762,15 +760,15 @@ describe('nvim_del_user_command', function()
 | 
			
		||||
 | 
			
		||||
  it('can delete global commands', function()
 | 
			
		||||
    meths.nvim_create_user_command('Hello', 'echo "Hi"', {})
 | 
			
		||||
    meths.nvim_command('Hello')
 | 
			
		||||
    command('Hello')
 | 
			
		||||
    meths.nvim_del_user_command('Hello')
 | 
			
		||||
    matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello'))
 | 
			
		||||
    matches('Not an editor command: Hello', pcall_err(command, 'Hello'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can delete buffer-local commands', function()
 | 
			
		||||
    bufmeths.create_user_command(0, 'Hello', 'echo "Hi"', {})
 | 
			
		||||
    meths.nvim_command('Hello')
 | 
			
		||||
    bufmeths.del_user_command(0, 'Hello')
 | 
			
		||||
    matches('Not an editor command: Hello', pcall_err(meths.nvim_command, 'Hello'))
 | 
			
		||||
    meths.nvim_buf_create_user_command(0, 'Hello', 'echo "Hi"', {})
 | 
			
		||||
    command('Hello')
 | 
			
		||||
    meths.nvim_buf_del_user_command(0, 'Hello')
 | 
			
		||||
    matches('Not an editor command: Hello', pcall_err(command, 'Hello'))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,6 @@ local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local request = helpers.request
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local ok = helpers.ok
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local bufmeths = helpers.bufmeths
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
@@ -26,21 +24,21 @@ local function set_extmark(ns_id, id, line, col, opts)
 | 
			
		||||
  if id ~= nil and id ~= 0 then
 | 
			
		||||
    opts.id = id
 | 
			
		||||
  end
 | 
			
		||||
  return curbufmeths.set_extmark(ns_id, line, col, opts)
 | 
			
		||||
  return meths.nvim_buf_set_extmark(0, ns_id, line, col, opts)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function get_extmarks(ns_id, start, end_, opts)
 | 
			
		||||
  if opts == nil then
 | 
			
		||||
    opts = {}
 | 
			
		||||
  end
 | 
			
		||||
  return curbufmeths.get_extmarks(ns_id, start, end_, opts)
 | 
			
		||||
  return meths.nvim_buf_get_extmarks(0, ns_id, start, end_, opts)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function get_extmark_by_id(ns_id, id, opts)
 | 
			
		||||
  if opts == nil then
 | 
			
		||||
    opts = {}
 | 
			
		||||
  end
 | 
			
		||||
  return curbufmeths.get_extmark_by_id(ns_id, id, opts)
 | 
			
		||||
  return meths.nvim_buf_get_extmark_by_id(0, ns_id, id, opts)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function check_undo_redo(ns, mark, sr, sc, er, ec) --s = start, e = end
 | 
			
		||||
@@ -198,11 +196,11 @@ describe('API/extmarks', function()
 | 
			
		||||
    eq({ row, col }, rv)
 | 
			
		||||
 | 
			
		||||
    -- remove the test marks
 | 
			
		||||
    eq(true, curbufmeths.del_extmark(ns, marks[1]))
 | 
			
		||||
    eq(false, curbufmeths.del_extmark(ns, marks[1]))
 | 
			
		||||
    eq(true, curbufmeths.del_extmark(ns, marks[2]))
 | 
			
		||||
    eq(false, curbufmeths.del_extmark(ns, marks[3]))
 | 
			
		||||
    eq(false, curbufmeths.del_extmark(ns, 1000))
 | 
			
		||||
    eq(true, meths.nvim_buf_del_extmark(0, ns, marks[1]))
 | 
			
		||||
    eq(false, meths.nvim_buf_del_extmark(0, ns, marks[1]))
 | 
			
		||||
    eq(true, meths.nvim_buf_del_extmark(0, ns, marks[2]))
 | 
			
		||||
    eq(false, meths.nvim_buf_del_extmark(0, ns, marks[3]))
 | 
			
		||||
    eq(false, meths.nvim_buf_del_extmark(0, ns, 1000))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can clear a specific namespace range', function()
 | 
			
		||||
@@ -210,7 +208,7 @@ describe('API/extmarks', function()
 | 
			
		||||
    set_extmark(ns2, 1, 0, 1)
 | 
			
		||||
    -- force a new undo buffer
 | 
			
		||||
    feed('o<esc>')
 | 
			
		||||
    curbufmeths.clear_namespace(ns2, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns2, 0, -1)
 | 
			
		||||
    eq({ { 1, 0, 1 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    feed('u')
 | 
			
		||||
@@ -226,7 +224,7 @@ describe('API/extmarks', function()
 | 
			
		||||
    set_extmark(ns2, 1, 0, 1)
 | 
			
		||||
    -- force a new undo buffer
 | 
			
		||||
    feed('o<esc>')
 | 
			
		||||
    curbufmeths.clear_namespace(-1, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, -1, 0, -1)
 | 
			
		||||
    eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    eq({}, get_extmarks(ns2, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    feed('u')
 | 
			
		||||
@@ -244,14 +242,14 @@ describe('API/extmarks', function()
 | 
			
		||||
    eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    feed('dd')
 | 
			
		||||
    eq({ { 1, 1, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    curbufmeths.clear_namespace(ns, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns, 0, -1)
 | 
			
		||||
    eq({}, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    set_extmark(ns, 1, 0, 0, { right_gravity = false })
 | 
			
		||||
    set_extmark(ns, 2, 1, 0, { right_gravity = false })
 | 
			
		||||
    eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    feed('u')
 | 
			
		||||
    eq({ { 1, 0, 0 }, { 2, 1, 0 } }, get_extmarks(ns, { 0, 0 }, { -1, -1 }))
 | 
			
		||||
    curbufmeths.clear_namespace(ns, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns, 0, -1)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('querying for information and ranges', function()
 | 
			
		||||
@@ -933,7 +931,7 @@ describe('API/extmarks', function()
 | 
			
		||||
 | 
			
		||||
    -- Test unset
 | 
			
		||||
    feed('o<esc>')
 | 
			
		||||
    curbufmeths.del_extmark(ns, marks[3])
 | 
			
		||||
    meths.nvim_buf_del_extmark(0, ns, marks[3])
 | 
			
		||||
    feed('u')
 | 
			
		||||
    rv = get_extmarks(ns, { 0, 0 }, { -1, -1 })
 | 
			
		||||
    -- undo does NOT restore deleted marks
 | 
			
		||||
@@ -989,10 +987,10 @@ describe('API/extmarks', function()
 | 
			
		||||
    rv = get_extmarks(ns2, positions[2], positions[1])
 | 
			
		||||
    eq(2, #rv)
 | 
			
		||||
 | 
			
		||||
    curbufmeths.del_extmark(ns, marks[1])
 | 
			
		||||
    meths.nvim_buf_del_extmark(0, ns, marks[1])
 | 
			
		||||
    rv = get_extmarks(ns, { 0, 0 }, { -1, -1 })
 | 
			
		||||
    eq(2, #rv)
 | 
			
		||||
    curbufmeths.del_extmark(ns2, marks[1])
 | 
			
		||||
    meths.nvim_buf_del_extmark(0, ns2, marks[1])
 | 
			
		||||
    rv = get_extmarks(ns2, { 0, 0 }, { -1, -1 })
 | 
			
		||||
    eq(2, #rv)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -1429,7 +1427,7 @@ describe('API/extmarks', function()
 | 
			
		||||
      "Invalid 'ns_id': 3",
 | 
			
		||||
      pcall_err(set_extmark, ns_invalid, marks[1], positions[1][1], positions[1][2])
 | 
			
		||||
    )
 | 
			
		||||
    eq("Invalid 'ns_id': 3", pcall_err(curbufmeths.del_extmark, ns_invalid, marks[1]))
 | 
			
		||||
    eq("Invalid 'ns_id': 3", pcall_err(meths.nvim_buf_del_extmark, 0, ns_invalid, marks[1]))
 | 
			
		||||
    eq("Invalid 'ns_id': 3", pcall_err(get_extmarks, ns_invalid, positions[1], positions[2]))
 | 
			
		||||
    eq("Invalid 'ns_id': 3", pcall_err(get_extmark_by_id, ns_invalid, marks[1]))
 | 
			
		||||
  end)
 | 
			
		||||
@@ -1480,8 +1478,8 @@ describe('API/extmarks', function()
 | 
			
		||||
  it('can set a mark to other buffer', function()
 | 
			
		||||
    local buf = request('nvim_create_buf', 0, 1)
 | 
			
		||||
    request('nvim_buf_set_lines', buf, 0, -1, 1, { '', '' })
 | 
			
		||||
    local id = bufmeths.set_extmark(buf, ns, 1, 0, {})
 | 
			
		||||
    eq({ { id, 1, 0 } }, bufmeths.get_extmarks(buf, ns, 0, -1, {}))
 | 
			
		||||
    local id = meths.nvim_buf_set_extmark(buf, ns, 1, 0, {})
 | 
			
		||||
    eq({ { id, 1, 0 } }, meths.nvim_buf_get_extmarks(buf, ns, 0, -1, {}))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('does not crash with append/delete/undo sequence', function()
 | 
			
		||||
@@ -1497,24 +1495,24 @@ describe('API/extmarks', function()
 | 
			
		||||
  it('works with left and right gravity', function()
 | 
			
		||||
    -- right gravity should move with inserted text, while
 | 
			
		||||
    -- left gravity should stay in place.
 | 
			
		||||
    curbufmeths.set_extmark(ns, 0, 5, { right_gravity = false })
 | 
			
		||||
    curbufmeths.set_extmark(ns, 0, 5, { right_gravity = true })
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = false })
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, ns, 0, 5, { right_gravity = true })
 | 
			
		||||
    feed([[Aasdfasdf]])
 | 
			
		||||
 | 
			
		||||
    eq({ { 1, 0, 5 }, { 2, 0, 13 } }, curbufmeths.get_extmarks(ns, 0, -1, {}))
 | 
			
		||||
    eq({ { 1, 0, 5 }, { 2, 0, 13 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {}))
 | 
			
		||||
 | 
			
		||||
    -- but both move when text is inserted before
 | 
			
		||||
    feed([[<esc>Iasdf<esc>]])
 | 
			
		||||
    -- eq({}, curbufmeths.get_lines(0, -1, true))
 | 
			
		||||
    eq({ { 1, 0, 9 }, { 2, 0, 17 } }, curbufmeths.get_extmarks(ns, 0, -1, {}))
 | 
			
		||||
    -- eq({}, meths.nvim_buf_get_lines(0, 0, -1, true))
 | 
			
		||||
    eq({ { 1, 0, 9 }, { 2, 0, 17 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {}))
 | 
			
		||||
 | 
			
		||||
    -- clear text
 | 
			
		||||
    curbufmeths.set_text(0, 0, 0, 17, {})
 | 
			
		||||
    meths.nvim_buf_set_text(0, 0, 0, 0, 17, {})
 | 
			
		||||
 | 
			
		||||
    -- handles set_text correctly as well
 | 
			
		||||
    eq({ { 1, 0, 0 }, { 2, 0, 0 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {}))
 | 
			
		||||
    curbufmeths.set_text(0, 0, 0, 0, { 'asdfasdf' })
 | 
			
		||||
    eq({ { 1, 0, 0 }, { 2, 0, 8 } }, curbufmeths.get_extmarks(ns, 0, -1, {}))
 | 
			
		||||
    meths.nvim_buf_set_text(0, 0, 0, 0, 0, { 'asdfasdf' })
 | 
			
		||||
    eq({ { 1, 0, 0 }, { 2, 0, 8 } }, meths.nvim_buf_get_extmarks(0, ns, 0, -1, {}))
 | 
			
		||||
 | 
			
		||||
    feed('u')
 | 
			
		||||
    -- handles pasting
 | 
			
		||||
@@ -1641,7 +1639,7 @@ describe('API/extmarks', function()
 | 
			
		||||
        right_gravity = true,
 | 
			
		||||
      },
 | 
			
		||||
    }, get_extmark_by_id(ns, marks[3], { details = true }))
 | 
			
		||||
    curbufmeths.clear_namespace(ns, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns, 0, -1)
 | 
			
		||||
    -- legacy sign mark includes sign name
 | 
			
		||||
    command('sign define sign1 text=s1 texthl=Title linehl=LineNR numhl=Normal culhl=CursorLine')
 | 
			
		||||
    command('sign place 1 name=sign1 line=1')
 | 
			
		||||
@@ -1770,7 +1768,7 @@ describe('Extmarks buffer api with many marks', function()
 | 
			
		||||
    for i = 1, 30 do
 | 
			
		||||
      lines[#lines + 1] = string.rep('x ', i)
 | 
			
		||||
    end
 | 
			
		||||
    curbufmeths.set_lines(0, -1, true, lines)
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, -1, true, lines)
 | 
			
		||||
    local ns = ns1
 | 
			
		||||
    local q = 0
 | 
			
		||||
    for i = 0, 29 do
 | 
			
		||||
@@ -1804,16 +1802,16 @@ describe('Extmarks buffer api with many marks', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can clear all marks in ns', function()
 | 
			
		||||
    curbufmeths.clear_namespace(ns1, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns1, 0, -1)
 | 
			
		||||
    eq({}, get_marks(ns1))
 | 
			
		||||
    eq(ns_marks[ns2], get_marks(ns2))
 | 
			
		||||
    curbufmeths.clear_namespace(ns2, 0, -1)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns2, 0, -1)
 | 
			
		||||
    eq({}, get_marks(ns1))
 | 
			
		||||
    eq({}, get_marks(ns2))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can clear line range', function()
 | 
			
		||||
    curbufmeths.clear_namespace(ns1, 10, 20)
 | 
			
		||||
    meths.nvim_buf_clear_namespace(0, ns1, 10, 20)
 | 
			
		||||
    for id, mark in pairs(ns_marks[ns1]) do
 | 
			
		||||
      if 10 <= mark[1] and mark[1] < 20 then
 | 
			
		||||
        ns_marks[ns1][id] = nil
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, nvim = helpers.clear, helpers.nvim
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local eq, eval = helpers.eq, helpers.eval
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
@@ -52,22 +52,22 @@ describe('API: highlight', function()
 | 
			
		||||
 | 
			
		||||
  it('nvim_get_hl_by_id', function()
 | 
			
		||||
    local hl_id = eval("hlID('NewHighlight')")
 | 
			
		||||
    eq(expected_cterm, nvim('get_hl_by_id', hl_id, false))
 | 
			
		||||
    eq(expected_cterm, meths.nvim_get_hl_by_id(hl_id, false))
 | 
			
		||||
 | 
			
		||||
    hl_id = eval("hlID('NewHighlight')")
 | 
			
		||||
    -- Test valid id.
 | 
			
		||||
    eq(expected_rgb, nvim('get_hl_by_id', hl_id, true))
 | 
			
		||||
    eq(expected_rgb, meths.nvim_get_hl_by_id(hl_id, true))
 | 
			
		||||
 | 
			
		||||
    -- Test invalid id.
 | 
			
		||||
    eq('Invalid highlight id: 30000', pcall_err(meths.nvim_get_hl_by_id, 30000, false))
 | 
			
		||||
 | 
			
		||||
    -- Test all highlight properties.
 | 
			
		||||
    command('hi NewHighlight gui=underline,bold,italic,reverse,strikethrough,altfont,nocombine')
 | 
			
		||||
    eq(expected_rgb2, nvim('get_hl_by_id', hl_id, true))
 | 
			
		||||
    eq(expected_rgb2, meths.nvim_get_hl_by_id(hl_id, true))
 | 
			
		||||
 | 
			
		||||
    -- Test undercurl
 | 
			
		||||
    command('hi NewHighlight gui=undercurl')
 | 
			
		||||
    eq(expected_undercurl, nvim('get_hl_by_id', hl_id, true))
 | 
			
		||||
    eq(expected_undercurl, meths.nvim_get_hl_by_id(hl_id, true))
 | 
			
		||||
 | 
			
		||||
    -- Test nil argument.
 | 
			
		||||
    eq(
 | 
			
		||||
@@ -102,14 +102,14 @@ describe('API: highlight', function()
 | 
			
		||||
    local expected_normal = { background = Screen.colors.Yellow, foreground = Screen.colors.Red }
 | 
			
		||||
 | 
			
		||||
    -- Test `Normal` default values.
 | 
			
		||||
    eq({}, nvim('get_hl_by_name', 'Normal', true))
 | 
			
		||||
    eq({}, meths.nvim_get_hl_by_name('Normal', true))
 | 
			
		||||
 | 
			
		||||
    eq(expected_cterm, nvim('get_hl_by_name', 'NewHighlight', false))
 | 
			
		||||
    eq(expected_rgb, nvim('get_hl_by_name', 'NewHighlight', true))
 | 
			
		||||
    eq(expected_cterm, meths.nvim_get_hl_by_name('NewHighlight', false))
 | 
			
		||||
    eq(expected_rgb, meths.nvim_get_hl_by_name('NewHighlight', true))
 | 
			
		||||
 | 
			
		||||
    -- Test `Normal` modified values.
 | 
			
		||||
    command('hi Normal guifg=red guibg=yellow')
 | 
			
		||||
    eq(expected_normal, nvim('get_hl_by_name', 'Normal', true))
 | 
			
		||||
    eq(expected_normal, meths.nvim_get_hl_by_name('Normal', true))
 | 
			
		||||
 | 
			
		||||
    -- Test invalid name.
 | 
			
		||||
    eq(
 | 
			
		||||
@@ -137,10 +137,10 @@ describe('API: highlight', function()
 | 
			
		||||
    meths.nvim_set_hl(0, 'Normal', { ctermfg = 17, ctermbg = 213 })
 | 
			
		||||
    meths.nvim_set_hl(0, 'NotNormal', { ctermfg = 17, ctermbg = 213, nocombine = true })
 | 
			
		||||
    -- Note colors are "cterm" values, not rgb-as-ints
 | 
			
		||||
    eq({ foreground = 17, background = 213 }, nvim('get_hl_by_name', 'Normal', false))
 | 
			
		||||
    eq({ foreground = 17, background = 213 }, meths.nvim_get_hl_by_name('Normal', false))
 | 
			
		||||
    eq(
 | 
			
		||||
      { foreground = 17, background = 213, nocombine = true },
 | 
			
		||||
      nvim('get_hl_by_name', 'NotNormal', false)
 | 
			
		||||
      meths.nvim_get_hl_by_name('NotNormal', false)
 | 
			
		||||
    )
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -378,7 +378,7 @@ describe('API: set highlight', function()
 | 
			
		||||
  it("correctly sets 'Normal' internal properties", function()
 | 
			
		||||
    -- Normal has some special handling internally. #18024
 | 
			
		||||
    meths.nvim_set_hl(0, 'Normal', { fg = '#000083', bg = '#0000F3' })
 | 
			
		||||
    eq({ foreground = 131, background = 243 }, nvim('get_hl_by_name', 'Normal', true))
 | 
			
		||||
    eq({ foreground = 131, background = 243 }, meths.nvim_get_hl_by_name('Normal', true))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('does not segfault on invalid group name #20009', function()
 | 
			
		||||
@@ -475,7 +475,7 @@ describe('API: get highlight', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('nvim_get_hl with create flag', function()
 | 
			
		||||
    eq({}, nvim('get_hl', 0, { name = 'Foo', create = false }))
 | 
			
		||||
    eq({}, meths.nvim_get_hl(0, { name = 'Foo', create = false }))
 | 
			
		||||
    eq(0, funcs.hlexists('Foo'))
 | 
			
		||||
    meths.nvim_get_hl(0, { name = 'Bar', create = true })
 | 
			
		||||
    eq(1, funcs.hlexists('Bar'))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,9 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
 | 
			
		||||
local bufmeths = helpers.bufmeths
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local eq, neq = helpers.eq, helpers.neq
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local exec = helpers.exec
 | 
			
		||||
@@ -112,7 +110,7 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
 | 
			
		||||
    -- The buffer mapping should not show up
 | 
			
		||||
    eq({ foolong_bar_map_table }, meths.nvim_get_keymap('n'))
 | 
			
		||||
    eq({ buffer_table }, curbufmeths.get_keymap('n'))
 | 
			
		||||
    eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('considers scope for overlapping maps', function()
 | 
			
		||||
@@ -124,11 +122,11 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
    command('nnoremap <buffer> foo bar')
 | 
			
		||||
 | 
			
		||||
    eq({ foo_bar_map_table }, meths.nvim_get_keymap('n'))
 | 
			
		||||
    eq({ buffer_table }, curbufmeths.get_keymap('n'))
 | 
			
		||||
    eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can retrieve mapping for different buffers', function()
 | 
			
		||||
    local original_buffer = curbufmeths.get_number()
 | 
			
		||||
    local original_buffer = meths.nvim_buf_get_number(0)
 | 
			
		||||
    -- Place something in each of the buffers to make sure they stick around
 | 
			
		||||
    -- and set hidden so we can leave them
 | 
			
		||||
    command('set hidden')
 | 
			
		||||
@@ -137,7 +135,7 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
    command('new')
 | 
			
		||||
    command('normal! ihello 3')
 | 
			
		||||
 | 
			
		||||
    local final_buffer = curbufmeths.get_number()
 | 
			
		||||
    local final_buffer = meths.nvim_buf_get_number(0)
 | 
			
		||||
 | 
			
		||||
    command('nnoremap <buffer> foo bar')
 | 
			
		||||
    -- Final buffer will have buffer mappings
 | 
			
		||||
@@ -147,10 +145,10 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
    eq({ buffer_table }, meths.nvim_buf_get_keymap(0, 'n'))
 | 
			
		||||
 | 
			
		||||
    command('buffer ' .. original_buffer)
 | 
			
		||||
    eq(original_buffer, curbufmeths.get_number())
 | 
			
		||||
    eq(original_buffer, meths.nvim_buf_get_number(0))
 | 
			
		||||
    -- Original buffer won't have any mappings
 | 
			
		||||
    eq({}, meths.nvim_get_keymap('n'))
 | 
			
		||||
    eq({}, curbufmeths.get_keymap('n'))
 | 
			
		||||
    eq({}, meths.nvim_buf_get_keymap(0, 'n'))
 | 
			
		||||
    eq({ buffer_table }, meths.nvim_buf_get_keymap(final_buffer, 'n'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -209,7 +207,7 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
      function()
 | 
			
		||||
        make_new_windows(new_windows)
 | 
			
		||||
        command(map .. ' <buffer> ' .. option_token .. ' foo bar')
 | 
			
		||||
        local result = curbufmeths.get_keymap(mode)[1][option]
 | 
			
		||||
        local result = meths.nvim_buf_get_keymap(0, mode)[1][option]
 | 
			
		||||
        eq(buffer_on_result, result)
 | 
			
		||||
      end
 | 
			
		||||
    )
 | 
			
		||||
@@ -246,7 +244,7 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
          make_new_windows(new_windows)
 | 
			
		||||
          command(map .. ' <buffer> foo bar')
 | 
			
		||||
 | 
			
		||||
          local result = curbufmeths.get_keymap(mode)[1][option]
 | 
			
		||||
          local result = meths.nvim_buf_get_keymap(0, mode)[1][option]
 | 
			
		||||
          eq(buffer_off_result, result)
 | 
			
		||||
        end
 | 
			
		||||
      )
 | 
			
		||||
@@ -290,7 +288,7 @@ describe('nvim_get_keymap', function()
 | 
			
		||||
 | 
			
		||||
      nnoremap <buffer> fizz :call <SID>maparg_test_function()<CR>
 | 
			
		||||
    ]])
 | 
			
		||||
    local sid_result = curbufmeths.get_keymap('n')[1]['sid']
 | 
			
		||||
    local sid_result = meths.nvim_buf_get_keymap(0, 'n')[1]['sid']
 | 
			
		||||
    eq(1, sid_result)
 | 
			
		||||
    eq('testing', meths.nvim_call_function('<SNR>' .. sid_result .. '_maparg_test_function', {}))
 | 
			
		||||
  end)
 | 
			
		||||
@@ -698,33 +696,33 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
 | 
			
		||||
  it('can set mappings whose RHS is a <Nop>', function()
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', '<Nop>', {})
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, 0)) -- imap to <Nop> does nothing
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0)) -- imap to <Nop> does nothing
 | 
			
		||||
    eq(generate_mapargs('i', 'lhs', '<Nop>', {}), get_mapargs('i', 'lhs'))
 | 
			
		||||
 | 
			
		||||
    -- also test for case insensitivity
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', '<nOp>', {})
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
    -- note: RHS in returned mapargs() dict reflects the original RHS
 | 
			
		||||
    -- provided by the user
 | 
			
		||||
    eq(generate_mapargs('i', 'lhs', '<nOp>', {}), get_mapargs('i', 'lhs'))
 | 
			
		||||
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', '<NOP>', {})
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
    eq(generate_mapargs('i', 'lhs', '<NOP>', {}), get_mapargs('i', 'lhs'))
 | 
			
		||||
 | 
			
		||||
    -- a single ^V in RHS is also <Nop> (see :h map-empty-rhs)
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', '\022', {})
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
    eq(generate_mapargs('i', 'lhs', '\022', {}), get_mapargs('i', 'lhs'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('treats an empty RHS in a mapping like a <Nop>', function()
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', '', {})
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
    eq(generate_mapargs('i', 'lhs', '', {}), get_mapargs('i', 'lhs'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -743,7 +741,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
 | 
			
		||||
      command([[call nvim_set_keymap('i', "\<space>", "\<tab>", {})]])
 | 
			
		||||
      eq(generate_mapargs('i', '<Space>', '\t', { sid = 0 }), get_mapargs('i', '<Space>'))
 | 
			
		||||
      feed('i ')
 | 
			
		||||
      eq({ '\t' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
      eq({ '\t' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
    end
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
@@ -772,12 +770,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
 | 
			
		||||
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', 'FlipFlop()', { expr = true })
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '1' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ '1' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
 | 
			
		||||
    command('normal! ggVGd')
 | 
			
		||||
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ '0' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ '0' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can set mappings that do trigger other mappings', function()
 | 
			
		||||
@@ -785,12 +783,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', 'mhs', {})
 | 
			
		||||
 | 
			
		||||
    command('normal imhs')
 | 
			
		||||
    eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
 | 
			
		||||
    command('normal! ggVGd')
 | 
			
		||||
 | 
			
		||||
    command('normal ilhs')
 | 
			
		||||
    eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it("can set noremap mappings that don't trigger other mappings", function()
 | 
			
		||||
@@ -798,12 +796,12 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
 | 
			
		||||
    meths.nvim_set_keymap('i', 'lhs', 'mhs', { noremap = true })
 | 
			
		||||
 | 
			
		||||
    command('normal imhs')
 | 
			
		||||
    eq({ 'rhs' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
 | 
			
		||||
    command('normal! ggVGd')
 | 
			
		||||
 | 
			
		||||
    command('normal ilhs') -- shouldn't trigger mhs-to-rhs mapping
 | 
			
		||||
    eq({ 'mhs' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ 'mhs' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can set nowait mappings that fire without waiting', function()
 | 
			
		||||
@@ -817,7 +815,7 @@ describe('nvim_set_keymap, nvim_del_keymap', function()
 | 
			
		||||
      feed(c)
 | 
			
		||||
      sleep(5)
 | 
			
		||||
    end
 | 
			
		||||
    eq({ 'shorter456' }, curbufmeths.get_lines(0, -1, 0))
 | 
			
		||||
    eq({ 'shorter456' }, meths.nvim_buf_get_lines(0, 0, -1, 0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  -- Perform exhaustive tests of basic functionality
 | 
			
		||||
@@ -1181,66 +1179,66 @@ describe('nvim_buf_set_keymap, nvim_buf_del_keymap', function()
 | 
			
		||||
  it('rejects negative bufnr values', function()
 | 
			
		||||
    eq(
 | 
			
		||||
      'Wrong type for argument 1 when calling nvim_buf_set_keymap, expecting Buffer',
 | 
			
		||||
      pcall_err(bufmeths.set_keymap, -1, '', 'lhs', 'rhs', {})
 | 
			
		||||
      pcall_err(meths.nvim_buf_set_keymap, -1, '', 'lhs', 'rhs', {})
 | 
			
		||||
    )
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can set mappings active in the current buffer but not others', function()
 | 
			
		||||
    local first, second = make_two_buffers(true)
 | 
			
		||||
 | 
			
		||||
    bufmeths.set_keymap(0, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    meths.nvim_buf_set_keymap(0, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    command('normal lhs')
 | 
			
		||||
    eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
 | 
			
		||||
    -- mapping should have no effect in new buffer
 | 
			
		||||
    switch_to_buf(second)
 | 
			
		||||
    command('normal lhs')
 | 
			
		||||
    eq({ '' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
 | 
			
		||||
    -- mapping should remain active in old buffer
 | 
			
		||||
    switch_to_buf(first)
 | 
			
		||||
    command('normal ^lhs')
 | 
			
		||||
    eq({ 'rhsrhs' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ 'rhsrhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can set local mappings in buffer other than current', function()
 | 
			
		||||
    local first = make_two_buffers(false)
 | 
			
		||||
    bufmeths.set_keymap(first, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
 | 
			
		||||
    -- shouldn't do anything
 | 
			
		||||
    command('normal lhs')
 | 
			
		||||
    eq({ '' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
 | 
			
		||||
    -- should take effect
 | 
			
		||||
    switch_to_buf(first)
 | 
			
		||||
    command('normal lhs')
 | 
			
		||||
    eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can disable mappings made in another buffer, inside that buffer', function()
 | 
			
		||||
    local first = make_two_buffers(false)
 | 
			
		||||
    bufmeths.set_keymap(first, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    bufmeths.del_keymap(first, '', 'lhs')
 | 
			
		||||
    meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    meths.nvim_buf_del_keymap(first, '', 'lhs')
 | 
			
		||||
    switch_to_buf(first)
 | 
			
		||||
 | 
			
		||||
    -- shouldn't do anything
 | 
			
		||||
    command('normal lhs')
 | 
			
		||||
    eq({ '' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it("can't disable mappings given wrong buffer handle", function()
 | 
			
		||||
    local first, second = make_two_buffers(false)
 | 
			
		||||
    bufmeths.set_keymap(first, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    eq('E31: No such mapping', pcall_err(bufmeths.del_keymap, second, '', 'lhs'))
 | 
			
		||||
    meths.nvim_buf_set_keymap(first, '', 'lhs', 'irhs<Esc>', {})
 | 
			
		||||
    eq('E31: No such mapping', pcall_err(meths.nvim_buf_del_keymap, second, '', 'lhs'))
 | 
			
		||||
 | 
			
		||||
    -- should still work
 | 
			
		||||
    switch_to_buf(first)
 | 
			
		||||
    command('normal lhs')
 | 
			
		||||
    eq({ 'rhs' }, bufmeths.get_lines(0, 0, 1, 1))
 | 
			
		||||
    eq({ 'rhs' }, meths.nvim_buf_get_lines(0, 0, 1, 1))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('does not crash when setting mapping in a non-existing buffer #13541', function()
 | 
			
		||||
    pcall_err(bufmeths.set_keymap, 100, '', 'lsh', 'irhs<Esc>', {})
 | 
			
		||||
    pcall_err(meths.nvim_buf_set_keymap, 100, '', 'lsh', 'irhs<Esc>', {})
 | 
			
		||||
    helpers.assert_alive()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local assert_log = helpers.assert_log
 | 
			
		||||
local eq, clear, eval, command, nvim, next_msg =
 | 
			
		||||
  helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.nvim, helpers.next_msg
 | 
			
		||||
local eq, clear, eval, command, next_msg =
 | 
			
		||||
  helpers.eq, helpers.clear, helpers.eval, helpers.command, helpers.next_msg
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
@@ -14,7 +14,7 @@ describe('notify', function()
 | 
			
		||||
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
    channel = nvim('get_api_info')[1]
 | 
			
		||||
    channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  after_each(function()
 | 
			
		||||
@@ -33,14 +33,14 @@ describe('notify', function()
 | 
			
		||||
 | 
			
		||||
  describe('passing 0 as the channel id', function()
 | 
			
		||||
    it('sends the notification/args to all subscribed channels', function()
 | 
			
		||||
      nvim('subscribe', 'event2')
 | 
			
		||||
      meths.nvim_subscribe('event2')
 | 
			
		||||
      eval('rpcnotify(0, "event1", 1, 2, 3)')
 | 
			
		||||
      eval('rpcnotify(0, "event2", 4, 5, 6)')
 | 
			
		||||
      eval('rpcnotify(0, "event2", 7, 8, 9)')
 | 
			
		||||
      eq({ 'notification', 'event2', { 4, 5, 6 } }, next_msg())
 | 
			
		||||
      eq({ 'notification', 'event2', { 7, 8, 9 } }, next_msg())
 | 
			
		||||
      nvim('unsubscribe', 'event2')
 | 
			
		||||
      nvim('subscribe', 'event1')
 | 
			
		||||
      meths.nvim_unsubscribe('event2')
 | 
			
		||||
      meths.nvim_subscribe('event1')
 | 
			
		||||
      eval('rpcnotify(0, "event2", 10, 11, 12)')
 | 
			
		||||
      eval('rpcnotify(0, "event1", 13, 14, 15)')
 | 
			
		||||
      eq({ 'notification', 'event1', { 13, 14, 15 } }, next_msg())
 | 
			
		||||
@@ -49,9 +49,7 @@ describe('notify', function()
 | 
			
		||||
    it('does not crash for deeply nested variable', function()
 | 
			
		||||
      meths.nvim_set_var('l', {})
 | 
			
		||||
      local nest_level = 1000
 | 
			
		||||
      meths.nvim_command(
 | 
			
		||||
        ('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1)
 | 
			
		||||
      )
 | 
			
		||||
      command(('call map(range(%u), "extend(g:, {\'l\': [g:l]})")'):format(nest_level - 1))
 | 
			
		||||
      eval('rpcnotify(' .. channel .. ', "event", g:l)')
 | 
			
		||||
      local msg = next_msg()
 | 
			
		||||
      eq('notification', msg[1])
 | 
			
		||||
@@ -81,10 +79,10 @@ describe('notify', function()
 | 
			
		||||
    clear { env = {
 | 
			
		||||
      NVIM_LOG_FILE = testlog,
 | 
			
		||||
    } }
 | 
			
		||||
    nvim('subscribe', 'event1')
 | 
			
		||||
    nvim('unsubscribe', 'doesnotexist')
 | 
			
		||||
    meths.nvim_subscribe('event1')
 | 
			
		||||
    meths.nvim_unsubscribe('doesnotexist')
 | 
			
		||||
    assert_log("tried to unsubscribe unknown event 'doesnotexist'", testlog, 10)
 | 
			
		||||
    nvim('unsubscribe', 'event1')
 | 
			
		||||
    meths.nvim_unsubscribe('event1')
 | 
			
		||||
    assert_alive()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@
 | 
			
		||||
-- `rpcrequest` calls we need the client event loop to be running.
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
 | 
			
		||||
local clear, nvim, eval = helpers.clear, helpers.nvim, helpers.eval
 | 
			
		||||
local clear, eval = helpers.clear, helpers.eval
 | 
			
		||||
local eq, neq, run, stop = helpers.eq, helpers.neq, helpers.run, helpers.stop
 | 
			
		||||
local nvim_prog, command, funcs = helpers.nvim_prog, helpers.command, helpers.funcs
 | 
			
		||||
local source, next_msg = helpers.source, helpers.next_msg
 | 
			
		||||
@@ -18,7 +18,7 @@ describe('server -> client', function()
 | 
			
		||||
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
    cid = nvim('get_api_info')[1]
 | 
			
		||||
    cid = meths.nvim_get_api_info()[1]
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('handles unexpected closed stream while preparing RPC response', function()
 | 
			
		||||
@@ -47,7 +47,7 @@ describe('server -> client', function()
 | 
			
		||||
      local function on_request(method, args)
 | 
			
		||||
        eq('scall', method)
 | 
			
		||||
        eq({ 1, 2, 3 }, args)
 | 
			
		||||
        nvim('command', 'let g:result = [4, 5, 6]')
 | 
			
		||||
        command('let g:result = [4, 5, 6]')
 | 
			
		||||
        return eval('g:result')
 | 
			
		||||
      end
 | 
			
		||||
      run(on_request, nil, on_setup)
 | 
			
		||||
@@ -77,15 +77,15 @@ describe('server -> client', function()
 | 
			
		||||
  describe('recursive call', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      local function on_setup()
 | 
			
		||||
        nvim('set_var', 'result1', 0)
 | 
			
		||||
        nvim('set_var', 'result2', 0)
 | 
			
		||||
        nvim('set_var', 'result3', 0)
 | 
			
		||||
        nvim('set_var', 'result4', 0)
 | 
			
		||||
        nvim('command', 'let g:result1 = rpcrequest(' .. cid .. ', "rcall", 2)')
 | 
			
		||||
        eq(4, nvim('get_var', 'result1'))
 | 
			
		||||
        eq(8, nvim('get_var', 'result2'))
 | 
			
		||||
        eq(16, nvim('get_var', 'result3'))
 | 
			
		||||
        eq(32, nvim('get_var', 'result4'))
 | 
			
		||||
        meths.nvim_set_var('result1', 0)
 | 
			
		||||
        meths.nvim_set_var('result2', 0)
 | 
			
		||||
        meths.nvim_set_var('result3', 0)
 | 
			
		||||
        meths.nvim_set_var('result4', 0)
 | 
			
		||||
        command('let g:result1 = rpcrequest(' .. cid .. ', "rcall", 2)')
 | 
			
		||||
        eq(4, meths.nvim_get_var('result1'))
 | 
			
		||||
        eq(8, meths.nvim_get_var('result2'))
 | 
			
		||||
        eq(16, meths.nvim_get_var('result3'))
 | 
			
		||||
        eq(32, meths.nvim_get_var('result4'))
 | 
			
		||||
        stop()
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
@@ -101,7 +101,7 @@ describe('server -> client', function()
 | 
			
		||||
          elseif n == 16 then
 | 
			
		||||
            cmd = 'let g:result4 = rpcrequest(' .. cid .. ', "rcall", ' .. n .. ')'
 | 
			
		||||
          end
 | 
			
		||||
          nvim('command', cmd)
 | 
			
		||||
          command(cmd)
 | 
			
		||||
        end
 | 
			
		||||
        return n
 | 
			
		||||
      end
 | 
			
		||||
@@ -195,10 +195,10 @@ describe('server -> client', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('can send/receive notifications and make requests', function()
 | 
			
		||||
      nvim('command', "call rpcnotify(vim, 'vim_set_current_line', 'SOME TEXT')")
 | 
			
		||||
      command("call rpcnotify(vim, 'vim_set_current_line', 'SOME TEXT')")
 | 
			
		||||
 | 
			
		||||
      -- Wait for the notification to complete.
 | 
			
		||||
      nvim('command', "call rpcrequest(vim, 'vim_eval', '0')")
 | 
			
		||||
      command("call rpcrequest(vim, 'vim_eval', '0')")
 | 
			
		||||
 | 
			
		||||
      eq('SOME TEXT', eval("rpcrequest(vim, 'vim_get_current_line')"))
 | 
			
		||||
    end)
 | 
			
		||||
@@ -212,7 +212,7 @@ describe('server -> client', function()
 | 
			
		||||
      eq(1, buf)
 | 
			
		||||
 | 
			
		||||
      eval("rpcnotify(vim, 'buffer_set_line', " .. buf .. ", 0, 'SOME TEXT')")
 | 
			
		||||
      nvim('command', "call rpcrequest(vim, 'vim_eval', '0')") -- wait
 | 
			
		||||
      command("call rpcrequest(vim, 'vim_eval', '0')") -- wait
 | 
			
		||||
 | 
			
		||||
      eq('SOME TEXT', eval("rpcrequest(vim, 'buffer_get_line', " .. buf .. ', 0)'))
 | 
			
		||||
 | 
			
		||||
@@ -231,8 +231,8 @@ describe('server -> client', function()
 | 
			
		||||
  describe('jobstart()', function()
 | 
			
		||||
    local jobid
 | 
			
		||||
    before_each(function()
 | 
			
		||||
      local channel = nvim('get_api_info')[1]
 | 
			
		||||
      nvim('set_var', 'channel', channel)
 | 
			
		||||
      local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
      meths.nvim_set_var('channel', channel)
 | 
			
		||||
      source([[
 | 
			
		||||
        function! s:OnEvent(id, data, event)
 | 
			
		||||
          call rpcnotify(g:channel, a:event, 0, a:data)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, nvim, tabpage, curtab, eq, ok =
 | 
			
		||||
  helpers.clear, helpers.nvim, helpers.tabpage, helpers.curtab, helpers.eq, helpers.ok
 | 
			
		||||
local curtabmeths = helpers.curtabmeths
 | 
			
		||||
local clear, eq, ok = helpers.clear, helpers.eq, helpers.ok
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local request = helpers.request
 | 
			
		||||
local NIL = vim.NIL
 | 
			
		||||
@@ -13,35 +12,35 @@ describe('api/tabpage', function()
 | 
			
		||||
 | 
			
		||||
  describe('list_wins and get_win', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'tabnew')
 | 
			
		||||
      nvim('command', 'vsplit')
 | 
			
		||||
      local tab1, tab2 = unpack(nvim('list_tabpages'))
 | 
			
		||||
      local win1, win2, win3 = unpack(nvim('list_wins'))
 | 
			
		||||
      eq({ win1 }, tabpage('list_wins', tab1))
 | 
			
		||||
      eq({ win2, win3 }, tabpage('list_wins', tab2))
 | 
			
		||||
      eq(win2, tabpage('get_win', tab2))
 | 
			
		||||
      nvim('set_current_win', win3)
 | 
			
		||||
      eq(win3, tabpage('get_win', tab2))
 | 
			
		||||
      helpers.command('tabnew')
 | 
			
		||||
      helpers.command('vsplit')
 | 
			
		||||
      local tab1, tab2 = unpack(meths.nvim_list_tabpages())
 | 
			
		||||
      local win1, win2, win3 = unpack(meths.nvim_list_wins())
 | 
			
		||||
      eq({ win1 }, meths.nvim_tabpage_list_wins(tab1))
 | 
			
		||||
      eq({ win2, win3 }, meths.nvim_tabpage_list_wins(tab2))
 | 
			
		||||
      eq(win2, meths.nvim_tabpage_get_win(tab2))
 | 
			
		||||
      meths.nvim_set_current_win(win3)
 | 
			
		||||
      eq(win3, meths.nvim_tabpage_get_win(tab2))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('validates args', function()
 | 
			
		||||
      eq('Invalid tabpage id: 23', pcall_err(tabpage, 'list_wins', 23))
 | 
			
		||||
      eq('Invalid tabpage id: 23', pcall_err(meths.nvim_tabpage_list_wins, 23))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('{get,set,del}_var', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      curtab('set_var', 'lua', { 1, 2, { ['3'] = 1 } })
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, curtab('get_var', 'lua'))
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, nvim('eval', 't:lua'))
 | 
			
		||||
      meths.nvim_tabpage_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } })
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_tabpage_get_var(0, 'lua'))
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('t:lua'))
 | 
			
		||||
      eq(1, funcs.exists('t:lua'))
 | 
			
		||||
      curtabmeths.del_var('lua')
 | 
			
		||||
      meths.nvim_tabpage_del_var(0, 'lua')
 | 
			
		||||
      eq(0, funcs.exists('t:lua'))
 | 
			
		||||
      eq('Key not found: lua', pcall_err(curtabmeths.del_var, 'lua'))
 | 
			
		||||
      curtabmeths.set_var('lua', 1)
 | 
			
		||||
      eq('Key not found: lua', pcall_err(meths.nvim_tabpage_del_var, 0, 'lua'))
 | 
			
		||||
      meths.nvim_tabpage_set_var(0, 'lua', 1)
 | 
			
		||||
      command('lockvar t:lua')
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(curtabmeths.del_var, 'lua'))
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(curtabmeths.set_var, 'lua', 1))
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(meths.nvim_tabpage_del_var, 0, 'lua'))
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(meths.nvim_tabpage_set_var, 0, 'lua', 1))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('tabpage_set_var returns the old value', function()
 | 
			
		||||
@@ -62,28 +61,28 @@ describe('api/tabpage', function()
 | 
			
		||||
 | 
			
		||||
  describe('get_number', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      local tabs = nvim('list_tabpages')
 | 
			
		||||
      eq(1, tabpage('get_number', tabs[1]))
 | 
			
		||||
      local tabs = meths.nvim_list_tabpages()
 | 
			
		||||
      eq(1, meths.nvim_tabpage_get_number(tabs[1]))
 | 
			
		||||
 | 
			
		||||
      nvim('command', 'tabnew')
 | 
			
		||||
      local tab1, tab2 = unpack(nvim('list_tabpages'))
 | 
			
		||||
      eq(1, tabpage('get_number', tab1))
 | 
			
		||||
      eq(2, tabpage('get_number', tab2))
 | 
			
		||||
      helpers.command('tabnew')
 | 
			
		||||
      local tab1, tab2 = unpack(meths.nvim_list_tabpages())
 | 
			
		||||
      eq(1, meths.nvim_tabpage_get_number(tab1))
 | 
			
		||||
      eq(2, meths.nvim_tabpage_get_number(tab2))
 | 
			
		||||
 | 
			
		||||
      nvim('command', '-tabmove')
 | 
			
		||||
      eq(2, tabpage('get_number', tab1))
 | 
			
		||||
      eq(1, tabpage('get_number', tab2))
 | 
			
		||||
      helpers.command('-tabmove')
 | 
			
		||||
      eq(2, meths.nvim_tabpage_get_number(tab1))
 | 
			
		||||
      eq(1, meths.nvim_tabpage_get_number(tab2))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('is_valid', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'tabnew')
 | 
			
		||||
      local tab = nvim('list_tabpages')[2]
 | 
			
		||||
      nvim('set_current_tabpage', tab)
 | 
			
		||||
      ok(tabpage('is_valid', tab))
 | 
			
		||||
      nvim('command', 'tabclose')
 | 
			
		||||
      ok(not tabpage('is_valid', tab))
 | 
			
		||||
      helpers.command('tabnew')
 | 
			
		||||
      local tab = meths.nvim_list_tabpages()[2]
 | 
			
		||||
      meths.nvim_set_current_tabpage(tab)
 | 
			
		||||
      ok(meths.nvim_tabpage_is_valid(tab))
 | 
			
		||||
      helpers.command('tabclose')
 | 
			
		||||
      ok(not meths.nvim_tabpage_is_valid(tab))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							@@ -1,21 +1,17 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local clear, nvim, curbuf, curbuf_contents, window, curwin, eq, neq, ok, feed, insert, eval, tabpage =
 | 
			
		||||
local clear, curbuf, curbuf_contents, curwin, eq, neq, ok, feed, insert, eval =
 | 
			
		||||
  helpers.clear,
 | 
			
		||||
  helpers.nvim,
 | 
			
		||||
  helpers.curbuf,
 | 
			
		||||
  helpers.meths.nvim_get_current_buf,
 | 
			
		||||
  helpers.curbuf_contents,
 | 
			
		||||
  helpers.window,
 | 
			
		||||
  helpers.curwin,
 | 
			
		||||
  helpers.meths.nvim_get_current_win,
 | 
			
		||||
  helpers.eq,
 | 
			
		||||
  helpers.neq,
 | 
			
		||||
  helpers.ok,
 | 
			
		||||
  helpers.feed,
 | 
			
		||||
  helpers.insert,
 | 
			
		||||
  helpers.eval,
 | 
			
		||||
  helpers.tabpage
 | 
			
		||||
  helpers.eval
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
local curwinmeths = helpers.curwinmeths
 | 
			
		||||
local exec = helpers.exec
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local request = helpers.request
 | 
			
		||||
@@ -30,26 +26,35 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('get_buf', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      eq(curbuf(), window('get_buf', nvim('list_wins')[1]))
 | 
			
		||||
      nvim('command', 'new')
 | 
			
		||||
      nvim('set_current_win', nvim('list_wins')[2])
 | 
			
		||||
      eq(curbuf(), window('get_buf', nvim('list_wins')[2]))
 | 
			
		||||
      neq(window('get_buf', nvim('list_wins')[1]), window('get_buf', nvim('list_wins')[2]))
 | 
			
		||||
      eq(curbuf(), meths.nvim_win_get_buf(meths.nvim_list_wins()[1]))
 | 
			
		||||
      command('new')
 | 
			
		||||
      meths.nvim_set_current_win(meths.nvim_list_wins()[2])
 | 
			
		||||
      eq(curbuf(), meths.nvim_win_get_buf(meths.nvim_list_wins()[2]))
 | 
			
		||||
      neq(
 | 
			
		||||
        meths.nvim_win_get_buf(meths.nvim_list_wins()[1]),
 | 
			
		||||
        meths.nvim_win_get_buf(meths.nvim_list_wins()[2])
 | 
			
		||||
      )
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('set_buf', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'new')
 | 
			
		||||
      local windows = nvim('list_wins')
 | 
			
		||||
      neq(window('get_buf', windows[2]), window('get_buf', windows[1]))
 | 
			
		||||
      window('set_buf', windows[2], window('get_buf', windows[1]))
 | 
			
		||||
      eq(window('get_buf', windows[2]), window('get_buf', windows[1]))
 | 
			
		||||
      command('new')
 | 
			
		||||
      local windows = meths.nvim_list_wins()
 | 
			
		||||
      neq(meths.nvim_win_get_buf(windows[2]), meths.nvim_win_get_buf(windows[1]))
 | 
			
		||||
      meths.nvim_win_set_buf(windows[2], meths.nvim_win_get_buf(windows[1]))
 | 
			
		||||
      eq(meths.nvim_win_get_buf(windows[2]), meths.nvim_win_get_buf(windows[1]))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('validates args', function()
 | 
			
		||||
      eq('Invalid buffer id: 23', pcall_err(window, 'set_buf', nvim('get_current_win'), 23))
 | 
			
		||||
      eq('Invalid window id: 23', pcall_err(window, 'set_buf', 23, nvim('get_current_buf')))
 | 
			
		||||
      eq(
 | 
			
		||||
        'Invalid buffer id: 23',
 | 
			
		||||
        pcall_err(meths.nvim_win_set_buf, meths.nvim_get_current_win(), 23)
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        'Invalid window id: 23',
 | 
			
		||||
        pcall_err(meths.nvim_win_set_buf, 23, meths.nvim_get_current_buf())
 | 
			
		||||
      )
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('disallowed in cmdwin if win={old_}curwin or buf=curbuf', function()
 | 
			
		||||
@@ -84,12 +89,12 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('{get,set}_cursor', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      eq({ 1, 0 }, curwin('get_cursor'))
 | 
			
		||||
      nvim('command', 'normal ityping\027o  some text')
 | 
			
		||||
      eq({ 1, 0 }, meths.nvim_win_get_cursor(0))
 | 
			
		||||
      command('normal ityping\027o  some text')
 | 
			
		||||
      eq('typing\n  some text', curbuf_contents())
 | 
			
		||||
      eq({ 2, 10 }, curwin('get_cursor'))
 | 
			
		||||
      curwin('set_cursor', { 2, 6 })
 | 
			
		||||
      nvim('command', 'normal i dumb')
 | 
			
		||||
      eq({ 2, 10 }, meths.nvim_win_get_cursor(0))
 | 
			
		||||
      meths.nvim_win_set_cursor(0, { 2, 6 })
 | 
			
		||||
      command('normal i dumb')
 | 
			
		||||
      eq('typing\n  some dumb text', curbuf_contents())
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
@@ -119,10 +124,10 @@ describe('API/win', function()
 | 
			
		||||
      ]],
 | 
			
		||||
      }
 | 
			
		||||
      -- cursor position is at beginning
 | 
			
		||||
      eq({ 1, 0 }, window('get_cursor', win))
 | 
			
		||||
      eq({ 1, 0 }, meths.nvim_win_get_cursor(win))
 | 
			
		||||
 | 
			
		||||
      -- move cursor to end
 | 
			
		||||
      window('set_cursor', win, { 101, 0 })
 | 
			
		||||
      meths.nvim_win_set_cursor(win, { 101, 0 })
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
                                      |*7
 | 
			
		||||
@@ -132,7 +137,7 @@ describe('API/win', function()
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      -- move cursor to the beginning again
 | 
			
		||||
      window('set_cursor', win, { 1, 0 })
 | 
			
		||||
      meths.nvim_win_set_cursor(win, { 1, 0 })
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
        ^prologue                      |
 | 
			
		||||
@@ -141,11 +146,11 @@ describe('API/win', function()
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      -- move focus to new window
 | 
			
		||||
      nvim('command', 'new')
 | 
			
		||||
      command('new')
 | 
			
		||||
      neq(win, curwin())
 | 
			
		||||
 | 
			
		||||
      -- sanity check, cursor position is kept
 | 
			
		||||
      eq({ 1, 0 }, window('get_cursor', win))
 | 
			
		||||
      eq({ 1, 0 }, meths.nvim_win_get_cursor(win))
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
        ^                              |
 | 
			
		||||
@@ -159,7 +164,7 @@ describe('API/win', function()
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      -- move cursor to end
 | 
			
		||||
      window('set_cursor', win, { 101, 0 })
 | 
			
		||||
      meths.nvim_win_set_cursor(win, { 101, 0 })
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
        ^                              |
 | 
			
		||||
@@ -173,7 +178,7 @@ describe('API/win', function()
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      -- move cursor to the beginning again
 | 
			
		||||
      window('set_cursor', win, { 1, 0 })
 | 
			
		||||
      meths.nvim_win_set_cursor(win, { 1, 0 })
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
        ^                              |
 | 
			
		||||
@@ -200,17 +205,17 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
      -- cursor position is at beginning
 | 
			
		||||
      local win = curwin()
 | 
			
		||||
      eq({ 1, 0 }, window('get_cursor', win))
 | 
			
		||||
      eq({ 1, 0 }, meths.nvim_win_get_cursor(win))
 | 
			
		||||
 | 
			
		||||
      -- move cursor to column 5
 | 
			
		||||
      window('set_cursor', win, { 1, 5 })
 | 
			
		||||
      meths.nvim_win_set_cursor(win, { 1, 5 })
 | 
			
		||||
 | 
			
		||||
      -- move down a line
 | 
			
		||||
      feed('j')
 | 
			
		||||
      poke_eventloop() -- let nvim process the 'j' command
 | 
			
		||||
 | 
			
		||||
      -- cursor is still in column 5
 | 
			
		||||
      eq({ 2, 5 }, window('get_cursor', win))
 | 
			
		||||
      eq({ 2, 5 }, meths.nvim_win_get_cursor(win))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('updates cursorline and statusline ruler in non-current window', function()
 | 
			
		||||
@@ -240,7 +245,7 @@ describe('API/win', function()
 | 
			
		||||
        {3:[No Name] [+]  4,3         All }{4:[No Name] [+]  4,3        All}|
 | 
			
		||||
                                                                    |
 | 
			
		||||
      ]])
 | 
			
		||||
      window('set_cursor', oldwin, { 1, 0 })
 | 
			
		||||
      meths.nvim_win_set_cursor(oldwin, { 1, 0 })
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        aaa                           │{2:aaa                          }|
 | 
			
		||||
        bbb                           │bbb                          |
 | 
			
		||||
@@ -278,7 +283,7 @@ describe('API/win', function()
 | 
			
		||||
        {3:[No Name] [+]                  }{4:[No Name] [+]                }|
 | 
			
		||||
                                                                    |
 | 
			
		||||
      ]])
 | 
			
		||||
      window('set_cursor', oldwin, { 2, 0 })
 | 
			
		||||
      meths.nvim_win_set_cursor(oldwin, { 2, 0 })
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        aa{2:a}                           │{2:a}aa                          |
 | 
			
		||||
        bb{2:b}                           │bbb                          |
 | 
			
		||||
@@ -293,32 +298,35 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('{get,set}_height', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'vsplit')
 | 
			
		||||
      eq(window('get_height', nvim('list_wins')[2]), window('get_height', nvim('list_wins')[1]))
 | 
			
		||||
      nvim('set_current_win', nvim('list_wins')[2])
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      command('vsplit')
 | 
			
		||||
      eq(
 | 
			
		||||
        window('get_height', nvim('list_wins')[2]),
 | 
			
		||||
        math.floor(window('get_height', nvim('list_wins')[1]) / 2)
 | 
			
		||||
        meths.nvim_win_get_height(meths.nvim_list_wins()[2]),
 | 
			
		||||
        meths.nvim_win_get_height(meths.nvim_list_wins()[1])
 | 
			
		||||
      )
 | 
			
		||||
      window('set_height', nvim('list_wins')[2], 2)
 | 
			
		||||
      eq(2, window('get_height', nvim('list_wins')[2]))
 | 
			
		||||
      meths.nvim_set_current_win(meths.nvim_list_wins()[2])
 | 
			
		||||
      command('split')
 | 
			
		||||
      eq(
 | 
			
		||||
        meths.nvim_win_get_height(meths.nvim_list_wins()[2]),
 | 
			
		||||
        math.floor(meths.nvim_win_get_height(meths.nvim_list_wins()[1]) / 2)
 | 
			
		||||
      )
 | 
			
		||||
      meths.nvim_win_set_height(meths.nvim_list_wins()[2], 2)
 | 
			
		||||
      eq(2, meths.nvim_win_get_height(meths.nvim_list_wins()[2]))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('correctly handles height=1', function()
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      nvim('set_current_win', nvim('list_wins')[1])
 | 
			
		||||
      window('set_height', nvim('list_wins')[2], 1)
 | 
			
		||||
      eq(1, window('get_height', nvim('list_wins')[2]))
 | 
			
		||||
      command('split')
 | 
			
		||||
      meths.nvim_set_current_win(meths.nvim_list_wins()[1])
 | 
			
		||||
      meths.nvim_win_set_height(meths.nvim_list_wins()[2], 1)
 | 
			
		||||
      eq(1, meths.nvim_win_get_height(meths.nvim_list_wins()[2]))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('correctly handles height=1 with a winbar', function()
 | 
			
		||||
      nvim('command', 'set winbar=foobar')
 | 
			
		||||
      nvim('command', 'set winminheight=0')
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      nvim('set_current_win', nvim('list_wins')[1])
 | 
			
		||||
      window('set_height', nvim('list_wins')[2], 1)
 | 
			
		||||
      eq(1, window('get_height', nvim('list_wins')[2]))
 | 
			
		||||
      command('set winbar=foobar')
 | 
			
		||||
      command('set winminheight=0')
 | 
			
		||||
      command('split')
 | 
			
		||||
      meths.nvim_set_current_win(meths.nvim_list_wins()[1])
 | 
			
		||||
      meths.nvim_win_set_height(meths.nvim_list_wins()[2], 1)
 | 
			
		||||
      eq(1, meths.nvim_win_get_height(meths.nvim_list_wins()[2]))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('do not cause ml_get errors with foldmethod=expr #19989', function()
 | 
			
		||||
@@ -340,16 +348,19 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('{get,set}_width', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      eq(window('get_width', nvim('list_wins')[2]), window('get_width', nvim('list_wins')[1]))
 | 
			
		||||
      nvim('set_current_win', nvim('list_wins')[2])
 | 
			
		||||
      nvim('command', 'vsplit')
 | 
			
		||||
      command('split')
 | 
			
		||||
      eq(
 | 
			
		||||
        window('get_width', nvim('list_wins')[2]),
 | 
			
		||||
        math.floor(window('get_width', nvim('list_wins')[1]) / 2)
 | 
			
		||||
        meths.nvim_win_get_width(meths.nvim_list_wins()[2]),
 | 
			
		||||
        meths.nvim_win_get_width(meths.nvim_list_wins()[1])
 | 
			
		||||
      )
 | 
			
		||||
      window('set_width', nvim('list_wins')[2], 2)
 | 
			
		||||
      eq(2, window('get_width', nvim('list_wins')[2]))
 | 
			
		||||
      meths.nvim_set_current_win(meths.nvim_list_wins()[2])
 | 
			
		||||
      command('vsplit')
 | 
			
		||||
      eq(
 | 
			
		||||
        meths.nvim_win_get_width(meths.nvim_list_wins()[2]),
 | 
			
		||||
        math.floor(meths.nvim_win_get_width(meths.nvim_list_wins()[1]) / 2)
 | 
			
		||||
      )
 | 
			
		||||
      meths.nvim_win_set_width(meths.nvim_list_wins()[2], 2)
 | 
			
		||||
      eq(2, meths.nvim_win_get_width(meths.nvim_list_wins()[2]))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('do not cause ml_get errors with foldmethod=expr #19989', function()
 | 
			
		||||
@@ -371,17 +382,17 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('{get,set,del}_var', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      curwin('set_var', 'lua', { 1, 2, { ['3'] = 1 } })
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, curwin('get_var', 'lua'))
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, nvim('eval', 'w:lua'))
 | 
			
		||||
      meths.nvim_win_set_var(0, 'lua', { 1, 2, { ['3'] = 1 } })
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_win_get_var(0, 'lua'))
 | 
			
		||||
      eq({ 1, 2, { ['3'] = 1 } }, meths.nvim_eval('w:lua'))
 | 
			
		||||
      eq(1, funcs.exists('w:lua'))
 | 
			
		||||
      curwinmeths.del_var('lua')
 | 
			
		||||
      meths.nvim_win_del_var(0, 'lua')
 | 
			
		||||
      eq(0, funcs.exists('w:lua'))
 | 
			
		||||
      eq('Key not found: lua', pcall_err(curwinmeths.del_var, 'lua'))
 | 
			
		||||
      curwinmeths.set_var('lua', 1)
 | 
			
		||||
      eq('Key not found: lua', pcall_err(meths.nvim_win_del_var, 0, 'lua'))
 | 
			
		||||
      meths.nvim_win_set_var(0, 'lua', 1)
 | 
			
		||||
      command('lockvar w:lua')
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(curwinmeths.del_var, 'lua'))
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(curwinmeths.set_var, 'lua', 1))
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(meths.nvim_win_del_var, 0, 'lua'))
 | 
			
		||||
      eq('Key is locked: lua', pcall_err(meths.nvim_win_set_var, 0, 'lua', 1))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('window_set_var returns the old value', function()
 | 
			
		||||
@@ -402,51 +413,51 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('nvim_get_option_value, nvim_set_option_value', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('set_option_value', 'colorcolumn', '4,3', {})
 | 
			
		||||
      eq('4,3', nvim('get_option_value', 'colorcolumn', {}))
 | 
			
		||||
      meths.nvim_set_option_value('colorcolumn', '4,3', {})
 | 
			
		||||
      eq('4,3', meths.nvim_get_option_value('colorcolumn', {}))
 | 
			
		||||
      command('set modified hidden')
 | 
			
		||||
      command('enew') -- edit new buffer, window option is preserved
 | 
			
		||||
      eq('4,3', nvim('get_option_value', 'colorcolumn', {}))
 | 
			
		||||
      eq('4,3', meths.nvim_get_option_value('colorcolumn', {}))
 | 
			
		||||
 | 
			
		||||
      -- global-local option
 | 
			
		||||
      nvim('set_option_value', 'statusline', 'window-status', { win = 0 })
 | 
			
		||||
      eq('window-status', nvim('get_option_value', 'statusline', { win = 0 }))
 | 
			
		||||
      eq('', nvim('get_option_value', 'statusline', { scope = 'global' }))
 | 
			
		||||
      meths.nvim_set_option_value('statusline', 'window-status', { win = 0 })
 | 
			
		||||
      eq('window-status', meths.nvim_get_option_value('statusline', { win = 0 }))
 | 
			
		||||
      eq('', meths.nvim_get_option_value('statusline', { scope = 'global' }))
 | 
			
		||||
      command('set modified')
 | 
			
		||||
      command('enew') -- global-local: not preserved in new buffer
 | 
			
		||||
      -- confirm local value was not copied
 | 
			
		||||
      eq('', nvim('get_option_value', 'statusline', { win = 0 }))
 | 
			
		||||
      eq('', meths.nvim_get_option_value('statusline', { win = 0 }))
 | 
			
		||||
      eq('', eval('&l:statusline'))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('after switching windows #15390', function()
 | 
			
		||||
      nvim('command', 'tabnew')
 | 
			
		||||
      local tab1 = unpack(nvim('list_tabpages'))
 | 
			
		||||
      local win1 = unpack(tabpage('list_wins', tab1))
 | 
			
		||||
      nvim('set_option_value', 'statusline', 'window-status', { win = win1.id })
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      nvim('command', 'wincmd J')
 | 
			
		||||
      nvim('command', 'wincmd j')
 | 
			
		||||
      eq('window-status', nvim('get_option_value', 'statusline', { win = win1.id }))
 | 
			
		||||
      command('tabnew')
 | 
			
		||||
      local tab1 = unpack(meths.nvim_list_tabpages())
 | 
			
		||||
      local win1 = unpack(meths.nvim_tabpage_list_wins(tab1))
 | 
			
		||||
      meths.nvim_set_option_value('statusline', 'window-status', { win = win1.id })
 | 
			
		||||
      command('split')
 | 
			
		||||
      command('wincmd J')
 | 
			
		||||
      command('wincmd j')
 | 
			
		||||
      eq('window-status', meths.nvim_get_option_value('statusline', { win = win1.id }))
 | 
			
		||||
      assert_alive()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('returns values for unset local options', function()
 | 
			
		||||
      eq(-1, nvim('get_option_value', 'scrolloff', { win = 0, scope = 'local' }))
 | 
			
		||||
      eq(-1, meths.nvim_get_option_value('scrolloff', { win = 0, scope = 'local' }))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('get_position', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      local height = window('get_height', nvim('list_wins')[1])
 | 
			
		||||
      local width = window('get_width', nvim('list_wins')[1])
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      nvim('command', 'vsplit')
 | 
			
		||||
      eq({ 0, 0 }, window('get_position', nvim('list_wins')[1]))
 | 
			
		||||
      local height = meths.nvim_win_get_height(meths.nvim_list_wins()[1])
 | 
			
		||||
      local width = meths.nvim_win_get_width(meths.nvim_list_wins()[1])
 | 
			
		||||
      command('split')
 | 
			
		||||
      command('vsplit')
 | 
			
		||||
      eq({ 0, 0 }, meths.nvim_win_get_position(meths.nvim_list_wins()[1]))
 | 
			
		||||
      local vsplit_pos = math.floor(width / 2)
 | 
			
		||||
      local split_pos = math.floor(height / 2)
 | 
			
		||||
      local win2row, win2col = unpack(window('get_position', nvim('list_wins')[2]))
 | 
			
		||||
      local win3row, win3col = unpack(window('get_position', nvim('list_wins')[3]))
 | 
			
		||||
      local win2row, win2col = unpack(meths.nvim_win_get_position(meths.nvim_list_wins()[2]))
 | 
			
		||||
      local win3row, win3col = unpack(meths.nvim_win_get_position(meths.nvim_list_wins()[3]))
 | 
			
		||||
      eq(0, win2row)
 | 
			
		||||
      eq(0, win3col)
 | 
			
		||||
      ok(vsplit_pos - 1 <= win2col and win2col <= vsplit_pos + 1)
 | 
			
		||||
@@ -456,46 +467,46 @@ describe('API/win', function()
 | 
			
		||||
 | 
			
		||||
  describe('get_position', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'tabnew')
 | 
			
		||||
      nvim('command', 'vsplit')
 | 
			
		||||
      eq(window('get_tabpage', nvim('list_wins')[1]), nvim('list_tabpages')[1])
 | 
			
		||||
      eq(window('get_tabpage', nvim('list_wins')[2]), nvim('list_tabpages')[2])
 | 
			
		||||
      eq(window('get_tabpage', nvim('list_wins')[3]), nvim('list_tabpages')[2])
 | 
			
		||||
      command('tabnew')
 | 
			
		||||
      command('vsplit')
 | 
			
		||||
      eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[1]), meths.nvim_list_tabpages()[1])
 | 
			
		||||
      eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[2]), meths.nvim_list_tabpages()[2])
 | 
			
		||||
      eq(meths.nvim_win_get_tabpage(meths.nvim_list_wins()[3]), meths.nvim_list_tabpages()[2])
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('get_number', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      local wins = nvim('list_wins')
 | 
			
		||||
      eq(1, window('get_number', wins[1]))
 | 
			
		||||
      local wins = meths.nvim_list_wins()
 | 
			
		||||
      eq(1, meths.nvim_win_get_number(wins[1]))
 | 
			
		||||
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      local win1, win2 = unpack(nvim('list_wins'))
 | 
			
		||||
      eq(1, window('get_number', win1))
 | 
			
		||||
      eq(2, window('get_number', win2))
 | 
			
		||||
      command('split')
 | 
			
		||||
      local win1, win2 = unpack(meths.nvim_list_wins())
 | 
			
		||||
      eq(1, meths.nvim_win_get_number(win1))
 | 
			
		||||
      eq(2, meths.nvim_win_get_number(win2))
 | 
			
		||||
 | 
			
		||||
      nvim('command', 'wincmd J')
 | 
			
		||||
      eq(2, window('get_number', win1))
 | 
			
		||||
      eq(1, window('get_number', win2))
 | 
			
		||||
      command('wincmd J')
 | 
			
		||||
      eq(2, meths.nvim_win_get_number(win1))
 | 
			
		||||
      eq(1, meths.nvim_win_get_number(win2))
 | 
			
		||||
 | 
			
		||||
      nvim('command', 'tabnew')
 | 
			
		||||
      local win3 = nvim('list_wins')[3]
 | 
			
		||||
      command('tabnew')
 | 
			
		||||
      local win3 = meths.nvim_list_wins()[3]
 | 
			
		||||
      -- First tab page
 | 
			
		||||
      eq(2, window('get_number', win1))
 | 
			
		||||
      eq(1, window('get_number', win2))
 | 
			
		||||
      eq(2, meths.nvim_win_get_number(win1))
 | 
			
		||||
      eq(1, meths.nvim_win_get_number(win2))
 | 
			
		||||
      -- Second tab page
 | 
			
		||||
      eq(1, window('get_number', win3))
 | 
			
		||||
      eq(1, meths.nvim_win_get_number(win3))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('is_valid', function()
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      nvim('command', 'split')
 | 
			
		||||
      local win = nvim('list_wins')[2]
 | 
			
		||||
      nvim('set_current_win', win)
 | 
			
		||||
      ok(window('is_valid', win))
 | 
			
		||||
      nvim('command', 'close')
 | 
			
		||||
      ok(not window('is_valid', win))
 | 
			
		||||
      command('split')
 | 
			
		||||
      local win = meths.nvim_list_wins()[2]
 | 
			
		||||
      meths.nvim_set_current_win(win)
 | 
			
		||||
      ok(meths.nvim_win_is_valid(win))
 | 
			
		||||
      command('close')
 | 
			
		||||
      ok(not meths.nvim_win_is_valid(win))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -671,42 +682,43 @@ describe('API/win', function()
 | 
			
		||||
        ddd
 | 
			
		||||
        eee]])
 | 
			
		||||
      eq('Invalid window id: 23', pcall_err(meths.nvim_win_text_height, 23, {}))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { start_row = 5 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { start_row = -6 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { end_row = 5 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(curwinmeths.text_height, { end_row = -6 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { start_row = 5 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { start_row = -6 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { end_row = 5 }))
 | 
			
		||||
      eq('Line index out of bounds', pcall_err(meths.nvim_win_text_height, 0, { end_row = -6 }))
 | 
			
		||||
      eq(
 | 
			
		||||
        "'start_row' is higher than 'end_row'",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { start_row = 3, end_row = 1 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { start_row = 3, end_row = 1 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "'start_vcol' specified without 'start_row'",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { end_row = 2, start_vcol = 0 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, start_vcol = 0 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "'end_vcol' specified without 'end_row'",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { start_row = 2, end_vcol = 0 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, end_vcol = 0 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "Invalid 'start_vcol': out of range",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = -1 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, start_vcol = -1 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "Invalid 'start_vcol': out of range",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { start_row = 2, start_vcol = X + 1 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { start_row = 2, start_vcol = X + 1 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "Invalid 'end_vcol': out of range",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { end_row = 2, end_vcol = -1 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, end_vcol = -1 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "Invalid 'end_vcol': out of range",
 | 
			
		||||
        pcall_err(curwinmeths.text_height, { end_row = 2, end_vcol = X + 1 })
 | 
			
		||||
        pcall_err(meths.nvim_win_text_height, 0, { end_row = 2, end_vcol = X + 1 })
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "'start_vcol' is higher than 'end_vcol'",
 | 
			
		||||
        pcall_err(
 | 
			
		||||
          curwinmeths.text_height,
 | 
			
		||||
          meths.nvim_win_text_height,
 | 
			
		||||
          0,
 | 
			
		||||
          { start_row = 2, end_row = 2, start_vcol = 10, end_vcol = 5 }
 | 
			
		||||
        )
 | 
			
		||||
      )
 | 
			
		||||
 
 | 
			
		||||
@@ -17,7 +17,6 @@ local expect = helpers.expect
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
 | 
			
		||||
@@ -144,7 +143,7 @@ describe('autocmd', function()
 | 
			
		||||
  describe('BufLeave autocommand', function()
 | 
			
		||||
    it('can wipe out the buffer created by :edit which triggered autocmd', function()
 | 
			
		||||
      meths.nvim_set_option_value('hidden', true, {})
 | 
			
		||||
      curbufmeths.set_lines(0, 1, false, {
 | 
			
		||||
      meths.nvim_buf_set_lines(0, 0, 1, false, {
 | 
			
		||||
        'start of test file xx',
 | 
			
		||||
        'end of test file xx',
 | 
			
		||||
      })
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
@@ -13,7 +13,7 @@ describe('autocmd SearchWrapped', function()
 | 
			
		||||
    command('set ignorecase')
 | 
			
		||||
    command('let g:test = 0')
 | 
			
		||||
    command('autocmd! SearchWrapped * let g:test += 1')
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, {
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, {
 | 
			
		||||
      'The quick brown fox',
 | 
			
		||||
      'jumps over the lazy dog',
 | 
			
		||||
    })
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, nvim, eq = helpers.clear, helpers.nvim, helpers.eq
 | 
			
		||||
local clear, eq = helpers.clear, helpers.eq
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
 | 
			
		||||
describe('TabClosed', function()
 | 
			
		||||
  before_each(clear)
 | 
			
		||||
@@ -7,75 +9,70 @@ describe('TabClosed', function()
 | 
			
		||||
  describe('au TabClosed', function()
 | 
			
		||||
    describe('with * as <afile>', function()
 | 
			
		||||
      it('matches when closing any tab', function()
 | 
			
		||||
        nvim(
 | 
			
		||||
          'command',
 | 
			
		||||
        command(
 | 
			
		||||
          'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()'
 | 
			
		||||
        )
 | 
			
		||||
        repeat
 | 
			
		||||
          nvim('command', 'tabnew')
 | 
			
		||||
        until nvim('eval', 'tabpagenr()') == 6 -- current tab is now 6
 | 
			
		||||
        eq('tabclosed:6:6:5', nvim('exec', 'tabclose', true)) -- close last 6, current tab is now 5
 | 
			
		||||
        eq('tabclosed:5:5:4', nvim('exec', 'close', true)) -- close last window on tab, closes tab
 | 
			
		||||
        eq('tabclosed:2:2:3', nvim('exec', '2tabclose', true)) -- close tab 2, current tab is now 3
 | 
			
		||||
        eq('tabclosed:1:1:2\ntabclosed:1:1:1', nvim('exec', 'tabonly', true)) -- close tabs 1 and 2
 | 
			
		||||
          command('tabnew')
 | 
			
		||||
        until meths.nvim_eval('tabpagenr()') == 6 -- current tab is now 6
 | 
			
		||||
        eq('tabclosed:6:6:5', meths.nvim_exec('tabclose', true)) -- close last 6, current tab is now 5
 | 
			
		||||
        eq('tabclosed:5:5:4', meths.nvim_exec('close', true)) -- close last window on tab, closes tab
 | 
			
		||||
        eq('tabclosed:2:2:3', meths.nvim_exec('2tabclose', true)) -- close tab 2, current tab is now 3
 | 
			
		||||
        eq('tabclosed:1:1:2\ntabclosed:1:1:1', meths.nvim_exec('tabonly', true)) -- close tabs 1 and 2
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
      it('is triggered when closing a window via bdelete from another tab', function()
 | 
			
		||||
        nvim(
 | 
			
		||||
          'command',
 | 
			
		||||
        command(
 | 
			
		||||
          'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()'
 | 
			
		||||
        )
 | 
			
		||||
        nvim('command', '1tabedit Xtestfile')
 | 
			
		||||
        nvim('command', '1tabedit Xtestfile')
 | 
			
		||||
        nvim('command', 'normal! 1gt')
 | 
			
		||||
        eq({ 1, 3 }, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        eq('tabclosed:2:2:1\ntabclosed:2:2:1', nvim('exec', 'bdelete Xtestfile', true))
 | 
			
		||||
        eq({ 1, 1 }, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        command('1tabedit Xtestfile')
 | 
			
		||||
        command('1tabedit Xtestfile')
 | 
			
		||||
        command('normal! 1gt')
 | 
			
		||||
        eq({ 1, 3 }, meths.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        eq('tabclosed:2:2:1\ntabclosed:2:2:1', meths.nvim_exec('bdelete Xtestfile', true))
 | 
			
		||||
        eq({ 1, 1 }, meths.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
      it('is triggered when closing a window via bdelete from current tab', function()
 | 
			
		||||
        nvim(
 | 
			
		||||
          'command',
 | 
			
		||||
        command(
 | 
			
		||||
          'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()'
 | 
			
		||||
        )
 | 
			
		||||
        nvim('command', 'file Xtestfile1')
 | 
			
		||||
        nvim('command', '1tabedit Xtestfile2')
 | 
			
		||||
        nvim('command', '1tabedit Xtestfile2')
 | 
			
		||||
        command('file Xtestfile1')
 | 
			
		||||
        command('1tabedit Xtestfile2')
 | 
			
		||||
        command('1tabedit Xtestfile2')
 | 
			
		||||
 | 
			
		||||
        -- Only one tab is closed, and the alternate file is used for the other.
 | 
			
		||||
        eq({ 2, 3 }, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        eq('tabclosed:2:2:2', nvim('exec', 'bdelete Xtestfile2', true))
 | 
			
		||||
        eq('Xtestfile1', nvim('eval', 'bufname("")'))
 | 
			
		||||
        eq({ 2, 3 }, meths.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        eq('tabclosed:2:2:2', meths.nvim_exec('bdelete Xtestfile2', true))
 | 
			
		||||
        eq('Xtestfile1', meths.nvim_eval('bufname("")'))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    describe('with NR as <afile>', function()
 | 
			
		||||
      it('matches when closing a tab whose index is NR', function()
 | 
			
		||||
        nvim(
 | 
			
		||||
          'command',
 | 
			
		||||
        command(
 | 
			
		||||
          'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()'
 | 
			
		||||
        )
 | 
			
		||||
        nvim('command', 'au! TabClosed 2 echom "tabclosed:match"')
 | 
			
		||||
        command('au! TabClosed 2 echom "tabclosed:match"')
 | 
			
		||||
        repeat
 | 
			
		||||
          nvim('command', 'tabnew')
 | 
			
		||||
        until nvim('eval', 'tabpagenr()') == 7 -- current tab is now 7
 | 
			
		||||
          command('tabnew')
 | 
			
		||||
        until meths.nvim_eval('tabpagenr()') == 7 -- current tab is now 7
 | 
			
		||||
        -- sanity check, we shouldn't match on tabs with numbers other than 2
 | 
			
		||||
        eq('tabclosed:7:7:6', nvim('exec', 'tabclose', true))
 | 
			
		||||
        eq('tabclosed:7:7:6', meths.nvim_exec('tabclose', true))
 | 
			
		||||
        -- close tab page 2, current tab is now 5
 | 
			
		||||
        eq('tabclosed:2:2:5\ntabclosed:match', nvim('exec', '2tabclose', true))
 | 
			
		||||
        eq('tabclosed:2:2:5\ntabclosed:match', meths.nvim_exec('2tabclose', true))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    describe('with close', function()
 | 
			
		||||
      it('is triggered', function()
 | 
			
		||||
        nvim(
 | 
			
		||||
          'command',
 | 
			
		||||
        command(
 | 
			
		||||
          'au! TabClosed * echom "tabclosed:".expand("<afile>").":".expand("<amatch>").":".tabpagenr()'
 | 
			
		||||
        )
 | 
			
		||||
        nvim('command', 'tabedit Xtestfile')
 | 
			
		||||
        eq({ 2, 2 }, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        eq('tabclosed:2:2:1', nvim('exec', 'close', true))
 | 
			
		||||
        eq({ 1, 1 }, nvim('eval', '[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        command('tabedit Xtestfile')
 | 
			
		||||
        eq({ 2, 2 }, meths.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
        eq('tabclosed:2:2:1', meths.nvim_exec('close', true))
 | 
			
		||||
        eq({ 1, 1 }, meths.nvim_eval('[tabpagenr(), tabpagenr("$")]'))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 
 | 
			
		||||
@@ -6,7 +6,7 @@ local dedent = helpers.dedent
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
 | 
			
		||||
describe('TabNewEntered', function()
 | 
			
		||||
@@ -14,33 +14,33 @@ describe('TabNewEntered', function()
 | 
			
		||||
    describe('with * as <afile>', function()
 | 
			
		||||
      it('matches when entering any new tab', function()
 | 
			
		||||
        clear()
 | 
			
		||||
        nvim('command', 'au! TabNewEntered * echom "tabnewentered:".tabpagenr().":".bufnr("")')
 | 
			
		||||
        eq('tabnewentered:2:2', nvim('exec', 'tabnew', true))
 | 
			
		||||
        eq('tabnewentered:3:3', nvim('exec', 'tabnew test.x2', true))
 | 
			
		||||
        command('au! TabNewEntered * echom "tabnewentered:".tabpagenr().":".bufnr("")')
 | 
			
		||||
        eq('tabnewentered:2:2', meths.nvim_exec('tabnew', true))
 | 
			
		||||
        eq('tabnewentered:3:3', meths.nvim_exec('tabnew test.x2', true))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
    describe('with FILE as <afile>', function()
 | 
			
		||||
      it('matches when opening a new tab for FILE', function()
 | 
			
		||||
        clear()
 | 
			
		||||
        nvim('command', 'au! TabNewEntered Xtest-tabnewentered echom "tabnewentered:match"')
 | 
			
		||||
        eq('tabnewentered:match', nvim('exec', 'tabnew Xtest-tabnewentered', true))
 | 
			
		||||
        command('au! TabNewEntered Xtest-tabnewentered echom "tabnewentered:match"')
 | 
			
		||||
        eq('tabnewentered:match', meths.nvim_exec('tabnew Xtest-tabnewentered', true))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
    describe('with CTRL-W T', function()
 | 
			
		||||
      it('works when opening a new tab with CTRL-W T', function()
 | 
			
		||||
        clear()
 | 
			
		||||
        nvim('command', 'au! TabNewEntered * echom "entered"')
 | 
			
		||||
        nvim('command', 'tabnew test.x2')
 | 
			
		||||
        nvim('command', 'split')
 | 
			
		||||
        eq('entered', nvim('exec', 'execute "normal \\<C-W>T"', true))
 | 
			
		||||
        command('au! TabNewEntered * echom "entered"')
 | 
			
		||||
        command('tabnew test.x2')
 | 
			
		||||
        command('split')
 | 
			
		||||
        eq('entered', meths.nvim_exec('execute "normal \\<C-W>T"', true))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
    describe('with tab split #4334', function()
 | 
			
		||||
      it('works when create a tab by using tab split command', function()
 | 
			
		||||
        clear()
 | 
			
		||||
        nvim('command', 'au! TabNewEntered * let b:entered = "entered"')
 | 
			
		||||
        nvim('command', 'tab split')
 | 
			
		||||
        eq('entered', nvim('exec', 'echo b:entered', true))
 | 
			
		||||
        command('au! TabNewEntered * let b:entered = "entered"')
 | 
			
		||||
        command('tab split')
 | 
			
		||||
        eq('entered', meths.nvim_exec('echo b:entered', true))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -50,20 +50,20 @@ describe('TabEnter', function()
 | 
			
		||||
  before_each(clear)
 | 
			
		||||
  it('has correct previous tab when entering any new tab', function()
 | 
			
		||||
    command('augroup TEMP')
 | 
			
		||||
    nvim('command', 'au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
 | 
			
		||||
    command('au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
 | 
			
		||||
    command('augroup END')
 | 
			
		||||
    eq('tabenter:2:1', nvim('exec', 'tabnew', true))
 | 
			
		||||
    eq('tabenter:3:2', nvim('exec', 'tabnew test.x2', true))
 | 
			
		||||
    eq('tabenter:2:1', meths.nvim_exec('tabnew', true))
 | 
			
		||||
    eq('tabenter:3:2', meths.nvim_exec('tabnew test.x2', true))
 | 
			
		||||
    command('augroup! TEMP')
 | 
			
		||||
  end)
 | 
			
		||||
  it('has correct previous tab when entering any preexisting tab', function()
 | 
			
		||||
    command('tabnew')
 | 
			
		||||
    command('tabnew')
 | 
			
		||||
    command('augroup TEMP')
 | 
			
		||||
    nvim('command', 'au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
 | 
			
		||||
    command('au! TabEnter * echom "tabenter:".tabpagenr().":".tabpagenr(\'#\')')
 | 
			
		||||
    command('augroup END')
 | 
			
		||||
    eq('tabenter:1:3', nvim('exec', 'tabnext', true))
 | 
			
		||||
    eq('tabenter:2:1', nvim('exec', 'tabnext', true))
 | 
			
		||||
    eq('tabenter:1:3', meths.nvim_exec('tabnext', true))
 | 
			
		||||
    eq('tabenter:2:1', meths.nvim_exec('tabnext', true))
 | 
			
		||||
    command('augroup! TEMP')
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ local uv = vim.uv
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
 | 
			
		||||
local clear, command, nvim, testprg = helpers.clear, helpers.command, helpers.nvim, helpers.testprg
 | 
			
		||||
local clear, command, testprg = helpers.clear, helpers.command, helpers.testprg
 | 
			
		||||
local eval, eq, neq, retry = helpers.eval, helpers.eq, helpers.neq, helpers.retry
 | 
			
		||||
local matches = helpers.matches
 | 
			
		||||
local ok = helpers.ok
 | 
			
		||||
@@ -16,13 +16,13 @@ local is_os = helpers.is_os
 | 
			
		||||
describe('autocmd TermClose', function()
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
    nvim('set_option_value', 'shell', testprg('shell-test'), {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', testprg('shell-test'), {})
 | 
			
		||||
    command('set shellcmdflag=EXE shellredir= shellpipe= shellquote= shellxquote=')
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  local function test_termclose_delete_own_buf()
 | 
			
		||||
    -- The terminal process needs to keep running so that TermClose isn't triggered immediately.
 | 
			
		||||
    nvim('set_option_value', 'shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
 | 
			
		||||
    command('autocmd TermClose * bdelete!')
 | 
			
		||||
    command('terminal')
 | 
			
		||||
    matches(
 | 
			
		||||
@@ -56,7 +56,7 @@ describe('autocmd TermClose', function()
 | 
			
		||||
 | 
			
		||||
  it('triggers when long-running terminal job gets stopped', function()
 | 
			
		||||
    skip(is_os('win'))
 | 
			
		||||
    nvim('set_option_value', 'shell', is_os('win') and 'cmd.exe' or 'sh', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', is_os('win') and 'cmd.exe' or 'sh', {})
 | 
			
		||||
    command('autocmd TermClose * let g:test_termclose = 23')
 | 
			
		||||
    command('terminal')
 | 
			
		||||
    command('call jobstop(b:terminal_job_id)')
 | 
			
		||||
@@ -67,8 +67,8 @@ describe('autocmd TermClose', function()
 | 
			
		||||
 | 
			
		||||
  it('kills job trapping SIGTERM', function()
 | 
			
		||||
    skip(is_os('win'))
 | 
			
		||||
    nvim('set_option_value', 'shell', 'sh', {})
 | 
			
		||||
    nvim('set_option_value', 'shellcmdflag', '-c', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', 'sh', {})
 | 
			
		||||
    meths.nvim_set_option_value('shellcmdflag', '-c', {})
 | 
			
		||||
    command(
 | 
			
		||||
      [[ let g:test_job = jobstart('trap "" TERM && echo 1 && sleep 60', { ]]
 | 
			
		||||
        .. [[ 'on_stdout': {-> execute('let g:test_job_started = 1')}, ]]
 | 
			
		||||
@@ -93,8 +93,8 @@ describe('autocmd TermClose', function()
 | 
			
		||||
 | 
			
		||||
  it('kills PTY job trapping SIGHUP and SIGTERM', function()
 | 
			
		||||
    skip(is_os('win'))
 | 
			
		||||
    nvim('set_option_value', 'shell', 'sh', {})
 | 
			
		||||
    nvim('set_option_value', 'shellcmdflag', '-c', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', 'sh', {})
 | 
			
		||||
    meths.nvim_set_option_value('shellcmdflag', '-c', {})
 | 
			
		||||
    command(
 | 
			
		||||
      [[ let g:test_job = jobstart('trap "" HUP TERM && echo 1 && sleep 60', { ]]
 | 
			
		||||
        .. [[ 'pty': 1,]]
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, eval, eq = helpers.clear, helpers.eval, helpers.eq
 | 
			
		||||
local feed, command, expect = helpers.feed, helpers.command, helpers.expect
 | 
			
		||||
local curbufmeths, funcs, neq = helpers.curbufmeths, helpers.funcs, helpers.neq
 | 
			
		||||
local meths, funcs, neq = helpers.meths, helpers.funcs, helpers.neq
 | 
			
		||||
 | 
			
		||||
describe('TextYankPost', function()
 | 
			
		||||
  before_each(function()
 | 
			
		||||
@@ -14,7 +14,7 @@ describe('TextYankPost', function()
 | 
			
		||||
    command('autocmd TextYankPost * let g:event = copy(v:event)')
 | 
			
		||||
    command('autocmd TextYankPost * let g:count += 1')
 | 
			
		||||
 | 
			
		||||
    curbufmeths.set_lines(0, -1, true, {
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, -1, true, {
 | 
			
		||||
      'foo\0bar',
 | 
			
		||||
      'baz text',
 | 
			
		||||
    })
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,7 @@ describe('v:exiting', function()
 | 
			
		||||
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    helpers.clear()
 | 
			
		||||
    cid = helpers.nvim('get_api_info')[1]
 | 
			
		||||
    cid = helpers.meths.nvim_get_api_info()[1]
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('defaults to v:null', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ local feed = helpers.feed
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local neq = helpers.neq
 | 
			
		||||
local next_msg = helpers.next_msg
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
local ok = helpers.ok
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
@@ -43,8 +42,8 @@ describe('jobs', function()
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
 | 
			
		||||
    channel = nvim('get_api_info')[1]
 | 
			
		||||
    nvim('set_var', 'channel', channel)
 | 
			
		||||
    channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
    meths.nvim_set_var('channel', channel)
 | 
			
		||||
    source([[
 | 
			
		||||
    function! Normalize(data) abort
 | 
			
		||||
      " Windows: remove ^M and term escape sequences
 | 
			
		||||
@@ -69,22 +68,22 @@ describe('jobs', function()
 | 
			
		||||
    command('let g:job_opts.env = v:true')
 | 
			
		||||
    local _, err = pcall(function()
 | 
			
		||||
      if is_os('win') then
 | 
			
		||||
        nvim('command', "let j = jobstart('set', g:job_opts)")
 | 
			
		||||
        command("let j = jobstart('set', g:job_opts)")
 | 
			
		||||
      else
 | 
			
		||||
        nvim('command', "let j = jobstart('env', g:job_opts)")
 | 
			
		||||
        command("let j = jobstart('env', g:job_opts)")
 | 
			
		||||
      end
 | 
			
		||||
    end)
 | 
			
		||||
    ok(string.find(err, 'E475: Invalid argument: env') ~= nil)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('append environment #env', function()
 | 
			
		||||
    nvim('command', "let $VAR = 'abc'")
 | 
			
		||||
    nvim('command', "let $TOTO = 'goodbye world'")
 | 
			
		||||
    nvim('command', "let g:job_opts.env = {'TOTO': 'hello world'}")
 | 
			
		||||
    command("let $VAR = 'abc'")
 | 
			
		||||
    command("let $TOTO = 'goodbye world'")
 | 
			
		||||
    command("let g:job_opts.env = {'TOTO': 'hello world'}")
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', [[call jobstart('echo %TOTO% %VAR%', g:job_opts)]])
 | 
			
		||||
      command([[call jobstart('echo %TOTO% %VAR%', g:job_opts)]])
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', [[call jobstart('echo $TOTO $VAR', g:job_opts)]])
 | 
			
		||||
      command([[call jobstart('echo $TOTO $VAR', g:job_opts)]])
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    expect_msg_seq({
 | 
			
		||||
@@ -97,14 +96,14 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('append environment with pty #env', function()
 | 
			
		||||
    nvim('command', "let $VAR = 'abc'")
 | 
			
		||||
    nvim('command', "let $TOTO = 'goodbye world'")
 | 
			
		||||
    nvim('command', 'let g:job_opts.pty = v:true')
 | 
			
		||||
    nvim('command', "let g:job_opts.env = {'TOTO': 'hello world'}")
 | 
			
		||||
    command("let $VAR = 'abc'")
 | 
			
		||||
    command("let $TOTO = 'goodbye world'")
 | 
			
		||||
    command('let g:job_opts.pty = v:true')
 | 
			
		||||
    command("let g:job_opts.env = {'TOTO': 'hello world'}")
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', [[call jobstart('echo %TOTO% %VAR%', g:job_opts)]])
 | 
			
		||||
      command([[call jobstart('echo %TOTO% %VAR%', g:job_opts)]])
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', [[call jobstart('echo $TOTO $VAR', g:job_opts)]])
 | 
			
		||||
      command([[call jobstart('echo $TOTO $VAR', g:job_opts)]])
 | 
			
		||||
    end
 | 
			
		||||
    expect_msg_seq({
 | 
			
		||||
      { 'notification', 'stdout', { 0, { 'hello world abc' } } },
 | 
			
		||||
@@ -116,10 +115,10 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('replace environment #env', function()
 | 
			
		||||
    nvim('command', "let $VAR = 'abc'")
 | 
			
		||||
    nvim('command', "let $TOTO = 'goodbye world'")
 | 
			
		||||
    nvim('command', "let g:job_opts.env = {'TOTO': 'hello world'}")
 | 
			
		||||
    nvim('command', 'let g:job_opts.clear_env = 1')
 | 
			
		||||
    command("let $VAR = 'abc'")
 | 
			
		||||
    command("let $TOTO = 'goodbye world'")
 | 
			
		||||
    command("let g:job_opts.env = {'TOTO': 'hello world'}")
 | 
			
		||||
    command('let g:job_opts.clear_env = 1')
 | 
			
		||||
 | 
			
		||||
    -- libuv ensures that certain "required" environment variables are
 | 
			
		||||
    -- preserved if the user doesn't provide them in a custom environment
 | 
			
		||||
@@ -129,13 +128,13 @@ describe('jobs', function()
 | 
			
		||||
    -- Rather than expecting a completely empty environment, ensure that $VAR
 | 
			
		||||
    -- is *not* in the environment but $TOTO is.
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', [[call jobstart('echo %TOTO% %VAR%', g:job_opts)]])
 | 
			
		||||
      command([[call jobstart('echo %TOTO% %VAR%', g:job_opts)]])
 | 
			
		||||
      expect_msg_seq({
 | 
			
		||||
        { 'notification', 'stdout', { 0, { 'hello world %VAR%', '' } } },
 | 
			
		||||
      })
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', 'set shell=/bin/sh')
 | 
			
		||||
      nvim('command', [[call jobstart('echo $TOTO $VAR', g:job_opts)]])
 | 
			
		||||
      command('set shell=/bin/sh')
 | 
			
		||||
      command([[call jobstart('echo $TOTO $VAR', g:job_opts)]])
 | 
			
		||||
      expect_msg_seq({
 | 
			
		||||
        { 'notification', 'stdout', { 0, { 'hello world', '' } } },
 | 
			
		||||
      })
 | 
			
		||||
@@ -143,17 +142,17 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('handles case-insensitively matching #env vars', function()
 | 
			
		||||
    nvim('command', "let $TOTO = 'abc'")
 | 
			
		||||
    command("let $TOTO = 'abc'")
 | 
			
		||||
    -- Since $Toto is being set in the job, it should take precedence over the
 | 
			
		||||
    -- global $TOTO on Windows
 | 
			
		||||
    nvim('command', "let g:job_opts = {'env': {'Toto': 'def'}, 'stdout_buffered': v:true}")
 | 
			
		||||
    command("let g:job_opts = {'env': {'Toto': 'def'}, 'stdout_buffered': v:true}")
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', [[let j = jobstart('set | find /I "toto="', g:job_opts)]])
 | 
			
		||||
      command([[let j = jobstart('set | find /I "toto="', g:job_opts)]])
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', [[let j = jobstart('env | grep -i toto=', g:job_opts)]])
 | 
			
		||||
      command([[let j = jobstart('env | grep -i toto=', g:job_opts)]])
 | 
			
		||||
    end
 | 
			
		||||
    nvim('command', 'call jobwait([j])')
 | 
			
		||||
    nvim('command', 'let g:output = Normalize(g:job_opts.stdout)')
 | 
			
		||||
    command('call jobwait([j])')
 | 
			
		||||
    command('let g:output = Normalize(g:job_opts.stdout)')
 | 
			
		||||
    local actual = eval('g:output')
 | 
			
		||||
    local expected
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
@@ -169,11 +168,11 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('uses &shell and &shellcmdflag if passed a string', function()
 | 
			
		||||
    nvim('command', "let $VAR = 'abc'")
 | 
			
		||||
    command("let $VAR = 'abc'")
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', "let j = jobstart('echo %VAR%', g:job_opts)")
 | 
			
		||||
      command("let j = jobstart('echo %VAR%', g:job_opts)")
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', "let j = jobstart('echo $VAR', g:job_opts)")
 | 
			
		||||
      command("let j = jobstart('echo $VAR', g:job_opts)")
 | 
			
		||||
    end
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { 'abc', '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
@@ -181,11 +180,11 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('changes to given / directory', function()
 | 
			
		||||
    nvim('command', "let g:job_opts.cwd = '/'")
 | 
			
		||||
    command("let g:job_opts.cwd = '/'")
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', "let j = jobstart('cd', g:job_opts)")
 | 
			
		||||
      command("let j = jobstart('cd', g:job_opts)")
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', "let j = jobstart('pwd', g:job_opts)")
 | 
			
		||||
      command("let j = jobstart('pwd', g:job_opts)")
 | 
			
		||||
    end
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { pathroot(), '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
@@ -195,11 +194,11 @@ describe('jobs', function()
 | 
			
		||||
  it('changes to given `cwd` directory', function()
 | 
			
		||||
    local dir = eval('resolve(tempname())'):gsub('/', get_pathsep())
 | 
			
		||||
    mkdir(dir)
 | 
			
		||||
    nvim('command', "let g:job_opts.cwd = '" .. dir .. "'")
 | 
			
		||||
    command("let g:job_opts.cwd = '" .. dir .. "'")
 | 
			
		||||
    if is_os('win') then
 | 
			
		||||
      nvim('command', "let j = jobstart('cd', g:job_opts)")
 | 
			
		||||
      command("let j = jobstart('cd', g:job_opts)")
 | 
			
		||||
    else
 | 
			
		||||
      nvim('command', "let j = jobstart('pwd', g:job_opts)")
 | 
			
		||||
      command("let j = jobstart('pwd', g:job_opts)")
 | 
			
		||||
    end
 | 
			
		||||
    expect_msg_seq(
 | 
			
		||||
      {
 | 
			
		||||
@@ -221,11 +220,11 @@ describe('jobs', function()
 | 
			
		||||
  it('fails to change to invalid `cwd`', function()
 | 
			
		||||
    local dir = eval('resolve(tempname())."-bogus"')
 | 
			
		||||
    local _, err = pcall(function()
 | 
			
		||||
      nvim('command', "let g:job_opts.cwd = '" .. dir .. "'")
 | 
			
		||||
      command("let g:job_opts.cwd = '" .. dir .. "'")
 | 
			
		||||
      if is_os('win') then
 | 
			
		||||
        nvim('command', "let j = jobstart('cd', g:job_opts)")
 | 
			
		||||
        command("let j = jobstart('cd', g:job_opts)")
 | 
			
		||||
      else
 | 
			
		||||
        nvim('command', "let j = jobstart('pwd', g:job_opts)")
 | 
			
		||||
        command("let j = jobstart('pwd', g:job_opts)")
 | 
			
		||||
      end
 | 
			
		||||
    end)
 | 
			
		||||
    ok(string.find(err, 'E475: Invalid argument: expected valid directory$') ~= nil)
 | 
			
		||||
@@ -239,7 +238,7 @@ describe('jobs', function()
 | 
			
		||||
    funcs.setfperm(dir, 'rw-------')
 | 
			
		||||
    matches(
 | 
			
		||||
      '^Vim%(call%):E903: Process failed to start: permission denied: .*',
 | 
			
		||||
      pcall_err(nvim, 'command', "call jobstart(['pwd'], {'cwd': '" .. dir .. "'})")
 | 
			
		||||
      pcall_err(command, "call jobstart(['pwd'], {'cwd': '" .. dir .. "'})")
 | 
			
		||||
    )
 | 
			
		||||
    rmdir(dir)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -269,8 +268,8 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('invokes callbacks when the job writes and exits', function()
 | 
			
		||||
    nvim('command', "let g:job_opts.on_stderr  = function('OnEvent')")
 | 
			
		||||
    nvim('command', [[call jobstart(has('win32') ? 'echo:' : 'echo', g:job_opts)]])
 | 
			
		||||
    command("let g:job_opts.on_stderr  = function('OnEvent')")
 | 
			
		||||
    command([[call jobstart(has('win32') ? 'echo:' : 'echo', g:job_opts)]])
 | 
			
		||||
    expect_twostreams({
 | 
			
		||||
      { 'notification', 'stdout', { 0, { '', '' } } },
 | 
			
		||||
      { 'notification', 'stdout', { 0, { '' } } },
 | 
			
		||||
@@ -279,11 +278,11 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('interactive commands', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    neq(0, eval('j'))
 | 
			
		||||
    nvim('command', 'call jobsend(j, "abc\\n")')
 | 
			
		||||
    command('call jobsend(j, "abc\\n")')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { 'abc', '' } } }, next_msg())
 | 
			
		||||
    nvim('command', 'call jobsend(j, "123\\nxyz\\n")')
 | 
			
		||||
    command('call jobsend(j, "123\\nxyz\\n")')
 | 
			
		||||
    expect_msg_seq(
 | 
			
		||||
      { { 'notification', 'stdout', { 0, { '123', 'xyz', '' } } } },
 | 
			
		||||
      -- Alternative sequence:
 | 
			
		||||
@@ -292,7 +291,7 @@ describe('jobs', function()
 | 
			
		||||
        { 'notification', 'stdout', { 0, { 'xyz', '' } } },
 | 
			
		||||
      }
 | 
			
		||||
    )
 | 
			
		||||
    nvim('command', 'call jobsend(j, [123, "xyz", ""])')
 | 
			
		||||
    command('call jobsend(j, [123, "xyz", ""])')
 | 
			
		||||
    expect_msg_seq(
 | 
			
		||||
      { { 'notification', 'stdout', { 0, { '123', 'xyz', '' } } } },
 | 
			
		||||
      -- Alternative sequence:
 | 
			
		||||
@@ -301,7 +300,7 @@ describe('jobs', function()
 | 
			
		||||
        { 'notification', 'stdout', { 0, { 'xyz', '' } } },
 | 
			
		||||
      }
 | 
			
		||||
    )
 | 
			
		||||
    nvim('command', 'call jobstop(j)')
 | 
			
		||||
    command('call jobstop(j)')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 143 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
@@ -311,75 +310,75 @@ describe('jobs', function()
 | 
			
		||||
    local filename = helpers.tmpname()
 | 
			
		||||
    write_file(filename, 'abc\0def\n')
 | 
			
		||||
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '" .. filename .. "'], g:job_opts)")
 | 
			
		||||
    command("let j = jobstart(['cat', '" .. filename .. "'], g:job_opts)")
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { 'abc\ndef', '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 0 } }, next_msg())
 | 
			
		||||
    os.remove(filename)
 | 
			
		||||
 | 
			
		||||
    -- jobsend() preserves NULs.
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', [[call jobsend(j, ["123\n456",""])]])
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command([[call jobsend(j, ["123\n456",""])]])
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '123\n456', '' } } }, next_msg())
 | 
			
		||||
    nvim('command', 'call jobstop(j)')
 | 
			
		||||
    command('call jobstop(j)')
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('emits partial lines (does NOT buffer data lacking newlines)', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', 'call jobsend(j, "abc\\nxyz")')
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command('call jobsend(j, "abc\\nxyz")')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { 'abc', 'xyz' } } }, next_msg())
 | 
			
		||||
    nvim('command', 'call jobstop(j)')
 | 
			
		||||
    command('call jobstop(j)')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 143 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('preserves newlines', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', 'call jobsend(j, "a\\n\\nc\\n\\n\\n\\nb\\n\\n")')
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command('call jobsend(j, "a\\n\\nc\\n\\n\\n\\nb\\n\\n")')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { 'a', '', 'c', '', '', '', 'b', '', '' } } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('preserves NULs', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', 'call jobsend(j, ["\n123\n", "abc\\nxyz\n", ""])')
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command('call jobsend(j, ["\n123\n", "abc\\nxyz\n", ""])')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '\n123\n', 'abc\nxyz\n', '' } } }, next_msg())
 | 
			
		||||
    nvim('command', 'call jobstop(j)')
 | 
			
		||||
    command('call jobstop(j)')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 143 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('avoids sending final newline', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', 'call jobsend(j, ["some data", "without\nfinal nl"])')
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command('call jobsend(j, ["some data", "without\nfinal nl"])')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { 'some data', 'without\nfinal nl' } } }, next_msg())
 | 
			
		||||
    nvim('command', 'call jobstop(j)')
 | 
			
		||||
    command('call jobstop(j)')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 143 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('closes the job streams with jobclose', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', 'call jobclose(j, "stdin")')
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command('call jobclose(j, "stdin")')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 0 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('disallows jobsend on a job that closed stdin', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('command', 'call jobclose(j, "stdin")')
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command('call jobclose(j, "stdin")')
 | 
			
		||||
    eq(
 | 
			
		||||
      false,
 | 
			
		||||
      pcall(function()
 | 
			
		||||
        nvim('command', 'call jobsend(j, ["some data"])')
 | 
			
		||||
        command('call jobsend(j, ["some data"])')
 | 
			
		||||
      end)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    command("let g:job_opts.stdin = 'null'")
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    eq(
 | 
			
		||||
      false,
 | 
			
		||||
      pcall(function()
 | 
			
		||||
        nvim('command', 'call jobsend(j, ["some data"])')
 | 
			
		||||
        command('call jobsend(j, ["some data"])')
 | 
			
		||||
      end)
 | 
			
		||||
    )
 | 
			
		||||
  end)
 | 
			
		||||
@@ -390,21 +389,21 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('jobstop twice on the stopped or exited job return 0', function()
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    neq(0, eval('j'))
 | 
			
		||||
    eq(1, eval('jobstop(j)'))
 | 
			
		||||
    eq(0, eval('jobstop(j)'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('will not leak memory if we leave a job running', function()
 | 
			
		||||
    nvim('command', "call jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command("call jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can get the pid value using getpid', function()
 | 
			
		||||
    nvim('command', "let j =  jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    command("let j =  jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    local pid = eval('jobpid(j)')
 | 
			
		||||
    neq(NIL, meths.nvim_get_proc(pid))
 | 
			
		||||
    nvim('command', 'call jobstop(j)')
 | 
			
		||||
    command('call jobstop(j)')
 | 
			
		||||
    eq({ 'notification', 'stdout', { 0, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 0, 143 } }, next_msg())
 | 
			
		||||
    eq(NIL, meths.nvim_get_proc(pid))
 | 
			
		||||
@@ -412,8 +411,7 @@ describe('jobs', function()
 | 
			
		||||
 | 
			
		||||
  it('disposed on Nvim exit', function()
 | 
			
		||||
    -- use sleep, which doesn't die on stdin close
 | 
			
		||||
    nvim(
 | 
			
		||||
      'command',
 | 
			
		||||
    command(
 | 
			
		||||
      "let g:j =  jobstart(has('win32') ? ['ping', '-n', '1001', '127.0.0.1'] : ['sleep', '1000'], g:job_opts)"
 | 
			
		||||
    )
 | 
			
		||||
    local pid = eval('jobpid(g:j)')
 | 
			
		||||
@@ -423,9 +421,8 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can survive the exit of nvim with "detach"', function()
 | 
			
		||||
    nvim('command', 'let g:job_opts.detach = 1')
 | 
			
		||||
    nvim(
 | 
			
		||||
      'command',
 | 
			
		||||
    command('let g:job_opts.detach = 1')
 | 
			
		||||
    command(
 | 
			
		||||
      "let g:j = jobstart(has('win32') ? ['ping', '-n', '1001', '127.0.0.1'] : ['sleep', '1000'], g:job_opts)"
 | 
			
		||||
    )
 | 
			
		||||
    local pid = eval('jobpid(g:j)')
 | 
			
		||||
@@ -437,8 +434,8 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can pass user data to the callback', function()
 | 
			
		||||
    nvim('command', 'let g:job_opts.user = {"n": 5, "s": "str", "l": [1]}')
 | 
			
		||||
    nvim('command', [[call jobstart('echo foo', g:job_opts)]])
 | 
			
		||||
    command('let g:job_opts.user = {"n": 5, "s": "str", "l": [1]}')
 | 
			
		||||
    command([[call jobstart('echo foo', g:job_opts)]])
 | 
			
		||||
    local data = { n = 5, s = 'str', l = { 1 } }
 | 
			
		||||
    expect_msg_seq(
 | 
			
		||||
      {
 | 
			
		||||
@@ -456,16 +453,16 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can omit data callbacks', function()
 | 
			
		||||
    nvim('command', 'unlet g:job_opts.on_stdout')
 | 
			
		||||
    nvim('command', 'let g:job_opts.user = 5')
 | 
			
		||||
    nvim('command', [[call jobstart('echo foo', g:job_opts)]])
 | 
			
		||||
    command('unlet g:job_opts.on_stdout')
 | 
			
		||||
    command('let g:job_opts.user = 5')
 | 
			
		||||
    command([[call jobstart('echo foo', g:job_opts)]])
 | 
			
		||||
    eq({ 'notification', 'exit', { 5, 0 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can omit exit callback', function()
 | 
			
		||||
    nvim('command', 'unlet g:job_opts.on_exit')
 | 
			
		||||
    nvim('command', 'let g:job_opts.user = 5')
 | 
			
		||||
    nvim('command', [[call jobstart('echo foo', g:job_opts)]])
 | 
			
		||||
    command('unlet g:job_opts.on_exit')
 | 
			
		||||
    command('let g:job_opts.user = 5')
 | 
			
		||||
    command([[call jobstart('echo foo', g:job_opts)]])
 | 
			
		||||
    expect_msg_seq(
 | 
			
		||||
      {
 | 
			
		||||
        { 'notification', 'stdout', { 5, { 'foo', '' } } },
 | 
			
		||||
@@ -481,8 +478,8 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('will pass return code with the exit event', function()
 | 
			
		||||
    nvim('command', 'let g:job_opts.user = 5')
 | 
			
		||||
    nvim('command', "call jobstart('exit 55', g:job_opts)")
 | 
			
		||||
    command('let g:job_opts.user = 5')
 | 
			
		||||
    command("call jobstart('exit 55', g:job_opts)")
 | 
			
		||||
    eq({ 'notification', 'stdout', { 5, { '' } } }, next_msg())
 | 
			
		||||
    eq({ 'notification', 'exit', { 5, 55 } }, next_msg())
 | 
			
		||||
  end)
 | 
			
		||||
@@ -883,7 +880,7 @@ describe('jobs', function()
 | 
			
		||||
        r = next_msg()
 | 
			
		||||
        eq('job ' .. i .. ' exited', r[3][1])
 | 
			
		||||
      end
 | 
			
		||||
      eq(10, nvim('eval', 'g:counter'))
 | 
			
		||||
      eq(10, meths.nvim_eval('g:counter'))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    describe('with timeout argument', function()
 | 
			
		||||
@@ -953,10 +950,10 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  pending('exit event follows stdout, stderr', function()
 | 
			
		||||
    nvim('command', "let g:job_opts.on_stderr  = function('OnEvent')")
 | 
			
		||||
    nvim('command', "let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    nvim('eval', 'jobsend(j, "abcdef")')
 | 
			
		||||
    nvim('eval', 'jobstop(j)')
 | 
			
		||||
    command("let g:job_opts.on_stderr  = function('OnEvent')")
 | 
			
		||||
    command("let j = jobstart(['cat', '-'], g:job_opts)")
 | 
			
		||||
    meths.nvim_eval('jobsend(j, "abcdef")')
 | 
			
		||||
    meths.nvim_eval('jobstop(j)')
 | 
			
		||||
    expect_msg_seq(
 | 
			
		||||
      {
 | 
			
		||||
        { 'notification', 'stdout', { 0, { 'abcdef' } } },
 | 
			
		||||
@@ -1099,7 +1096,7 @@ describe('jobs', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('jobstop on same id before stopped', function()
 | 
			
		||||
    nvim('command', 'let j = jobstart(["cat", "-"], g:job_opts)')
 | 
			
		||||
    command('let j = jobstart(["cat", "-"], g:job_opts)')
 | 
			
		||||
    neq(0, eval('j'))
 | 
			
		||||
 | 
			
		||||
    eq({ 1, 0 }, eval('[jobstop(j), jobstop(j)]'))
 | 
			
		||||
@@ -1140,9 +1137,9 @@ describe('jobs', function()
 | 
			
		||||
      endfunction
 | 
			
		||||
      ]])
 | 
			
		||||
      insert(testprg('tty-test'))
 | 
			
		||||
      nvim('command', 'let g:job_opts.pty = 1')
 | 
			
		||||
      nvim('command', 'let exec = [expand("<cfile>:p")]')
 | 
			
		||||
      nvim('command', 'let j = jobstart(exec, g:job_opts)')
 | 
			
		||||
      command('let g:job_opts.pty = 1')
 | 
			
		||||
      command('let exec = [expand("<cfile>:p")]')
 | 
			
		||||
      command('let j = jobstart(exec, g:job_opts)')
 | 
			
		||||
      j = eval 'j'
 | 
			
		||||
      eq('tty ready', next_chunk())
 | 
			
		||||
    end)
 | 
			
		||||
@@ -1153,14 +1150,14 @@ describe('jobs', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('resizing window', function()
 | 
			
		||||
      nvim('command', 'call jobresize(j, 40, 10)')
 | 
			
		||||
      command('call jobresize(j, 40, 10)')
 | 
			
		||||
      eq('rows: 10, cols: 40', next_chunk())
 | 
			
		||||
      nvim('command', 'call jobresize(j, 10, 40)')
 | 
			
		||||
      command('call jobresize(j, 10, 40)')
 | 
			
		||||
      eq('rows: 40, cols: 10', next_chunk())
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('jobclose() sends SIGHUP', function()
 | 
			
		||||
      nvim('command', 'call jobclose(j)')
 | 
			
		||||
      command('call jobclose(j)')
 | 
			
		||||
      local msg = next_msg()
 | 
			
		||||
      msg = (msg[2] == 'stdout') and next_msg() or msg -- Skip stdout, if any.
 | 
			
		||||
      eq({ 'notification', 'exit', { 0, 42 } }, msg)
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ local clear, feed = helpers.clear, helpers.feed
 | 
			
		||||
local eval, eq, neq = helpers.eval, helpers.eq, helpers.neq
 | 
			
		||||
local feed_command, source, expect = helpers.feed_command, helpers.source, helpers.expect
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
@@ -928,7 +927,7 @@ describe('completion', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('CompleteChanged autocommand', function()
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'foo', 'bar', 'foobar', '' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'foo', 'bar', 'foobar', '' })
 | 
			
		||||
    source([[
 | 
			
		||||
      set complete=. completeopt=noinsert,noselect,menuone
 | 
			
		||||
      function! OnPumChange()
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ local funcs = helpers.funcs
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
local write_file = helpers.write_file
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
 | 
			
		||||
describe('jumplist', function()
 | 
			
		||||
  local fname1 = 'Xtest-functional-normal-jump'
 | 
			
		||||
@@ -284,7 +284,7 @@ describe('jumpoptions=view', function()
 | 
			
		||||
    screen:attach()
 | 
			
		||||
    command('edit ' .. file1)
 | 
			
		||||
    feed('7GzbG')
 | 
			
		||||
    curbufmeths.set_lines(0, 2, true, {})
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 2, true, {})
 | 
			
		||||
    -- Move to line 7, and set it as the last line visible on the view with zb, meaning to recover
 | 
			
		||||
    -- the view it needs to put the cursor 7 lines from the top line. Then go to the end of the
 | 
			
		||||
    -- file, delete 2 lines before line 7, meaning the jump/mark is moved 2 lines up to line 5.
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ local eq, neq, call = helpers.eq, helpers.neq, helpers.call
 | 
			
		||||
local eval, feed, clear = helpers.eval, helpers.feed, helpers.clear
 | 
			
		||||
local command, insert, expect = helpers.command, helpers.insert, helpers.expect
 | 
			
		||||
local feed_command = helpers.feed_command
 | 
			
		||||
local curwin = helpers.curwin
 | 
			
		||||
local curwin = helpers.meths.nvim_get_current_win
 | 
			
		||||
 | 
			
		||||
describe("'langmap'", function()
 | 
			
		||||
  before_each(function()
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ local command = helpers.command
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
 | 
			
		||||
describe('macros', function()
 | 
			
		||||
  before_each(function()
 | 
			
		||||
@@ -41,16 +40,19 @@ hello]]
 | 
			
		||||
    feed [[gg]]
 | 
			
		||||
 | 
			
		||||
    feed [[qqAFOO<esc>q]]
 | 
			
		||||
    eq({ 'helloFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOO', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[Q]]
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[G3Q]]
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'helloFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'helloFOOFOOFOO' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[ggV3jQ]]
 | 
			
		||||
    eq({ 'helloFOOFOOFOO', 'helloFOO', 'helloFOOFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq(
 | 
			
		||||
      { 'helloFOOFOOFOO', 'helloFOO', 'helloFOOFOOFOOFOO' },
 | 
			
		||||
      meths.nvim_buf_get_lines(0, 0, -1, false)
 | 
			
		||||
    )
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can be replayed with @', function()
 | 
			
		||||
@@ -60,16 +62,19 @@ hello]]
 | 
			
		||||
    feed [[gg]]
 | 
			
		||||
 | 
			
		||||
    feed [[qqAFOO<esc>q]]
 | 
			
		||||
    eq({ 'helloFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOO', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[Q]]
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[G3@@]]
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'helloFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOOFOO', 'hello', 'helloFOOFOOFOO' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[ggV2j@@]]
 | 
			
		||||
    eq({ 'helloFOOFOOFOO', 'helloFOO', 'helloFOOFOOFOOFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq(
 | 
			
		||||
      { 'helloFOOFOOFOO', 'helloFOO', 'helloFOOFOOFOOFOO' },
 | 
			
		||||
      meths.nvim_buf_get_lines(0, 0, -1, false)
 | 
			
		||||
    )
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can be replayed with @q and @w', function()
 | 
			
		||||
@@ -79,17 +84,17 @@ hello]]
 | 
			
		||||
    feed [[gg]]
 | 
			
		||||
 | 
			
		||||
    feed [[qqAFOO<esc>qu]]
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[qwA123<esc>qu]]
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[V3j@q]]
 | 
			
		||||
    eq({ 'helloFOO', 'helloFOO', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOO', 'helloFOO', 'helloFOO' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[gg]]
 | 
			
		||||
    feed [[Vj@w]]
 | 
			
		||||
    eq({ 'helloFOO123', 'helloFOO123', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOO123', 'helloFOO123', 'helloFOO' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can be replayed with @q and @w visual-block', function()
 | 
			
		||||
@@ -99,17 +104,17 @@ hello]]
 | 
			
		||||
    feed [[gg]]
 | 
			
		||||
 | 
			
		||||
    feed [[qqAFOO<esc>qu]]
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[qwA123<esc>qu]]
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'hello', 'hello', 'hello' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[<C-v>3j@q]]
 | 
			
		||||
    eq({ 'helloFOO', 'helloFOO', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOO', 'helloFOO', 'helloFOO' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    feed [[gg]]
 | 
			
		||||
    feed [[<C-v>j@w]]
 | 
			
		||||
    eq({ 'helloFOO123', 'helloFOO123', 'helloFOO' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'helloFOO123', 'helloFOO123', 'helloFOO' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
@@ -29,13 +28,13 @@ describe('named marks', function()
 | 
			
		||||
  it('can be set', function()
 | 
			
		||||
    command('edit ' .. file1)
 | 
			
		||||
    command('mark a')
 | 
			
		||||
    eq({ 1, 0 }, curbufmeths.get_mark('a'))
 | 
			
		||||
    eq({ 1, 0 }, meths.nvim_buf_get_mark(0, 'a'))
 | 
			
		||||
    feed('jmb')
 | 
			
		||||
    eq({ 2, 0 }, curbufmeths.get_mark('b'))
 | 
			
		||||
    eq({ 2, 0 }, meths.nvim_buf_get_mark(0, 'b'))
 | 
			
		||||
    feed('jmB')
 | 
			
		||||
    eq({ 3, 0 }, curbufmeths.get_mark('B'))
 | 
			
		||||
    eq({ 3, 0 }, meths.nvim_buf_get_mark(0, 'B'))
 | 
			
		||||
    command('4kc')
 | 
			
		||||
    eq({ 4, 0 }, curbufmeths.get_mark('c'))
 | 
			
		||||
    eq({ 4, 0 }, meths.nvim_buf_get_mark(0, 'c'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('errors when set out of range with :mark', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -184,11 +184,11 @@ describe('put command', function()
 | 
			
		||||
    return function(exception_table, after_redo)
 | 
			
		||||
      expect(expect_string)
 | 
			
		||||
 | 
			
		||||
      -- Have to use getcurpos() instead of curwinmeths.get_cursor() in
 | 
			
		||||
      -- Have to use getcurpos() instead of meths.nvim_win_get_cursor(0) in
 | 
			
		||||
      -- order to account for virtualedit.
 | 
			
		||||
      -- We always want the curswant element in getcurpos(), which is
 | 
			
		||||
      -- sometimes different to the column element in
 | 
			
		||||
      -- curwinmeths.get_cursor().
 | 
			
		||||
      -- meths.nvim_win_get_cursor(0).
 | 
			
		||||
      -- NOTE: The ".gp command leaves the cursor after the pasted text
 | 
			
		||||
      -- when running, but does not when the command is redone with the
 | 
			
		||||
      -- '.' command.
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,7 @@ local eval = helpers.eval
 | 
			
		||||
local exec = helpers.exec
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local curwin = helpers.curwin
 | 
			
		||||
local curwin = helpers.meths.nvim_get_current_win
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
 | 
			
		||||
describe('tabpage', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ local feed = helpers.feed
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
 | 
			
		||||
@@ -15,11 +14,11 @@ local cmdtest = function(cmd, prep, ret1)
 | 
			
		||||
  describe(':' .. cmd, function()
 | 
			
		||||
    before_each(function()
 | 
			
		||||
      clear()
 | 
			
		||||
      curbufmeths.set_lines(0, 1, true, { 'foo', 'bar', 'baz' })
 | 
			
		||||
      meths.nvim_buf_set_lines(0, 0, 1, true, { 'foo', 'bar', 'baz' })
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    local buffer_contents = function()
 | 
			
		||||
      return curbufmeths.get_lines(0, -1, false)
 | 
			
		||||
      return meths.nvim_buf_get_lines(0, 0, -1, false)
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it(cmd .. 's' .. prep .. ' the current line by default', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
local clear, nvim, source = helpers.clear, helpers.nvim, helpers.source
 | 
			
		||||
local clear, source = helpers.clear, helpers.source
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local eq, next_msg = helpers.eq, helpers.next_msg
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
@@ -13,8 +14,8 @@ describe('Vimscript dictionary notifications', function()
 | 
			
		||||
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
    channel = nvim('get_api_info')[1]
 | 
			
		||||
    nvim('set_var', 'channel', channel)
 | 
			
		||||
    channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
    meths.nvim_set_var('channel', channel)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  -- the same set of tests are applied to top-level dictionaries(g:, b:, w: and
 | 
			
		||||
@@ -59,7 +60,7 @@ describe('Vimscript dictionary notifications', function()
 | 
			
		||||
    local function verify_echo()
 | 
			
		||||
      -- helper to verify that no notifications are sent after certain change
 | 
			
		||||
      -- to a dict
 | 
			
		||||
      nvim('command', "call rpcnotify(g:channel, 'echo')")
 | 
			
		||||
      command("call rpcnotify(g:channel, 'echo')")
 | 
			
		||||
      eq({ 'notification', 'echo', {} }, next_msg())
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
@@ -134,7 +135,7 @@ describe('Vimscript dictionary notifications', function()
 | 
			
		||||
      it('is triggered by remove()', function()
 | 
			
		||||
        update('= "test"')
 | 
			
		||||
        verify_value({ new = 'test' })
 | 
			
		||||
        nvim('command', 'call remove(' .. dict_expr .. ', "watched")')
 | 
			
		||||
        command('call remove(' .. dict_expr .. ', "watched")')
 | 
			
		||||
        verify_value({ old = 'test' })
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
@@ -142,14 +143,14 @@ describe('Vimscript dictionary notifications', function()
 | 
			
		||||
        it('is triggered by remove() when updated with nvim_*_var', function()
 | 
			
		||||
          update_with_api('"test"')
 | 
			
		||||
          verify_value({ new = 'test' })
 | 
			
		||||
          nvim('command', 'call remove(' .. dict_expr .. ', "watched")')
 | 
			
		||||
          command('call remove(' .. dict_expr .. ', "watched")')
 | 
			
		||||
          verify_value({ old = 'test' })
 | 
			
		||||
        end)
 | 
			
		||||
 | 
			
		||||
        it('is triggered by remove() when updated with vim.g', function()
 | 
			
		||||
          update_with_vim_g('= "test"')
 | 
			
		||||
          verify_value({ new = 'test' })
 | 
			
		||||
          nvim('command', 'call remove(' .. dict_expr .. ', "watched")')
 | 
			
		||||
          command('call remove(' .. dict_expr .. ', "watched")')
 | 
			
		||||
          verify_value({ old = 'test' })
 | 
			
		||||
        end)
 | 
			
		||||
      end
 | 
			
		||||
@@ -157,7 +158,7 @@ describe('Vimscript dictionary notifications', function()
 | 
			
		||||
      it('is triggered by extend()', function()
 | 
			
		||||
        update('= "xtend"')
 | 
			
		||||
        verify_value({ new = 'xtend' })
 | 
			
		||||
        nvim('command', [[
 | 
			
		||||
        command([[
 | 
			
		||||
          call extend(]] .. dict_expr .. [[, {'watched': 'xtend2', 'watched2': 5, 'watched3': 'a'})
 | 
			
		||||
        ]])
 | 
			
		||||
        verify_value({ old = 'xtend', new = 'xtend2' })
 | 
			
		||||
@@ -293,17 +294,17 @@ describe('Vimscript dictionary notifications', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('invokes all callbacks when the key is changed', function()
 | 
			
		||||
      nvim('command', 'let g:key = "value"')
 | 
			
		||||
      command('let g:key = "value"')
 | 
			
		||||
      eq({ 'notification', '1', { 'key', { new = 'value' } } }, next_msg())
 | 
			
		||||
      eq({ 'notification', '2', { 'key', { new = 'value' } } }, next_msg())
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('only removes watchers that fully match dict, key and callback', function()
 | 
			
		||||
      nvim('command', 'let g:key = "value"')
 | 
			
		||||
      command('let g:key = "value"')
 | 
			
		||||
      eq({ 'notification', '1', { 'key', { new = 'value' } } }, next_msg())
 | 
			
		||||
      eq({ 'notification', '2', { 'key', { new = 'value' } } }, next_msg())
 | 
			
		||||
      nvim('command', 'call dictwatcherdel(g:, "key", "g:Watcher1")')
 | 
			
		||||
      nvim('command', 'let g:key = "v2"')
 | 
			
		||||
      command('call dictwatcherdel(g:, "key", "g:Watcher1")')
 | 
			
		||||
      command('let g:key = "v2"')
 | 
			
		||||
      eq({ 'notification', '2', { 'key', { old = 'value', new = 'v2' } } }, next_msg())
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ local command = helpers.command
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
 | 
			
		||||
@@ -14,7 +14,7 @@ describe(':ls', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('R, F for :terminal buffers', function()
 | 
			
		||||
    nvim('set_option_value', 'shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
 | 
			
		||||
 | 
			
		||||
    command('edit foo')
 | 
			
		||||
    command('set hidden')
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ local clear = helpers.clear
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local has_powershell = helpers.has_powershell
 | 
			
		||||
local matches = helpers.matches
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
 | 
			
		||||
describe(':make', function()
 | 
			
		||||
@@ -22,7 +22,7 @@ describe(':make', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('captures stderr & non zero exit code #14349', function()
 | 
			
		||||
      nvim('set_option_value', 'makeprg', testprg('shell-test') .. ' foo', {})
 | 
			
		||||
      meths.nvim_set_option_value('makeprg', testprg('shell-test') .. ' foo', {})
 | 
			
		||||
      local out = eval('execute("make")')
 | 
			
		||||
      -- Error message is captured in the file and printed in the footer
 | 
			
		||||
      matches(
 | 
			
		||||
@@ -32,7 +32,7 @@ describe(':make', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('captures stderr & zero exit code #14349', function()
 | 
			
		||||
      nvim('set_option_value', 'makeprg', testprg('shell-test'), {})
 | 
			
		||||
      meths.nvim_set_option_value('makeprg', testprg('shell-test'), {})
 | 
			
		||||
      local out = eval('execute("make")')
 | 
			
		||||
      -- Ensure there are no "shell returned X" messages between
 | 
			
		||||
      -- command and last line (indicating zero exit)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,5 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, command, nvim = helpers.clear, helpers.command, helpers.nvim
 | 
			
		||||
local clear, command = helpers.clear, helpers.command
 | 
			
		||||
local expect, feed = helpers.expect, helpers.feed
 | 
			
		||||
local eq, eval = helpers.eq, helpers.eval
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
@@ -42,12 +42,12 @@ describe(':emenu', function()
 | 
			
		||||
    feed('ithis is a sentence<esc>^yiwo<esc>')
 | 
			
		||||
 | 
			
		||||
    -- Invoke "Edit.Paste" in normal-mode.
 | 
			
		||||
    nvim('command', 'emenu Edit.Paste')
 | 
			
		||||
    command('emenu Edit.Paste')
 | 
			
		||||
 | 
			
		||||
    -- Invoke "Edit.Paste" and "Test.Test" in command-mode.
 | 
			
		||||
    feed(':')
 | 
			
		||||
    nvim('command', 'emenu Edit.Paste')
 | 
			
		||||
    nvim('command', 'emenu Test.Test')
 | 
			
		||||
    command('emenu Edit.Paste')
 | 
			
		||||
    command('emenu Test.Test')
 | 
			
		||||
 | 
			
		||||
    expect([[
 | 
			
		||||
        this is a sentence
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local expect_exit = helpers.expect_exit
 | 
			
		||||
local buf, eq, feed_command = helpers.curbufmeths, helpers.eq, helpers.feed_command
 | 
			
		||||
local meths, eq, feed_command = helpers.meths, helpers.eq, helpers.feed_command
 | 
			
		||||
local feed, poke_eventloop = helpers.feed, helpers.poke_eventloop
 | 
			
		||||
local ok = helpers.ok
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
@@ -42,7 +42,7 @@ describe(':oldfiles', function()
 | 
			
		||||
    feed_command('edit testfile2')
 | 
			
		||||
    feed_command('wshada')
 | 
			
		||||
    feed_command('rshada!')
 | 
			
		||||
    local oldfiles = helpers.meths.nvim_get_vvar('oldfiles')
 | 
			
		||||
    local oldfiles = meths.nvim_get_vvar('oldfiles')
 | 
			
		||||
    feed_command('oldfiles')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
                                                                                                          |
 | 
			
		||||
@@ -56,11 +56,11 @@ describe(':oldfiles', function()
 | 
			
		||||
 | 
			
		||||
  it('can be filtered with :filter', function()
 | 
			
		||||
    feed_command('edit file_one.txt')
 | 
			
		||||
    local file1 = buf.get_name()
 | 
			
		||||
    local file1 = meths.nvim_buf_get_name(0)
 | 
			
		||||
    feed_command('edit file_two.txt')
 | 
			
		||||
    local file2 = buf.get_name()
 | 
			
		||||
    local file2 = meths.nvim_buf_get_name(0)
 | 
			
		||||
    feed_command('edit another.txt')
 | 
			
		||||
    local another = buf.get_name()
 | 
			
		||||
    local another = meths.nvim_buf_get_name(0)
 | 
			
		||||
    feed_command('wshada')
 | 
			
		||||
    feed_command('rshada!')
 | 
			
		||||
 | 
			
		||||
@@ -95,9 +95,9 @@ describe(':browse oldfiles', function()
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    _clear()
 | 
			
		||||
    feed_command('edit testfile1')
 | 
			
		||||
    filename = buf.get_name()
 | 
			
		||||
    filename = meths.nvim_buf_get_name(0)
 | 
			
		||||
    feed_command('edit testfile2')
 | 
			
		||||
    filename2 = buf.get_name()
 | 
			
		||||
    filename2 = meths.nvim_buf_get_name(0)
 | 
			
		||||
    feed_command('wshada')
 | 
			
		||||
    poke_eventloop()
 | 
			
		||||
    _clear()
 | 
			
		||||
@@ -123,16 +123,16 @@ describe(':browse oldfiles', function()
 | 
			
		||||
 | 
			
		||||
  it('provides a prompt and edits the chosen file', function()
 | 
			
		||||
    feed('2<cr>')
 | 
			
		||||
    eq(oldfiles[2], buf.get_name())
 | 
			
		||||
    eq(oldfiles[2], meths.nvim_buf_get_name(0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('provides a prompt and does nothing on <cr>', function()
 | 
			
		||||
    feed('<cr>')
 | 
			
		||||
    eq('', buf.get_name())
 | 
			
		||||
    eq('', meths.nvim_buf_get_name(0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('provides a prompt and does nothing if choice is out-of-bounds', function()
 | 
			
		||||
    feed('3<cr>')
 | 
			
		||||
    eq('', buf.get_name())
 | 
			
		||||
    eq('', meths.nvim_buf_get_name(0))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,7 @@ local funcs = helpers.funcs
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local write_file = helpers.write_file
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
 | 
			
		||||
local file_base = 'Xtest-functional-ex_cmds-quickfix_commands'
 | 
			
		||||
@@ -79,7 +79,7 @@ for _, c in ipairs({ 'l', 'c' }) do
 | 
			
		||||
      -- Run cfile/lfile from a modified buffer
 | 
			
		||||
      command('set nohidden')
 | 
			
		||||
      command('enew!')
 | 
			
		||||
      curbufmeths.set_lines(1, 1, true, { 'Quickfix' })
 | 
			
		||||
      meths.nvim_buf_set_lines(0, 1, 1, true, { 'Quickfix' })
 | 
			
		||||
      eq(
 | 
			
		||||
        ('Vim(%s):E37: No write since last change (add ! to override)'):format(filecmd),
 | 
			
		||||
        exc_exec(('%s %s'):format(filecmd, file))
 | 
			
		||||
 
 | 
			
		||||
@@ -1,5 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local clear, nvim, eq, assert_alive = helpers.clear, helpers.nvim, helpers.eq, helpers.assert_alive
 | 
			
		||||
local clear, eq, assert_alive = helpers.clear, helpers.eq, helpers.assert_alive
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
 | 
			
		||||
describe('sign', function()
 | 
			
		||||
  before_each(clear)
 | 
			
		||||
@@ -7,24 +9,24 @@ describe('sign', function()
 | 
			
		||||
    describe('without specifying buffer', function()
 | 
			
		||||
      it('deletes the sign from all buffers', function()
 | 
			
		||||
        -- place a sign with id 34 to first buffer
 | 
			
		||||
        nvim('command', 'sign define Foo text=+ texthl=Delimiter linehl=Comment numhl=Number')
 | 
			
		||||
        local buf1 = nvim('eval', 'bufnr("%")')
 | 
			
		||||
        nvim('command', 'sign place 34 line=3 name=Foo buffer=' .. buf1)
 | 
			
		||||
        command('sign define Foo text=+ texthl=Delimiter linehl=Comment numhl=Number')
 | 
			
		||||
        local buf1 = meths.nvim_eval('bufnr("%")')
 | 
			
		||||
        command('sign place 34 line=3 name=Foo buffer=' .. buf1)
 | 
			
		||||
        -- create a second buffer and place the sign on it as well
 | 
			
		||||
        nvim('command', 'new')
 | 
			
		||||
        local buf2 = nvim('eval', 'bufnr("%")')
 | 
			
		||||
        nvim('command', 'sign place 34 line=3 name=Foo buffer=' .. buf2)
 | 
			
		||||
        command('new')
 | 
			
		||||
        local buf2 = meths.nvim_eval('bufnr("%")')
 | 
			
		||||
        command('sign place 34 line=3 name=Foo buffer=' .. buf2)
 | 
			
		||||
        -- now unplace without specifying a buffer
 | 
			
		||||
        nvim('command', 'sign unplace 34')
 | 
			
		||||
        eq('--- Signs ---\n', nvim('exec', 'sign place buffer=' .. buf1, true))
 | 
			
		||||
        eq('--- Signs ---\n', nvim('exec', 'sign place buffer=' .. buf2, true))
 | 
			
		||||
        command('sign unplace 34')
 | 
			
		||||
        eq('--- Signs ---\n', meths.nvim_exec('sign place buffer=' .. buf1, true))
 | 
			
		||||
        eq('--- Signs ---\n', meths.nvim_exec('sign place buffer=' .. buf2, true))
 | 
			
		||||
      end)
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('define {id}', function()
 | 
			
		||||
    it('does not leak memory when specifying multiple times the same argument', function()
 | 
			
		||||
      nvim('command', 'sign define Foo culhl=Normal culhl=Normal')
 | 
			
		||||
      command('sign define Foo culhl=Normal culhl=Normal')
 | 
			
		||||
      assert_alive()
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 
 | 
			
		||||
@@ -290,12 +290,6 @@ function module.nvim_prog_abs()
 | 
			
		||||
  end
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Executes an ex-command. Vimscript errors manifest as client (lua) errors, but
 | 
			
		||||
-- v:errmsg will not be updated.
 | 
			
		||||
function module.command(cmd)
 | 
			
		||||
  module.request('nvim_command', cmd)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Use for commands which expect nvim to quit.
 | 
			
		||||
-- The first argument can also be a timeout.
 | 
			
		||||
function module.expect_exit(fn_or_timeout, ...)
 | 
			
		||||
@@ -629,57 +623,17 @@ module.async_meths = module.create_callindex(module.nvim_async)
 | 
			
		||||
module.uimeths = module.create_callindex(ui)
 | 
			
		||||
 | 
			
		||||
local function create_api(request, call)
 | 
			
		||||
  local m = {}
 | 
			
		||||
  function m.nvim(method, ...)
 | 
			
		||||
  local function nvim(method, ...)
 | 
			
		||||
    if vim.startswith(method, 'nvim_') then
 | 
			
		||||
      return request(method, ...)
 | 
			
		||||
    end
 | 
			
		||||
    return request('nvim_' .. method, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  function m.buffer(method, ...)
 | 
			
		||||
    return request('nvim_buf_' .. method, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  function m.window(method, ...)
 | 
			
		||||
    return request('nvim_win_' .. method, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  function m.tabpage(method, ...)
 | 
			
		||||
    return request('nvim_tabpage_' .. method, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  function m.curbuf(method, ...)
 | 
			
		||||
    if not method then
 | 
			
		||||
      return m.nvim('get_current_buf')
 | 
			
		||||
    end
 | 
			
		||||
    return m.buffer(method, 0, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  function m.curwin(method, ...)
 | 
			
		||||
    if not method then
 | 
			
		||||
      return m.nvim('get_current_win')
 | 
			
		||||
    end
 | 
			
		||||
    return m.window(method, 0, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  function m.curtab(method, ...)
 | 
			
		||||
    if not method then
 | 
			
		||||
      return m.nvim('get_current_tabpage')
 | 
			
		||||
    end
 | 
			
		||||
    return m.tabpage(method, 0, ...)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  m.funcs = module.create_callindex(call)
 | 
			
		||||
  m.meths = module.create_callindex(m.nvim)
 | 
			
		||||
  m.bufmeths = module.create_callindex(m.buffer)
 | 
			
		||||
  m.winmeths = module.create_callindex(m.window)
 | 
			
		||||
  m.tabmeths = module.create_callindex(m.tabpage)
 | 
			
		||||
  m.curbufmeths = module.create_callindex(m.curbuf)
 | 
			
		||||
  m.curwinmeths = module.create_callindex(m.curwin)
 | 
			
		||||
  m.curtabmeths = module.create_callindex(m.curtab)
 | 
			
		||||
 | 
			
		||||
  return m
 | 
			
		||||
  return {
 | 
			
		||||
    funcs = module.create_callindex(call),
 | 
			
		||||
    meths = module.create_callindex(nvim),
 | 
			
		||||
  }
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
module.rpc = {
 | 
			
		||||
@@ -705,11 +659,16 @@ end
 | 
			
		||||
 | 
			
		||||
--- add for typing. The for loop after will overwrite this
 | 
			
		||||
module.meths = vim.api
 | 
			
		||||
module.funcs = vim.fn
 | 
			
		||||
 | 
			
		||||
for name, fn in pairs(module.rpc.api) do
 | 
			
		||||
  module[name] = fn
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
-- Executes an ex-command. Vimscript errors manifest as client (lua) errors, but
 | 
			
		||||
-- v:errmsg will not be updated.
 | 
			
		||||
module.command = module.meths.nvim_command
 | 
			
		||||
 | 
			
		||||
function module.poke_eventloop()
 | 
			
		||||
  -- Execute 'nvim_eval' (a deferred function) to
 | 
			
		||||
  -- force at least one main_loop iteration
 | 
			
		||||
@@ -723,7 +682,7 @@ end
 | 
			
		||||
---@see buf_lines()
 | 
			
		||||
function module.curbuf_contents()
 | 
			
		||||
  module.poke_eventloop() -- Before inspecting the buffer, do whatever.
 | 
			
		||||
  return table.concat(module.curbuf('get_lines', 0, -1, true), '\n')
 | 
			
		||||
  return table.concat(module.meths.nvim_buf_get_lines(0, 0, -1, true), '\n')
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
function module.expect(contents)
 | 
			
		||||
@@ -760,7 +719,7 @@ end
 | 
			
		||||
-- Asserts that buffer is loaded and visible in the current tabpage.
 | 
			
		||||
function module.assert_visible(bufnr, visible)
 | 
			
		||||
  assert(type(visible) == 'boolean')
 | 
			
		||||
  eq(visible, module.bufmeths.is_loaded(bufnr))
 | 
			
		||||
  eq(visible, module.meths.nvim_buf_is_loaded(bufnr))
 | 
			
		||||
  if visible then
 | 
			
		||||
    assert(
 | 
			
		||||
      -1 ~= module.funcs.bufwinnr(bufnr),
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,9 @@
 | 
			
		||||
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 meths = helpers.meths
 | 
			
		||||
local curbuf = helpers.meths.nvim_get_current_buf
 | 
			
		||||
local curwin = helpers.meths.nvim_get_current_win
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
local source, command = helpers.source, helpers.command
 | 
			
		||||
 | 
			
		||||
@@ -210,7 +211,7 @@ describe('au OptionSet', function()
 | 
			
		||||
 | 
			
		||||
      it('should trigger if the current buffer is different from the targeted buffer', function()
 | 
			
		||||
        local new_buffer = make_buffer()
 | 
			
		||||
        local new_bufnr = buf.get_number(new_buffer)
 | 
			
		||||
        local new_bufnr = meths.nvim_buf_get_number(new_buffer)
 | 
			
		||||
 | 
			
		||||
        command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
 | 
			
		||||
        expected_combination({
 | 
			
		||||
@@ -647,7 +648,7 @@ describe('au OptionSet', function()
 | 
			
		||||
        set_hook('buftype')
 | 
			
		||||
 | 
			
		||||
        local new_buffer = make_buffer()
 | 
			
		||||
        local new_bufnr = buf.get_number(new_buffer)
 | 
			
		||||
        local new_bufnr = meths.nvim_buf_get_number(new_buffer)
 | 
			
		||||
 | 
			
		||||
        command('call setbufvar(' .. new_bufnr .. ', "&buftype", "nofile")')
 | 
			
		||||
        expected_combination({
 | 
			
		||||
 
 | 
			
		||||
@@ -18,7 +18,6 @@ local command = helpers.command
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local write_file = helpers.write_file
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local remove_trace = helpers.remove_trace
 | 
			
		||||
 | 
			
		||||
before_each(clear)
 | 
			
		||||
@@ -26,23 +25,23 @@ before_each(clear)
 | 
			
		||||
describe(':lua command', function()
 | 
			
		||||
  it('works', function()
 | 
			
		||||
    eq('', exec_capture('lua vim.api.nvim_buf_set_lines(1, 1, 2, false, {"TEST"})'))
 | 
			
		||||
    eq({ '', 'TEST' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '', 'TEST' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
    source([[
 | 
			
		||||
      lua << EOF
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 1, 2, false, {"TSET"})
 | 
			
		||||
      EOF]])
 | 
			
		||||
    eq({ '', 'TSET' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '', 'TSET' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
    source([[
 | 
			
		||||
      lua << EOF
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 1, 2, false, {"SETT"})]])
 | 
			
		||||
    eq({ '', 'SETT' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '', 'SETT' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
    source([[
 | 
			
		||||
      lua << EOF
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 1, 2, false, {"ETTS"})
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 2, 3, false, {"TTSE"})
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 3, 4, false, {"STTE"})
 | 
			
		||||
      EOF]])
 | 
			
		||||
    eq({ '', 'ETTS', 'TTSE', 'STTE' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '', 'ETTS', 'TTSE', 'STTE' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
    matches(
 | 
			
		||||
      '.*Vim%(lua%):E15: Invalid expression: .*',
 | 
			
		||||
      pcall_err(
 | 
			
		||||
@@ -68,7 +67,7 @@ describe(':lua command', function()
 | 
			
		||||
      [[Vim(lua):E5108: Error executing lua [string ":lua"]:1: Invalid buffer id: -10]],
 | 
			
		||||
      remove_trace(exc_exec('lua vim.api.nvim_buf_set_lines(-10, 1, 1, false, {"TEST"})'))
 | 
			
		||||
    )
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
  end)
 | 
			
		||||
  it('works with NULL errors', function()
 | 
			
		||||
    eq([=[Vim(lua):E5108: Error executing lua [NULL]]=], exc_exec('lua error(nil)'))
 | 
			
		||||
@@ -76,13 +75,13 @@ describe(':lua command', function()
 | 
			
		||||
  it('accepts embedded NLs without heredoc', function()
 | 
			
		||||
    -- Such code is usually used for `:execute 'lua' {generated_string}`:
 | 
			
		||||
    -- heredocs do not work in this case.
 | 
			
		||||
    meths.nvim_command([[
 | 
			
		||||
    command([[
 | 
			
		||||
      lua
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 1, 2, false, {"ETTS"})
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 2, 3, false, {"TTSE"})
 | 
			
		||||
        vim.api.nvim_buf_set_lines(1, 3, 4, false, {"STTE"})
 | 
			
		||||
    ]])
 | 
			
		||||
    eq({ '', 'ETTS', 'TTSE', 'STTE' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '', 'ETTS', 'TTSE', 'STTE' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
  end)
 | 
			
		||||
  it('preserves global and not preserves local variables', function()
 | 
			
		||||
    eq('', exec_capture('lua gvar = 42'))
 | 
			
		||||
@@ -97,10 +96,10 @@ describe(':lua command', function()
 | 
			
		||||
      'Vim(lua):E5107: Error loading lua [string ":lua"]:0: unfinished string near \'<eof>\'',
 | 
			
		||||
      pcall_err(command, ('lua vim.api.nvim_buf_set_lines(1, 1, 2, false, {"%s})'):format(s))
 | 
			
		||||
    )
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    eq('', exec_capture(('lua vim.api.nvim_buf_set_lines(1, 1, 2, false, {"%s"})'):format(s)))
 | 
			
		||||
    eq({ '', s }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '', s }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can show multiline error messages', function()
 | 
			
		||||
@@ -197,31 +196,31 @@ end)
 | 
			
		||||
 | 
			
		||||
describe(':luado command', function()
 | 
			
		||||
  it('works', function()
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    eq('', exec_capture('luado lines = (lines or {}) lines[#lines + 1] = {linenr, line}'))
 | 
			
		||||
    eq({ 'ABC', 'def', 'gHi' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ 'ABC', 'def', 'gHi' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
    eq({ { 1, 'ABC' }, { 2, 'def' }, { 3, 'gHi' } }, funcs.luaeval('lines'))
 | 
			
		||||
 | 
			
		||||
    -- Automatic transformation of numbers
 | 
			
		||||
    eq('', exec_capture('luado return linenr'))
 | 
			
		||||
    eq({ '1', '2', '3' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '1', '2', '3' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    eq('', exec_capture('luado return ("<%02x>"):format(line:byte())'))
 | 
			
		||||
    eq({ '<31>', '<32>', '<33>' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '<31>', '<32>', '<33>' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
  end)
 | 
			
		||||
  it('stops processing lines when suddenly out of lines', function()
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    eq('', exec_capture('2,$luado runs = ((runs or 0) + 1) vim.api.nvim_command("%d")'))
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
    eq(1, funcs.luaeval('runs'))
 | 
			
		||||
  end)
 | 
			
		||||
  it('works correctly when changing lines out of range', function()
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    eq(
 | 
			
		||||
      'Vim(luado):E322: Line number out of range: 1 past the end',
 | 
			
		||||
      pcall_err(command, '2,$luado vim.api.nvim_command("%d") return linenr')
 | 
			
		||||
    )
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
  end)
 | 
			
		||||
  it('fails on errors', function()
 | 
			
		||||
    eq(
 | 
			
		||||
@@ -237,7 +236,7 @@ describe(':luado command', function()
 | 
			
		||||
    eq([=[Vim(luado):E5111: Error calling lua: [NULL]]=], exc_exec('luado error(nil)'))
 | 
			
		||||
  end)
 | 
			
		||||
  it('fails in sandbox when needed', function()
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'ABC', 'def', 'gHi' })
 | 
			
		||||
    eq(
 | 
			
		||||
      'Vim(luado):E48: Not allowed in sandbox: sandbox luado runs = (runs or 0) + 1',
 | 
			
		||||
      pcall_err(command, 'sandbox luado runs = (runs or 0) + 1')
 | 
			
		||||
@@ -251,10 +250,10 @@ describe(':luado command', function()
 | 
			
		||||
      'Vim(luado):E5109: Error loading lua: [string ":luado"]:0: unfinished string near \'<eof>\'',
 | 
			
		||||
      pcall_err(command, ('luado return "%s'):format(s))
 | 
			
		||||
    )
 | 
			
		||||
    eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
 | 
			
		||||
    eq('', exec_capture(('luado return "%s"'):format(s)))
 | 
			
		||||
    eq({ s }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
    eq({ s }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
@@ -275,7 +274,7 @@ describe(':luafile', function()
 | 
			
		||||
    ]]
 | 
			
		||||
    )
 | 
			
		||||
    eq('', exec_capture('luafile ' .. fname))
 | 
			
		||||
    eq({ '', 'ETTS', 'TTSE', 'STTE' }, curbufmeths.get_lines(0, 100, false))
 | 
			
		||||
    eq({ '', 'ETTS', 'TTSE', 'STTE' }, meths.nvim_buf_get_lines(0, 0, 100, false))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('correctly errors out', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -5,8 +5,8 @@ local command = helpers.command
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local matches = helpers.matches
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
 | 
			
		||||
describe('vim.diagnostic', function()
 | 
			
		||||
@@ -1563,8 +1563,8 @@ describe('vim.diagnostic', function()
 | 
			
		||||
 | 
			
		||||
    it('can perform updates after insert_leave', function()
 | 
			
		||||
      exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
 | 
			
		||||
      nvim('input', 'o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      -- Save the diagnostics
 | 
			
		||||
      exec_lua [[
 | 
			
		||||
@@ -1577,15 +1577,15 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      ]]
 | 
			
		||||
 | 
			
		||||
      -- No diagnostics displayed yet.
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
        exec_lua [[return count_diagnostics(diagnostic_bufnr, vim.diagnostic.severity.ERROR, diagnostic_ns)]]
 | 
			
		||||
      )
 | 
			
		||||
      eq(0, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
 | 
			
		||||
 | 
			
		||||
      nvim('input', '<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
@@ -1596,8 +1596,8 @@ describe('vim.diagnostic', function()
 | 
			
		||||
 | 
			
		||||
    it('does not perform updates when not needed', function()
 | 
			
		||||
      exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
 | 
			
		||||
      nvim('input', 'o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      -- Save the diagnostics
 | 
			
		||||
      exec_lua [[
 | 
			
		||||
@@ -1619,7 +1619,7 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      ]]
 | 
			
		||||
 | 
			
		||||
      -- No diagnostics displayed yet.
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
        exec_lua [[return count_diagnostics(diagnostic_bufnr, vim.diagnostic.severity.ERROR, diagnostic_ns)]]
 | 
			
		||||
@@ -1627,8 +1627,8 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      eq(0, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
 | 
			
		||||
      eq(0, exec_lua [[return DisplayCount]])
 | 
			
		||||
 | 
			
		||||
      nvim('input', '<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
@@ -1638,11 +1638,11 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      eq(1, exec_lua [[return DisplayCount]])
 | 
			
		||||
 | 
			
		||||
      -- Go in and out of insert mode one more time.
 | 
			
		||||
      nvim('input', 'o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      nvim('input', '<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      -- Should not have set the virtual text again.
 | 
			
		||||
      eq(1, exec_lua [[return DisplayCount]])
 | 
			
		||||
@@ -1650,8 +1650,8 @@ describe('vim.diagnostic', function()
 | 
			
		||||
 | 
			
		||||
    it('never sets virtual text, in combination with insert leave', function()
 | 
			
		||||
      exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
 | 
			
		||||
      nvim('input', 'o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      -- Save the diagnostics
 | 
			
		||||
      exec_lua [[
 | 
			
		||||
@@ -1674,7 +1674,7 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      ]]
 | 
			
		||||
 | 
			
		||||
      -- No diagnostics displayed yet.
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
        exec_lua [[return count_diagnostics(diagnostic_bufnr, vim.diagnostic.severity.ERROR, diagnostic_ns)]]
 | 
			
		||||
@@ -1682,8 +1682,8 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      eq(0, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
 | 
			
		||||
      eq(0, exec_lua [[return DisplayCount]])
 | 
			
		||||
 | 
			
		||||
      nvim('input', '<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
@@ -1693,11 +1693,11 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      eq(0, exec_lua [[return DisplayCount]])
 | 
			
		||||
 | 
			
		||||
      -- Go in and out of insert mode one more time.
 | 
			
		||||
      nvim('input', 'o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      nvim('input', '<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      -- Should not have set the virtual text still.
 | 
			
		||||
      eq(0, exec_lua [[return DisplayCount]])
 | 
			
		||||
@@ -1705,8 +1705,8 @@ describe('vim.diagnostic', function()
 | 
			
		||||
 | 
			
		||||
    it('can perform updates while in insert mode, if desired', function()
 | 
			
		||||
      exec_lua [[vim.api.nvim_set_current_buf(diagnostic_bufnr)]]
 | 
			
		||||
      nvim('input', 'o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('o')
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      -- Save the diagnostics
 | 
			
		||||
      exec_lua [[
 | 
			
		||||
@@ -1720,15 +1720,15 @@ describe('vim.diagnostic', function()
 | 
			
		||||
      ]]
 | 
			
		||||
 | 
			
		||||
      -- Diagnostics are displayed, because the user wanted them that way!
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      eq({ mode = 'i', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
        exec_lua [[return count_diagnostics(diagnostic_bufnr, vim.diagnostic.severity.ERROR, diagnostic_ns)]]
 | 
			
		||||
      )
 | 
			
		||||
      eq(2, exec_lua [[return count_extmarks(diagnostic_bufnr, diagnostic_ns)]])
 | 
			
		||||
 | 
			
		||||
      nvim('input', '<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
      meths.nvim_input('<esc>')
 | 
			
		||||
      eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
 | 
			
		||||
      eq(
 | 
			
		||||
        1,
 | 
			
		||||
 
 | 
			
		||||
@@ -341,7 +341,7 @@ describe('os.getenv', function()
 | 
			
		||||
  end)
 | 
			
		||||
  it('returns env var set by let', function()
 | 
			
		||||
    local value = 'foo'
 | 
			
		||||
    meths.nvim_command('let $XTEST_1 = "' .. value .. '"')
 | 
			
		||||
    command('let $XTEST_1 = "' .. value .. '"')
 | 
			
		||||
    eq(value, funcs.luaeval('os.getenv("XTEST_1")'))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
@@ -221,9 +221,9 @@ describe('startup defaults', function()
 | 
			
		||||
    eq(meths.nvim_get_option_value('runtimepath', {}), meths.nvim_get_option_value('packpath', {}))
 | 
			
		||||
 | 
			
		||||
    -- Does not follow modifications to runtimepath.
 | 
			
		||||
    meths.nvim_command('set runtimepath+=foo')
 | 
			
		||||
    command('set runtimepath+=foo')
 | 
			
		||||
    neq(meths.nvim_get_option_value('runtimepath', {}), meths.nvim_get_option_value('packpath', {}))
 | 
			
		||||
    meths.nvim_command('set packpath+=foo')
 | 
			
		||||
    command('set packpath+=foo')
 | 
			
		||||
    eq(meths.nvim_get_option_value('runtimepath', {}), meths.nvim_get_option_value('packpath', {}))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -430,11 +430,11 @@ describe('XDG defaults', function()
 | 
			
		||||
        ),
 | 
			
		||||
        (meths.nvim_get_option_value('runtimepath', {})):gsub('\\', '/')
 | 
			
		||||
      )
 | 
			
		||||
      meths.nvim_command('set runtimepath&')
 | 
			
		||||
      meths.nvim_command('set backupdir&')
 | 
			
		||||
      meths.nvim_command('set directory&')
 | 
			
		||||
      meths.nvim_command('set undodir&')
 | 
			
		||||
      meths.nvim_command('set viewdir&')
 | 
			
		||||
      command('set runtimepath&')
 | 
			
		||||
      command('set backupdir&')
 | 
			
		||||
      command('set directory&')
 | 
			
		||||
      command('set undodir&')
 | 
			
		||||
      command('set viewdir&')
 | 
			
		||||
      eq(
 | 
			
		||||
        (
 | 
			
		||||
          (
 | 
			
		||||
@@ -573,11 +573,11 @@ describe('XDG defaults', function()
 | 
			
		||||
        ),
 | 
			
		||||
        (meths.nvim_get_option_value('runtimepath', {})):gsub('\\', '/')
 | 
			
		||||
      )
 | 
			
		||||
      meths.nvim_command('set runtimepath&')
 | 
			
		||||
      meths.nvim_command('set backupdir&')
 | 
			
		||||
      meths.nvim_command('set directory&')
 | 
			
		||||
      meths.nvim_command('set undodir&')
 | 
			
		||||
      meths.nvim_command('set viewdir&')
 | 
			
		||||
      command('set runtimepath&')
 | 
			
		||||
      command('set backupdir&')
 | 
			
		||||
      command('set directory&')
 | 
			
		||||
      command('set undodir&')
 | 
			
		||||
      command('set viewdir&')
 | 
			
		||||
      eq(
 | 
			
		||||
        (
 | 
			
		||||
          (
 | 
			
		||||
@@ -617,7 +617,7 @@ describe('XDG defaults', function()
 | 
			
		||||
        ('$XDG_CONFIG_HOME/' .. state_dir .. '/view//'),
 | 
			
		||||
        meths.nvim_get_option_value('viewdir', {}):gsub('\\', '/')
 | 
			
		||||
      )
 | 
			
		||||
      meths.nvim_command('set all&')
 | 
			
		||||
      command('set all&')
 | 
			
		||||
      eq(
 | 
			
		||||
        (
 | 
			
		||||
          '$XDG_DATA_HOME/nvim'
 | 
			
		||||
@@ -745,11 +745,11 @@ describe('XDG defaults', function()
 | 
			
		||||
        ),
 | 
			
		||||
        meths.nvim_get_option_value('runtimepath', {})
 | 
			
		||||
      )
 | 
			
		||||
      meths.nvim_command('set runtimepath&')
 | 
			
		||||
      meths.nvim_command('set backupdir&')
 | 
			
		||||
      meths.nvim_command('set directory&')
 | 
			
		||||
      meths.nvim_command('set undodir&')
 | 
			
		||||
      meths.nvim_command('set viewdir&')
 | 
			
		||||
      command('set runtimepath&')
 | 
			
		||||
      command('set backupdir&')
 | 
			
		||||
      command('set directory&')
 | 
			
		||||
      command('set undodir&')
 | 
			
		||||
      command('set viewdir&')
 | 
			
		||||
      eq(
 | 
			
		||||
        (
 | 
			
		||||
          '\\, \\, \\,'
 | 
			
		||||
 
 | 
			
		||||
@@ -1,16 +1,14 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local eq, meths, nvim_eval, nvim_command, nvim, exc_exec, funcs, nvim_feed, curbuf =
 | 
			
		||||
local eq, meths, nvim_eval, nvim_command, exc_exec, funcs, nvim_feed =
 | 
			
		||||
  helpers.eq,
 | 
			
		||||
  helpers.meths,
 | 
			
		||||
  helpers.eval,
 | 
			
		||||
  helpers.command,
 | 
			
		||||
  helpers.nvim,
 | 
			
		||||
  helpers.exc_exec,
 | 
			
		||||
  helpers.funcs,
 | 
			
		||||
  helpers.feed,
 | 
			
		||||
  helpers.curbuf
 | 
			
		||||
  helpers.feed
 | 
			
		||||
local neq = helpers.neq
 | 
			
		||||
local read_file = helpers.read_file
 | 
			
		||||
 | 
			
		||||
@@ -1581,7 +1579,7 @@ describe('autoload/shada.vim', function()
 | 
			
		||||
 | 
			
		||||
  describe('function shada#strings_to_sd', function()
 | 
			
		||||
    local strings2sd_eq = function(expected, input)
 | 
			
		||||
      nvim('set_var', '__input', input)
 | 
			
		||||
      meths.nvim_set_var('__input', input)
 | 
			
		||||
      nvim_command(
 | 
			
		||||
        'let g:__actual = map(shada#strings_to_sd(g:__input), '
 | 
			
		||||
          .. '"filter(v:val, \\"v:key[0] isnot# \'_\' '
 | 
			
		||||
@@ -1589,7 +1587,7 @@ describe('autoload/shada.vim', function()
 | 
			
		||||
      )
 | 
			
		||||
      -- print()
 | 
			
		||||
      if type(expected) == 'table' then
 | 
			
		||||
        nvim('set_var', '__expected', expected)
 | 
			
		||||
        meths.nvim_set_var('__expected', expected)
 | 
			
		||||
        nvim_command('let g:__expected = ModifyVal(g:__expected)')
 | 
			
		||||
        expected = 'g:__expected'
 | 
			
		||||
        -- print(nvim_eval('msgpack#string(g:__expected)'))
 | 
			
		||||
@@ -2534,7 +2532,7 @@ describe('autoload/shada.vim', function()
 | 
			
		||||
    end
 | 
			
		||||
 | 
			
		||||
    it('works', function()
 | 
			
		||||
      local version = nvim('get_vvar', 'version')
 | 
			
		||||
      local version = meths.nvim_get_vvar('version')
 | 
			
		||||
      getbstrings_eq({
 | 
			
		||||
        {
 | 
			
		||||
          timestamp = 'current',
 | 
			
		||||
@@ -2560,7 +2558,7 @@ describe('autoload/shada.vim', function()
 | 
			
		||||
        '  % Key______  Value',
 | 
			
		||||
        '  + generator  "test"',
 | 
			
		||||
      })
 | 
			
		||||
      nvim('set_var', 'shada#add_own_header', 1)
 | 
			
		||||
      meths.nvim_set_var('shada#add_own_header', 1)
 | 
			
		||||
      getbstrings_eq({
 | 
			
		||||
        {
 | 
			
		||||
          timestamp = 'current',
 | 
			
		||||
@@ -2586,14 +2584,14 @@ describe('autoload/shada.vim', function()
 | 
			
		||||
        '  % Key______  Value',
 | 
			
		||||
        '  + generator  "test"',
 | 
			
		||||
      })
 | 
			
		||||
      nvim('set_var', 'shada#add_own_header', 0)
 | 
			
		||||
      meths.nvim_set_var('shada#add_own_header', 0)
 | 
			
		||||
      getbstrings_eq({}, {})
 | 
			
		||||
      getbstrings_eq({ { timestamp = 0, type = 1, value = { generator = 'test' } } }, {
 | 
			
		||||
        'Header with timestamp ' .. epoch .. ':',
 | 
			
		||||
        '  % Key______  Value',
 | 
			
		||||
        '  + generator  "test"',
 | 
			
		||||
      })
 | 
			
		||||
      nvim('set_var', 'shada#keep_old_header', 0)
 | 
			
		||||
      meths.nvim_set_var('shada#keep_old_header', 0)
 | 
			
		||||
      getbstrings_eq({}, {
 | 
			
		||||
        'Header with timestamp ' .. epoch .. ':',
 | 
			
		||||
        '  % Key______  Value',
 | 
			
		||||
@@ -2661,8 +2659,8 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
      '  - contents      "ab"',
 | 
			
		||||
      '  -               "a"',
 | 
			
		||||
    }, nvim_eval('getline(1, "$")'))
 | 
			
		||||
    eq(false, nvim('get_option_value', 'modified', {}))
 | 
			
		||||
    eq('shada', nvim('get_option_value', 'filetype', {}))
 | 
			
		||||
    eq(false, meths.nvim_get_option_value('modified', {}))
 | 
			
		||||
    eq('shada', meths.nvim_get_option_value('filetype', {}))
 | 
			
		||||
    nvim_command('edit ' .. fname_tmp)
 | 
			
		||||
    eq({
 | 
			
		||||
      'History entry with timestamp ' .. epoch .. ':',
 | 
			
		||||
@@ -2671,8 +2669,8 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
      '  - contents      "ab"',
 | 
			
		||||
      '  -               "b"',
 | 
			
		||||
    }, nvim_eval('getline(1, "$")'))
 | 
			
		||||
    eq(false, nvim('get_option_value', 'modified', {}))
 | 
			
		||||
    eq('shada', nvim('get_option_value', 'filetype', {}))
 | 
			
		||||
    eq(false, meths.nvim_get_option_value('modified', {}))
 | 
			
		||||
    eq('shada', meths.nvim_get_option_value('filetype', {}))
 | 
			
		||||
    eq('++opt not supported', exc_exec('edit ++enc=latin1 ' .. fname))
 | 
			
		||||
    neq({
 | 
			
		||||
      'History entry with timestamp ' .. epoch .. ':',
 | 
			
		||||
@@ -2681,7 +2679,7 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
      '  - contents      "ab"',
 | 
			
		||||
      '  -               "a"',
 | 
			
		||||
    }, nvim_eval('getline(1, "$")'))
 | 
			
		||||
    neq(true, nvim('get_option_value', 'modified', {}))
 | 
			
		||||
    neq(true, meths.nvim_get_option_value('modified', {}))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('event FileReadCmd', function()
 | 
			
		||||
@@ -2697,8 +2695,8 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
      '  - contents      "ab"',
 | 
			
		||||
      '  -               "a"',
 | 
			
		||||
    }, nvim_eval('getline(1, "$")'))
 | 
			
		||||
    eq(true, nvim('get_option_value', 'modified', {}))
 | 
			
		||||
    neq('shada', nvim('get_option_value', 'filetype', {}))
 | 
			
		||||
    eq(true, meths.nvim_get_option_value('modified', {}))
 | 
			
		||||
    neq('shada', meths.nvim_get_option_value('filetype', {}))
 | 
			
		||||
    nvim_command('1,$read ' .. fname_tmp)
 | 
			
		||||
    eq({
 | 
			
		||||
      '',
 | 
			
		||||
@@ -2713,9 +2711,9 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
      '  - contents      "ab"',
 | 
			
		||||
      '  -               "b"',
 | 
			
		||||
    }, nvim_eval('getline(1, "$")'))
 | 
			
		||||
    eq(true, nvim('get_option_value', 'modified', {}))
 | 
			
		||||
    neq('shada', nvim('get_option_value', 'filetype', {}))
 | 
			
		||||
    nvim('set_option_value', 'modified', false, {})
 | 
			
		||||
    eq(true, meths.nvim_get_option_value('modified', {}))
 | 
			
		||||
    neq('shada', meths.nvim_get_option_value('filetype', {}))
 | 
			
		||||
    meths.nvim_set_option_value('modified', false, {})
 | 
			
		||||
    eq('++opt not supported', exc_exec('$read ++enc=latin1 ' .. fname))
 | 
			
		||||
    eq({
 | 
			
		||||
      '',
 | 
			
		||||
@@ -2730,13 +2728,13 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
      '  - contents      "ab"',
 | 
			
		||||
      '  -               "b"',
 | 
			
		||||
    }, nvim_eval('getline(1, "$")'))
 | 
			
		||||
    neq(true, nvim('get_option_value', 'modified', {}))
 | 
			
		||||
    neq(true, meths.nvim_get_option_value('modified', {}))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('event BufWriteCmd', function()
 | 
			
		||||
    reset()
 | 
			
		||||
    nvim('set_var', 'shada#add_own_header', 0)
 | 
			
		||||
    curbuf('set_lines', 0, 1, true, {
 | 
			
		||||
    meths.nvim_set_var('shada#add_own_header', 0)
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, true, {
 | 
			
		||||
      'Jump with timestamp ' .. epoch .. ':',
 | 
			
		||||
      '  % Key________  Description  Value',
 | 
			
		||||
      "  + n            name         'A'",
 | 
			
		||||
@@ -2796,8 +2794,8 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
 | 
			
		||||
  it('event FileWriteCmd', function()
 | 
			
		||||
    reset()
 | 
			
		||||
    nvim('set_var', 'shada#add_own_header', 0)
 | 
			
		||||
    curbuf('set_lines', 0, 1, true, {
 | 
			
		||||
    meths.nvim_set_var('shada#add_own_header', 0)
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, true, {
 | 
			
		||||
      'Jump with timestamp ' .. epoch .. ':',
 | 
			
		||||
      '  % Key________  Description  Value',
 | 
			
		||||
      "  + n            name         'A'",
 | 
			
		||||
@@ -2840,8 +2838,8 @@ describe('plugin/shada.vim', function()
 | 
			
		||||
 | 
			
		||||
  it('event FileAppendCmd', function()
 | 
			
		||||
    reset()
 | 
			
		||||
    nvim('set_var', 'shada#add_own_header', 0)
 | 
			
		||||
    curbuf('set_lines', 0, 1, true, {
 | 
			
		||||
    meths.nvim_set_var('shada#add_own_header', 0)
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, true, {
 | 
			
		||||
      'Jump with timestamp ' .. epoch .. ':',
 | 
			
		||||
      '  % Key________  Description  Value',
 | 
			
		||||
      "  + n            name         'A'",
 | 
			
		||||
@@ -3017,10 +3015,10 @@ describe('ftplugin/shada.vim', function()
 | 
			
		||||
  it('sets options correctly', function()
 | 
			
		||||
    nvim_command('filetype plugin indent on')
 | 
			
		||||
    nvim_command('setlocal filetype=shada')
 | 
			
		||||
    eq(true, nvim('get_option_value', 'expandtab', {}))
 | 
			
		||||
    eq(2, nvim('get_option_value', 'tabstop', {}))
 | 
			
		||||
    eq(2, nvim('get_option_value', 'softtabstop', {}))
 | 
			
		||||
    eq(2, nvim('get_option_value', 'shiftwidth', {}))
 | 
			
		||||
    eq(true, meths.nvim_get_option_value('expandtab', {}))
 | 
			
		||||
    eq(2, meths.nvim_get_option_value('tabstop', {}))
 | 
			
		||||
    eq(2, meths.nvim_get_option_value('softtabstop', {}))
 | 
			
		||||
    eq(2, meths.nvim_get_option_value('shiftwidth', {}))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('sets indentkeys correctly', function()
 | 
			
		||||
@@ -3028,17 +3026,17 @@ describe('ftplugin/shada.vim', function()
 | 
			
		||||
    nvim_command('setlocal filetype=shada')
 | 
			
		||||
    funcs.setline(1, '  Replacement with timestamp ' .. epoch)
 | 
			
		||||
    nvim_feed('ggA:\027')
 | 
			
		||||
    eq('Replacement with timestamp ' .. epoch .. ':', curbuf('get_lines', 0, 1, true)[1])
 | 
			
		||||
    eq('Replacement with timestamp ' .. epoch .. ':', meths.nvim_buf_get_lines(0, 0, 1, true)[1])
 | 
			
		||||
    nvim_feed('o-\027')
 | 
			
		||||
    eq({ '  -' }, curbuf('get_lines', 1, 2, true))
 | 
			
		||||
    eq({ '  -' }, meths.nvim_buf_get_lines(0, 1, 2, true))
 | 
			
		||||
    nvim_feed('ggO+\027')
 | 
			
		||||
    eq({ '+' }, curbuf('get_lines', 0, 1, true))
 | 
			
		||||
    eq({ '+' }, meths.nvim_buf_get_lines(0, 0, 1, true))
 | 
			
		||||
    nvim_feed('GO*\027')
 | 
			
		||||
    eq({ '  *' }, curbuf('get_lines', 2, 3, true))
 | 
			
		||||
    eq({ '  *' }, meths.nvim_buf_get_lines(0, 2, 3, true))
 | 
			
		||||
    nvim_feed('ggO  /\027')
 | 
			
		||||
    eq({ '  /' }, curbuf('get_lines', 0, 1, true))
 | 
			
		||||
    eq({ '  /' }, meths.nvim_buf_get_lines(0, 0, 1, true))
 | 
			
		||||
    nvim_feed('ggOx\027')
 | 
			
		||||
    eq({ 'x' }, curbuf('get_lines', 0, 1, true))
 | 
			
		||||
    eq({ 'x' }, meths.nvim_buf_get_lines(0, 0, 1, true))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
@@ -3063,7 +3061,7 @@ describe('syntax/shada.vim', function()
 | 
			
		||||
    }
 | 
			
		||||
    screen:attach()
 | 
			
		||||
 | 
			
		||||
    curbuf('set_lines', 0, 1, true, {
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, true, {
 | 
			
		||||
      'Header with timestamp ' .. epoch .. ':',
 | 
			
		||||
      '  % Key  Value',
 | 
			
		||||
      '  + t    "test"',
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local eval, command, nvim = helpers.eval, helpers.command, helpers.nvim
 | 
			
		||||
local eval, command = helpers.eval, helpers.command
 | 
			
		||||
local eq, run, stop = helpers.eq, helpers.run, helpers.stop
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
 | 
			
		||||
local function get_prefix(sync)
 | 
			
		||||
  if sync then
 | 
			
		||||
@@ -361,7 +362,7 @@ local function function_specs_for(fn, sync, first_arg_factory, init)
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function channel()
 | 
			
		||||
  return nvim('get_api_info')[1]
 | 
			
		||||
  return meths.nvim_get_api_info()[1]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
local function host()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,6 @@
 | 
			
		||||
-- shada buffer list saving/reading support
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local nvim_command, funcs, eq, curbufmeths, meths =
 | 
			
		||||
  helpers.command, helpers.funcs, helpers.eq, helpers.curbufmeths, helpers.meths
 | 
			
		||||
local nvim_command, funcs, eq, meths = helpers.command, helpers.funcs, helpers.eq, helpers.meths
 | 
			
		||||
local expect_exit = helpers.expect_exit
 | 
			
		||||
 | 
			
		||||
local shada_helpers = require('test.functional.shada.helpers')
 | 
			
		||||
@@ -70,9 +69,9 @@ describe('shada support code', function()
 | 
			
		||||
 | 
			
		||||
  it('does not dump unnamed buffers', function()
 | 
			
		||||
    reset('set shada+=% hidden')
 | 
			
		||||
    curbufmeths.set_lines(0, 1, true, { 'foo' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, true, { 'foo' })
 | 
			
		||||
    nvim_command('enew')
 | 
			
		||||
    curbufmeths.set_lines(0, 1, true, { 'bar' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, true, { 'bar' })
 | 
			
		||||
    eq(2, funcs.bufnr('$'))
 | 
			
		||||
    expect_exit(nvim_command, 'qall!')
 | 
			
		||||
    reset('set shada+=% hidden')
 | 
			
		||||
 
 | 
			
		||||
@@ -1,12 +1,6 @@
 | 
			
		||||
-- ShaDa marks saving/reading support
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local meths, curwinmeths, curbufmeths, nvim_command, funcs, eq =
 | 
			
		||||
  helpers.meths,
 | 
			
		||||
  helpers.curwinmeths,
 | 
			
		||||
  helpers.curbufmeths,
 | 
			
		||||
  helpers.command,
 | 
			
		||||
  helpers.funcs,
 | 
			
		||||
  helpers.eq
 | 
			
		||||
local meths, nvim_command, funcs, eq = helpers.meths, helpers.command, helpers.funcs, helpers.eq
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local exc_exec, exec_capture = helpers.exc_exec, helpers.exec_capture
 | 
			
		||||
local expect_exit = helpers.expect_exit
 | 
			
		||||
@@ -15,7 +9,7 @@ local shada_helpers = require('test.functional.shada.helpers')
 | 
			
		||||
local reset, clear = shada_helpers.reset, shada_helpers.clear
 | 
			
		||||
 | 
			
		||||
local nvim_current_line = function()
 | 
			
		||||
  return curwinmeths.get_cursor()[1]
 | 
			
		||||
  return meths.nvim_win_get_cursor(0)[1]
 | 
			
		||||
end
 | 
			
		||||
 | 
			
		||||
describe('ShaDa support code', function()
 | 
			
		||||
@@ -49,7 +43,7 @@ describe('ShaDa support code', function()
 | 
			
		||||
    reset()
 | 
			
		||||
    nvim_command('rshada')
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq(testfilename, funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq(testfilename, funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(1, nvim_current_line())
 | 
			
		||||
    nvim_command('normal! `B')
 | 
			
		||||
    eq(2, nvim_current_line())
 | 
			
		||||
@@ -76,7 +70,7 @@ describe('ShaDa support code', function()
 | 
			
		||||
    reset("set shada='0,f0")
 | 
			
		||||
    nvim_command('language C')
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq(testfilename, funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq(testfilename, funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(1, nvim_current_line())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -89,7 +83,7 @@ describe('ShaDa support code', function()
 | 
			
		||||
    reset()
 | 
			
		||||
    nvim_command('edit ' .. testfilename)
 | 
			
		||||
    nvim_command('normal! `a')
 | 
			
		||||
    eq(testfilename, funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq(testfilename, funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(1, nvim_current_line())
 | 
			
		||||
    nvim_command('normal! `b')
 | 
			
		||||
    eq(2, nvim_current_line())
 | 
			
		||||
@@ -119,9 +113,9 @@ describe('ShaDa support code', function()
 | 
			
		||||
 | 
			
		||||
  it('is able to populate v:oldfiles', function()
 | 
			
		||||
    nvim_command('edit ' .. testfilename)
 | 
			
		||||
    local tf_full = curbufmeths.get_name()
 | 
			
		||||
    local tf_full = meths.nvim_buf_get_name(0)
 | 
			
		||||
    nvim_command('edit ' .. testfilename_2)
 | 
			
		||||
    local tf_full_2 = curbufmeths.get_name()
 | 
			
		||||
    local tf_full_2 = meths.nvim_buf_get_name(0)
 | 
			
		||||
    expect_exit(nvim_command, 'qall')
 | 
			
		||||
    reset()
 | 
			
		||||
    local oldfiles = meths.nvim_get_vvar('oldfiles')
 | 
			
		||||
@@ -166,7 +160,7 @@ describe('ShaDa support code', function()
 | 
			
		||||
    nvim_command('rshada')
 | 
			
		||||
    nvim_command('normal! \15') -- <C-o>
 | 
			
		||||
    eq(testfilename_2, funcs.bufname('%'))
 | 
			
		||||
    eq({ 2, 0 }, curwinmeths.get_cursor())
 | 
			
		||||
    eq({ 2, 0 }, meths.nvim_win_get_cursor(0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('is able to dump and restore jump list with different times (slow!)', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,8 @@
 | 
			
		||||
-- ShaDa merging data support
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local nvim_command, funcs, curbufmeths, eq =
 | 
			
		||||
  helpers.command, helpers.funcs, helpers.curbufmeths, helpers.eq
 | 
			
		||||
local nvim_command, funcs, eq = helpers.command, helpers.funcs, helpers.eq
 | 
			
		||||
local exc_exec, exec_capture = helpers.exc_exec, helpers.exec_capture
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
 | 
			
		||||
local shada_helpers = require('test.functional.shada.helpers')
 | 
			
		||||
local reset, clear, get_shada_rw =
 | 
			
		||||
@@ -492,14 +492,14 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    wshada('\007\000\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can merge with file with mark 9 as the only numeric mark', function()
 | 
			
		||||
    wshada('\007\001\014\130\161f\196\006' .. mock_file_path .. '-\161n9')
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    nvim_command('normal! `9oabc')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(0, exc_exec('wshada ' .. shada_fname))
 | 
			
		||||
    local found = {}
 | 
			
		||||
    for _, v in ipairs(read_shada_file(shada_fname)) do
 | 
			
		||||
@@ -632,7 +632,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    wshada('\007\000\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    eq(0, exc_exec(sdrcmd(true)))
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('?', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('?', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('uses last A mark with eq timestamp from instance when reading', function()
 | 
			
		||||
@@ -641,7 +641,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('uses last A mark with gt timestamp from file when reading', function()
 | 
			
		||||
@@ -650,7 +650,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    wshada('\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('?', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('?', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('uses last A mark with gt timestamp from instance when writing', function()
 | 
			
		||||
@@ -658,7 +658,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    wshada('\007\000\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(0, exc_exec('wshada ' .. shada_fname))
 | 
			
		||||
    local found = {}
 | 
			
		||||
    for _, v in ipairs(read_shada_file(shada_fname)) do
 | 
			
		||||
@@ -675,7 +675,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    wshada('\007\001\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(0, exc_exec('wshada ' .. shada_fname))
 | 
			
		||||
    local found = {}
 | 
			
		||||
    for _, v in ipairs(read_shada_file(shada_fname)) do
 | 
			
		||||
@@ -692,7 +692,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    wshada('\007\002\018\131\162mX\195\161f\196\006' .. mock_file_path .. '?\161nA')
 | 
			
		||||
    nvim_command('normal! `A')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(0, exc_exec('wshada ' .. shada_fname))
 | 
			
		||||
    local found = {}
 | 
			
		||||
    for _, v in ipairs(read_shada_file(shada_fname)) do
 | 
			
		||||
@@ -803,7 +803,7 @@ describe('ShaDa marks support code', function()
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    wshada('\010\002\017\131\161l\002\161f\196\006' .. mock_file_path .. '-\161na')
 | 
			
		||||
    nvim_command('normal! `a')
 | 
			
		||||
    eq('-', funcs.fnamemodify(curbufmeths.get_name(), ':t'))
 | 
			
		||||
    eq('-', funcs.fnamemodify(meths.nvim_buf_get_name(0), ':t'))
 | 
			
		||||
    eq(0, exc_exec('wshada ' .. shada_fname))
 | 
			
		||||
    local found = 0
 | 
			
		||||
    for _, v in ipairs(read_shada_file(shada_fname)) do
 | 
			
		||||
@@ -940,7 +940,7 @@ describe('ShaDa jumps support code', function()
 | 
			
		||||
        .. 'f\161l\002'
 | 
			
		||||
    )
 | 
			
		||||
    eq(0, exc_exec(sdrcmd()))
 | 
			
		||||
    eq('', curbufmeths.get_name())
 | 
			
		||||
    eq('', meths.nvim_buf_get_name(0))
 | 
			
		||||
    eq(
 | 
			
		||||
      ' jump line  col file/text\n'
 | 
			
		||||
        .. '   5     2    0 '
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,6 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
local clear, eq, curbuf = helpers.clear, helpers.eq, helpers.curbuf
 | 
			
		||||
local clear, eq, meths = helpers.clear, helpers.eq, helpers.meths
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local feed_data = thelpers.feed_data
 | 
			
		||||
local enter_altscreen = thelpers.enter_altscreen
 | 
			
		||||
@@ -42,7 +42,7 @@ describe(':terminal altscreen', function()
 | 
			
		||||
      {1: }                                                 |
 | 
			
		||||
      {3:-- TERMINAL --}                                    |
 | 
			
		||||
    ]])
 | 
			
		||||
    eq(10, curbuf('line_count'))
 | 
			
		||||
    eq(10, meths.nvim_buf_line_count(0))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('wont clear lines already in the scrollback', function()
 | 
			
		||||
@@ -107,7 +107,7 @@ describe(':terminal altscreen', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('wont modify line count', function()
 | 
			
		||||
      eq(10, curbuf('line_count'))
 | 
			
		||||
      eq(10, meths.nvim_buf_line_count(0))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('wont modify lines in the scrollback', function()
 | 
			
		||||
@@ -144,7 +144,7 @@ describe(':terminal altscreen', function()
 | 
			
		||||
        rows: 4, cols: 50                                 |
 | 
			
		||||
                                                          |
 | 
			
		||||
      ]])
 | 
			
		||||
      eq(9, curbuf('line_count'))
 | 
			
		||||
      eq(9, meths.nvim_buf_line_count(0))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    describe('and after exit', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
 | 
			
		||||
local feed, clear = helpers.feed, helpers.clear
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
local nvim_prog = helpers.nvim_prog
 | 
			
		||||
local eval, feed_command, source = helpers.eval, helpers.feed_command, helpers.source
 | 
			
		||||
@@ -92,12 +92,12 @@ describe(':terminal buffer', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('does not create swap files', function()
 | 
			
		||||
      local swapfile = nvim('exec', 'swapname', true):gsub('\n', '')
 | 
			
		||||
      local swapfile = meths.nvim_exec('swapname', true):gsub('\n', '')
 | 
			
		||||
      eq(nil, io.open(swapfile))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('does not create undofiles files', function()
 | 
			
		||||
      local undofile = nvim('eval', 'undofile(bufname("%"))')
 | 
			
		||||
      local undofile = meths.nvim_eval('undofile(bufname("%"))')
 | 
			
		||||
      eq(nil, io.open(undofile))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -172,7 +172,7 @@ describe(':terminal buffer', function()
 | 
			
		||||
 | 
			
		||||
  it('handles loss of focus gracefully', function()
 | 
			
		||||
    -- Change the statusline to avoid printing the file name, which varies.
 | 
			
		||||
    nvim('set_option_value', 'statusline', '==========', {})
 | 
			
		||||
    meths.nvim_set_option_value('statusline', '==========', {})
 | 
			
		||||
 | 
			
		||||
    -- Save the buffer number of the terminal for later testing.
 | 
			
		||||
    local tbuf = eval('bufnr("%")')
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
 | 
			
		||||
local feed, clear = helpers.feed, helpers.clear
 | 
			
		||||
local testprg, command = helpers.testprg, helpers.command
 | 
			
		||||
local eq, eval = helpers.eq, helpers.eval
 | 
			
		||||
local matches = helpers.matches
 | 
			
		||||
@@ -118,8 +118,8 @@ describe('cursor with customized highlighting', function()
 | 
			
		||||
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
    nvim('command', 'highlight TermCursor ctermfg=45 ctermbg=46 cterm=NONE')
 | 
			
		||||
    nvim('command', 'highlight TermCursorNC ctermfg=55 ctermbg=56 cterm=NONE')
 | 
			
		||||
    command('highlight TermCursor ctermfg=45 ctermbg=46 cterm=NONE')
 | 
			
		||||
    command('highlight TermCursorNC ctermfg=55 ctermbg=56 cterm=NONE')
 | 
			
		||||
    screen = Screen.new(50, 7)
 | 
			
		||||
    screen:set_default_attr_ids({
 | 
			
		||||
      [1] = { foreground = 45, background = 46 },
 | 
			
		||||
 
 | 
			
		||||
@@ -1,8 +1,6 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local screen = require('test.functional.ui.screen')
 | 
			
		||||
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local curwinmeths = helpers.curwinmeths
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
@@ -48,7 +46,7 @@ describe(':edit term://*', function()
 | 
			
		||||
    command('edit term://foobar')
 | 
			
		||||
 | 
			
		||||
    local bufcontents = {}
 | 
			
		||||
    local winheight = curwinmeths.get_height()
 | 
			
		||||
    local winheight = meths.nvim_win_get_height(0)
 | 
			
		||||
    local buf_cont_start = rep - sb - winheight + 2
 | 
			
		||||
    for i = buf_cont_start, (rep - 1) do
 | 
			
		||||
      bufcontents[#bufcontents + 1] = ('%d: foobar'):format(i)
 | 
			
		||||
@@ -65,6 +63,6 @@ describe(':edit term://*', function()
 | 
			
		||||
 | 
			
		||||
    exp_screen = exp_screen .. (' '):rep(columns) .. '|\n'
 | 
			
		||||
    scr:expect(exp_screen)
 | 
			
		||||
    eq(bufcontents, curbufmeths.get_lines(0, -1, true))
 | 
			
		||||
    eq(bufcontents, meths.nvim_buf_get_lines(0, 0, -1, true))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,11 +1,12 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
local clear, poke_eventloop, nvim = helpers.clear, helpers.poke_eventloop, helpers.nvim
 | 
			
		||||
local clear, poke_eventloop = helpers.clear, helpers.poke_eventloop
 | 
			
		||||
local testprg, source, eq = helpers.testprg, helpers.source, helpers.eq
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local feed_command, eval = helpers.feed_command, helpers.eval
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
local ok = helpers.ok
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
@@ -104,30 +105,30 @@ describe(':terminal', function()
 | 
			
		||||
 | 
			
		||||
  it('nvim_get_mode() in :terminal', function()
 | 
			
		||||
    command('terminal')
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, meths.nvim_get_mode())
 | 
			
		||||
    feed('i')
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, meths.nvim_get_mode())
 | 
			
		||||
    feed([[<C-\><C-N>]])
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, meths.nvim_get_mode())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it(':stopinsert RPC request exits terminal-mode #7807', function()
 | 
			
		||||
    command('terminal')
 | 
			
		||||
    feed('i[tui] insert-mode')
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, meths.nvim_get_mode())
 | 
			
		||||
    command('stopinsert')
 | 
			
		||||
    feed('<Ignore>') -- Add input to separate two RPC requests
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, meths.nvim_get_mode())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it(":stopinsert in normal mode doesn't break insert mode #9889", function()
 | 
			
		||||
    command('terminal')
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, meths.nvim_get_mode())
 | 
			
		||||
    command('stopinsert')
 | 
			
		||||
    feed('<Ignore>') -- Add input to separate two RPC requests
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 'nt' }, meths.nvim_get_mode())
 | 
			
		||||
    feed('a')
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, meths.nvim_get_mode())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('switching to terminal buffer in Insert mode goes to Terminal mode #7164', function()
 | 
			
		||||
@@ -138,9 +139,9 @@ describe(':terminal', function()
 | 
			
		||||
    command('autocmd InsertLeave * let g:events += ["InsertLeave"]')
 | 
			
		||||
    command('autocmd TermEnter * let g:events += ["TermEnter"]')
 | 
			
		||||
    command('inoremap <F2> <Cmd>wincmd p<CR>')
 | 
			
		||||
    eq({ blocking = false, mode = 'i' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 'i' }, meths.nvim_get_mode())
 | 
			
		||||
    feed('<F2>')
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, nvim('get_mode'))
 | 
			
		||||
    eq({ blocking = false, mode = 't' }, meths.nvim_get_mode())
 | 
			
		||||
    eq({ 'InsertLeave', 'TermEnter' }, eval('g:events'))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
@@ -158,9 +159,9 @@ local function test_terminal_with_fake_shell(backslash)
 | 
			
		||||
    clear()
 | 
			
		||||
    screen = Screen.new(50, 4)
 | 
			
		||||
    screen:attach({ rgb = false })
 | 
			
		||||
    nvim('set_option_value', 'shell', shell_path, {})
 | 
			
		||||
    nvim('set_option_value', 'shellcmdflag', 'EXE', {})
 | 
			
		||||
    nvim('set_option_value', 'shellxquote', '', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', shell_path, {})
 | 
			
		||||
    meths.nvim_set_option_value('shellcmdflag', 'EXE', {})
 | 
			
		||||
    meths.nvim_set_option_value('shellxquote', '', {})
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('with no argument, acts like termopen()', function()
 | 
			
		||||
@@ -177,7 +178,7 @@ local function test_terminal_with_fake_shell(backslash)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it("with no argument, and 'shell' is set to empty string", function()
 | 
			
		||||
    nvim('set_option_value', 'shell', '', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', '', {})
 | 
			
		||||
    feed_command('terminal')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      ^                                                  |
 | 
			
		||||
@@ -187,7 +188,7 @@ local function test_terminal_with_fake_shell(backslash)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it("with no argument, but 'shell' has arguments, acts like termopen()", function()
 | 
			
		||||
    nvim('set_option_value', 'shell', shell_path .. ' INTERACT', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', shell_path .. ' INTERACT', {})
 | 
			
		||||
    feed_command('terminal')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      ^interact $                                        |
 | 
			
		||||
@@ -208,7 +209,7 @@ local function test_terminal_with_fake_shell(backslash)
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it("executes a given command through the shell, when 'shell' has arguments", function()
 | 
			
		||||
    nvim('set_option_value', 'shell', shell_path .. ' -t jeff', {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', shell_path .. ' -t jeff', {})
 | 
			
		||||
    command('set shellxquote=') -- win: avoid extra quotes
 | 
			
		||||
    feed_command('terminal echo hi')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ local helpers = require('test.functional.helpers')(nil)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local nvim_prog = helpers.nvim_prog
 | 
			
		||||
 | 
			
		||||
local function feed_data(data)
 | 
			
		||||
@@ -89,8 +89,8 @@ local function screen_setup(extra_rows, command, cols, env, screen_opts)
 | 
			
		||||
  command = command and command or default_command
 | 
			
		||||
  cols = cols and cols or 50
 | 
			
		||||
 | 
			
		||||
  nvim('command', 'highlight TermCursor cterm=reverse')
 | 
			
		||||
  nvim('command', 'highlight TermCursorNC ctermbg=11')
 | 
			
		||||
  meths.nvim_command('highlight TermCursor cterm=reverse')
 | 
			
		||||
  meths.nvim_command('highlight TermCursorNC ctermbg=11')
 | 
			
		||||
 | 
			
		||||
  local screen = Screen.new(cols, 7 + extra_rows)
 | 
			
		||||
  screen:set_default_attr_ids({
 | 
			
		||||
@@ -113,17 +113,17 @@ local function screen_setup(extra_rows, command, cols, env, screen_opts)
 | 
			
		||||
 | 
			
		||||
  screen:attach(screen_opts or { rgb = false })
 | 
			
		||||
 | 
			
		||||
  nvim('command', 'enew')
 | 
			
		||||
  nvim('call_function', 'termopen', { command, env and { env = env } or nil })
 | 
			
		||||
  nvim('input', '<CR>')
 | 
			
		||||
  local vim_errmsg = nvim('eval', 'v:errmsg')
 | 
			
		||||
  meths.nvim_command('enew')
 | 
			
		||||
  meths.nvim_call_function('termopen', { command, env and { env = env } or nil })
 | 
			
		||||
  meths.nvim_input('<CR>')
 | 
			
		||||
  local vim_errmsg = meths.nvim_eval('v:errmsg')
 | 
			
		||||
  if vim_errmsg and '' ~= vim_errmsg then
 | 
			
		||||
    error(vim_errmsg)
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  nvim('command', 'setlocal scrollback=10')
 | 
			
		||||
  nvim('command', 'startinsert')
 | 
			
		||||
  nvim('input', '<Ignore>') -- Add input to separate two RPC requests
 | 
			
		||||
  meths.nvim_command('setlocal scrollback=10')
 | 
			
		||||
  meths.nvim_command('startinsert')
 | 
			
		||||
  meths.nvim_input('<Ignore>') -- Add input to separate two RPC requests
 | 
			
		||||
 | 
			
		||||
  -- tty-test puts the terminal into raw mode and echoes input. Tests work by
 | 
			
		||||
  -- feeding termcodes to control the display and asserting by screen:expect.
 | 
			
		||||
@@ -147,7 +147,7 @@ local function screen_setup(extra_rows, command, cols, env, screen_opts)
 | 
			
		||||
    screen:expect(table.concat(expected, '|\n') .. '|')
 | 
			
		||||
  else
 | 
			
		||||
    -- This eval also acts as a poke_eventloop().
 | 
			
		||||
    if 0 == nvim('eval', "exists('b:terminal_job_id')") then
 | 
			
		||||
    if 0 == meths.nvim_eval("exists('b:terminal_job_id')") then
 | 
			
		||||
      error('terminal job failed to start')
 | 
			
		||||
    end
 | 
			
		||||
  end
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,8 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
local feed, clear, nvim = helpers.feed, helpers.clear, helpers.nvim
 | 
			
		||||
local feed, clear = helpers.feed, helpers.clear
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local testprg, command = helpers.testprg, helpers.command
 | 
			
		||||
local nvim_prog_abs = helpers.nvim_prog_abs
 | 
			
		||||
local eq, eval = helpers.eq, helpers.eval
 | 
			
		||||
@@ -250,7 +251,7 @@ describe(':terminal highlight with custom palette', function()
 | 
			
		||||
      [9] = { bold = true },
 | 
			
		||||
    })
 | 
			
		||||
    screen:attach({ rgb = true })
 | 
			
		||||
    nvim('set_var', 'terminal_color_3', '#123456')
 | 
			
		||||
    meths.nvim_set_var('terminal_color_3', '#123456')
 | 
			
		||||
    command(("enew | call termopen(['%s'])"):format(testprg('tty-test')))
 | 
			
		||||
    feed('i')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
local clear, eq, eval = helpers.clear, helpers.eq, helpers.eval
 | 
			
		||||
local feed, nvim, command = helpers.feed, helpers.nvim, helpers.command
 | 
			
		||||
local feed, meths, command = helpers.feed, helpers.meths, helpers.command
 | 
			
		||||
local feed_data = thelpers.feed_data
 | 
			
		||||
local is_os = helpers.is_os
 | 
			
		||||
local skip = helpers.skip
 | 
			
		||||
@@ -11,7 +11,7 @@ describe(':terminal mouse', function()
 | 
			
		||||
 | 
			
		||||
  before_each(function()
 | 
			
		||||
    clear()
 | 
			
		||||
    nvim('set_option_value', 'statusline', '==========', {})
 | 
			
		||||
    meths.nvim_set_option_value('statusline', '==========', {})
 | 
			
		||||
    command('highlight StatusLine cterm=NONE')
 | 
			
		||||
    command('highlight StatusLineNC cterm=NONE')
 | 
			
		||||
    command('highlight VertSplit cterm=NONE')
 | 
			
		||||
@@ -514,7 +514,7 @@ describe(':terminal mouse', function()
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
      it('handles terminal size when switching buffers', function()
 | 
			
		||||
        nvim('set_option_value', 'hidden', true, {})
 | 
			
		||||
        meths.nvim_set_option_value('hidden', true, {})
 | 
			
		||||
        feed('<c-\\><c-n><c-w><c-w>')
 | 
			
		||||
        screen:expect([[
 | 
			
		||||
          {7: 27 }line                 │line30                  |
 | 
			
		||||
 
 | 
			
		||||
@@ -1,14 +1,13 @@
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local thelpers = require('test.functional.terminal.helpers')
 | 
			
		||||
local clear, eq, curbuf = helpers.clear, helpers.eq, helpers.curbuf
 | 
			
		||||
local clear, eq = helpers.clear, helpers.eq
 | 
			
		||||
local feed, testprg = helpers.feed, helpers.testprg
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local feed_data = thelpers.feed_data
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
@@ -86,7 +85,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
          {1: }                             |
 | 
			
		||||
          {3:-- TERMINAL --}                |
 | 
			
		||||
        ]])
 | 
			
		||||
        eq(7, curbuf('line_count'))
 | 
			
		||||
        eq(7, meths.nvim_buf_line_count(0))
 | 
			
		||||
      end)
 | 
			
		||||
 | 
			
		||||
      describe('and then 3 more lines are printed', function()
 | 
			
		||||
@@ -170,7 +169,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
            {2:^ }                         |
 | 
			
		||||
                                      |
 | 
			
		||||
          ]])
 | 
			
		||||
          eq(8, curbuf('line_count'))
 | 
			
		||||
          eq(8, meths.nvim_buf_line_count(0))
 | 
			
		||||
          feed([[3k]])
 | 
			
		||||
          screen:expect([[
 | 
			
		||||
            ^line4                     |
 | 
			
		||||
@@ -204,7 +203,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
                                        |
 | 
			
		||||
          {3:-- TERMINAL --}                |
 | 
			
		||||
        ]])
 | 
			
		||||
        eq(4, curbuf('line_count'))
 | 
			
		||||
        eq(4, meths.nvim_buf_line_count(0))
 | 
			
		||||
      end
 | 
			
		||||
 | 
			
		||||
      it('will delete the last two empty lines', will_delete_last_two_lines)
 | 
			
		||||
@@ -222,7 +221,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
            {1: }                             |
 | 
			
		||||
            {3:-- TERMINAL --}                |
 | 
			
		||||
          ]])
 | 
			
		||||
          eq(4, curbuf('line_count'))
 | 
			
		||||
          eq(4, meths.nvim_buf_line_count(0))
 | 
			
		||||
          feed('<c-\\><c-n>gg')
 | 
			
		||||
          screen:expect([[
 | 
			
		||||
            ^tty ready                     |
 | 
			
		||||
@@ -261,7 +260,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
        {1: }                             |
 | 
			
		||||
        {3:-- TERMINAL --}                |
 | 
			
		||||
      ]])
 | 
			
		||||
      eq(7, curbuf('line_count'))
 | 
			
		||||
      eq(7, meths.nvim_buf_line_count(0))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    describe('and the height is increased by 1', function()
 | 
			
		||||
@@ -287,7 +286,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
      describe('and then by 3', function()
 | 
			
		||||
        before_each(function()
 | 
			
		||||
          pop_then_push()
 | 
			
		||||
          eq(8, curbuf('line_count'))
 | 
			
		||||
          eq(8, meths.nvim_buf_line_count(0))
 | 
			
		||||
          screen:try_resize(screen._width, screen._height + 3)
 | 
			
		||||
        end)
 | 
			
		||||
 | 
			
		||||
@@ -302,7 +301,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
            {1: }                             |
 | 
			
		||||
            {3:-- TERMINAL --}                |
 | 
			
		||||
          ]])
 | 
			
		||||
          eq(9, curbuf('line_count'))
 | 
			
		||||
          eq(9, meths.nvim_buf_line_count(0))
 | 
			
		||||
          feed('<c-\\><c-n>gg')
 | 
			
		||||
          screen:expect([[
 | 
			
		||||
            ^tty ready                     |
 | 
			
		||||
@@ -342,7 +341,7 @@ describe(':terminal scrollback', function()
 | 
			
		||||
            ]])
 | 
			
		||||
            -- since there's an empty line after the cursor, the buffer line
 | 
			
		||||
            -- count equals the terminal screen height
 | 
			
		||||
            eq(11, curbuf('line_count'))
 | 
			
		||||
            eq(11, meths.nvim_buf_line_count(0))
 | 
			
		||||
          end)
 | 
			
		||||
        end)
 | 
			
		||||
      end)
 | 
			
		||||
@@ -381,7 +380,7 @@ describe("'scrollback' option", function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  local function set_fake_shell()
 | 
			
		||||
    nvim('set_option_value', 'shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
 | 
			
		||||
    meths.nvim_set_option_value('shell', string.format('"%s" INTERACT', testprg('shell-test')), {})
 | 
			
		||||
  end
 | 
			
		||||
 | 
			
		||||
  local function expect_lines(expected, epsilon)
 | 
			
		||||
 
 | 
			
		||||
@@ -772,7 +772,7 @@ describe('treesitter highlighting (help)', function()
 | 
			
		||||
    ]],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    helpers.curbufmeths.set_text(0, 1, 0, 5, { 'lua' })
 | 
			
		||||
    helpers.meths.nvim_buf_set_text(0, 0, 1, 0, 5, { 'lua' })
 | 
			
		||||
 | 
			
		||||
    screen:expect {
 | 
			
		||||
      grid = [[
 | 
			
		||||
@@ -785,7 +785,7 @@ describe('treesitter highlighting (help)', function()
 | 
			
		||||
    ]],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    helpers.curbufmeths.set_text(0, 1, 0, 4, { 'ruby' })
 | 
			
		||||
    helpers.meths.nvim_buf_set_text(0, 0, 1, 0, 4, { 'ruby' })
 | 
			
		||||
 | 
			
		||||
    screen:expect {
 | 
			
		||||
      grid = [[
 | 
			
		||||
 
 | 
			
		||||
@@ -4,8 +4,9 @@ local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
 | 
			
		||||
local command, neq = helpers.command, helpers.neq
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local curbufmeths, eq = helpers.curbufmeths, helpers.eq
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local set_virtual_text = meths.nvim_buf_set_virtual_text
 | 
			
		||||
 | 
			
		||||
describe('Buffer highlighting', function()
 | 
			
		||||
  local screen
 | 
			
		||||
@@ -39,8 +40,8 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    })
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  local add_highlight = curbufmeths.add_highlight
 | 
			
		||||
  local clear_namespace = curbufmeths.clear_namespace
 | 
			
		||||
  local add_highlight = meths.nvim_buf_add_highlight
 | 
			
		||||
  local clear_namespace = meths.nvim_buf_clear_namespace
 | 
			
		||||
 | 
			
		||||
  it('works', function()
 | 
			
		||||
    insert([[
 | 
			
		||||
@@ -55,8 +56,8 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                              |
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    add_highlight(-1, 'String', 0, 10, 14)
 | 
			
		||||
    add_highlight(-1, 'Statement', 1, 5, -1)
 | 
			
		||||
    add_highlight(0, -1, 'String', 0, 10, 14)
 | 
			
		||||
    add_highlight(0, -1, 'Statement', 1, 5, -1)
 | 
			
		||||
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      these are {2:some} lines                    |
 | 
			
		||||
@@ -74,7 +75,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                              |
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    clear_namespace(-1, 0, -1)
 | 
			
		||||
    clear_namespace(0, -1, 0, -1)
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      these are some lines                    |
 | 
			
		||||
      ^                                        |
 | 
			
		||||
@@ -94,21 +95,21 @@ describe('Buffer highlighting', function()
 | 
			
		||||
        from different sources]])
 | 
			
		||||
 | 
			
		||||
      command('hi ImportantWord gui=bold cterm=bold')
 | 
			
		||||
      id1 = add_highlight(0, 'ImportantWord', 0, 2, 8)
 | 
			
		||||
      add_highlight(id1, 'ImportantWord', 1, 12, -1)
 | 
			
		||||
      add_highlight(id1, 'ImportantWord', 2, 0, 9)
 | 
			
		||||
      add_highlight(id1, 'ImportantWord', 3, 5, 14)
 | 
			
		||||
      id1 = add_highlight(0, 0, 'ImportantWord', 0, 2, 8)
 | 
			
		||||
      add_highlight(0, id1, 'ImportantWord', 1, 12, -1)
 | 
			
		||||
      add_highlight(0, id1, 'ImportantWord', 2, 0, 9)
 | 
			
		||||
      add_highlight(0, id1, 'ImportantWord', 3, 5, 14)
 | 
			
		||||
 | 
			
		||||
      -- add_highlight can be called like this to get a new source
 | 
			
		||||
      -- without adding any highlight
 | 
			
		||||
      id2 = add_highlight(0, '', 0, 0, 0)
 | 
			
		||||
      id2 = add_highlight(0, 0, '', 0, 0, 0)
 | 
			
		||||
      neq(id1, id2)
 | 
			
		||||
 | 
			
		||||
      add_highlight(id2, 'Special', 0, 2, 8)
 | 
			
		||||
      add_highlight(id2, 'Identifier', 1, 3, 8)
 | 
			
		||||
      add_highlight(id2, 'Special', 1, 14, 20)
 | 
			
		||||
      add_highlight(id2, 'Underlined', 2, 6, 12)
 | 
			
		||||
      add_highlight(id2, 'Underlined', 3, 0, 9)
 | 
			
		||||
      add_highlight(0, id2, 'Special', 0, 2, 8)
 | 
			
		||||
      add_highlight(0, id2, 'Identifier', 1, 3, 8)
 | 
			
		||||
      add_highlight(0, id2, 'Special', 1, 14, 20)
 | 
			
		||||
      add_highlight(0, id2, 'Underlined', 2, 6, 12)
 | 
			
		||||
      add_highlight(0, id2, 'Underlined', 3, 0, 9)
 | 
			
		||||
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        a {5:longer} example                        |
 | 
			
		||||
@@ -121,7 +122,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('and clearing the first added', function()
 | 
			
		||||
      clear_namespace(id1, 0, -1)
 | 
			
		||||
      clear_namespace(0, id1, 0, -1)
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        a {4:longer} example                        |
 | 
			
		||||
        in {6:order} to de{4:monstr}ate                 |
 | 
			
		||||
@@ -133,7 +134,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('and clearing using deprecated name', function()
 | 
			
		||||
      curbufmeths.clear_highlight(id1, 0, -1)
 | 
			
		||||
      meths.nvim_buf_clear_highlight(0, id1, 0, -1)
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        a {4:longer} example                        |
 | 
			
		||||
        in {6:order} to de{4:monstr}ate                 |
 | 
			
		||||
@@ -145,7 +146,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('and clearing the second added', function()
 | 
			
		||||
      clear_namespace(id2, 0, -1)
 | 
			
		||||
      clear_namespace(0, id2, 0, -1)
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        a {7:longer} example                        |
 | 
			
		||||
        in order to {7:demonstrate}                 |
 | 
			
		||||
@@ -157,9 +158,9 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('and clearing line ranges', function()
 | 
			
		||||
      clear_namespace(-1, 0, 1)
 | 
			
		||||
      clear_namespace(id1, 1, 2)
 | 
			
		||||
      clear_namespace(id2, 2, -1)
 | 
			
		||||
      clear_namespace(0, -1, 0, 1)
 | 
			
		||||
      clear_namespace(0, id1, 1, 2)
 | 
			
		||||
      clear_namespace(0, id2, 2, -1)
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        a longer example                        |
 | 
			
		||||
        in {6:order} to de{4:monstr}ate                 |
 | 
			
		||||
@@ -449,9 +450,9 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  pending('prioritizes latest added highlight', function()
 | 
			
		||||
    insert([[
 | 
			
		||||
      three overlapping colors]])
 | 
			
		||||
    add_highlight(0, 'Identifier', 0, 6, 17)
 | 
			
		||||
    add_highlight(0, 'String', 0, 14, 23)
 | 
			
		||||
    local id = add_highlight(0, 'Special', 0, 0, 9)
 | 
			
		||||
    add_highlight(0, 0, 'Identifier', 0, 6, 17)
 | 
			
		||||
    add_highlight(0, 0, 'String', 0, 14, 23)
 | 
			
		||||
    local id = add_highlight(0, 0, 'Special', 0, 0, 9)
 | 
			
		||||
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {4:three ove}{6:rlapp}{2:ing color}^s                |
 | 
			
		||||
@@ -459,7 +460,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                              |
 | 
			
		||||
    ]])
 | 
			
		||||
 | 
			
		||||
    clear_namespace(id, 0, 1)
 | 
			
		||||
    clear_namespace(0, id, 0, 1)
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      three {6:overlapp}{2:ing color}^s                |
 | 
			
		||||
      {1:~                                       }|*6
 | 
			
		||||
@@ -470,9 +471,9 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  it('prioritizes earlier highlight groups (TEMP)', function()
 | 
			
		||||
    insert([[
 | 
			
		||||
      three overlapping colors]])
 | 
			
		||||
    add_highlight(0, 'Identifier', 0, 6, 17)
 | 
			
		||||
    add_highlight(0, 'String', 0, 14, 23)
 | 
			
		||||
    local id = add_highlight(0, 'Special', 0, 0, 9)
 | 
			
		||||
    add_highlight(0, 0, 'Identifier', 0, 6, 17)
 | 
			
		||||
    add_highlight(0, 0, 'String', 0, 14, 23)
 | 
			
		||||
    local id = add_highlight(0, 0, 'Special', 0, 0, 9)
 | 
			
		||||
 | 
			
		||||
    screen:expect {
 | 
			
		||||
      grid = [[
 | 
			
		||||
@@ -482,7 +483,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    ]],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    clear_namespace(id, 0, 1)
 | 
			
		||||
    clear_namespace(0, id, 0, 1)
 | 
			
		||||
    screen:expect {
 | 
			
		||||
      grid = [[
 | 
			
		||||
      three {6:overlapp}{2:ing color}^s                |
 | 
			
		||||
@@ -493,17 +494,16 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('respects priority', function()
 | 
			
		||||
    local set_extmark = curbufmeths.set_extmark
 | 
			
		||||
    local id = meths.nvim_create_namespace('')
 | 
			
		||||
    insert [[foobar]]
 | 
			
		||||
 | 
			
		||||
    set_extmark(id, 0, 0, {
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, id, 0, 0, {
 | 
			
		||||
      end_line = 0,
 | 
			
		||||
      end_col = 5,
 | 
			
		||||
      hl_group = 'Statement',
 | 
			
		||||
      priority = 100,
 | 
			
		||||
    })
 | 
			
		||||
    set_extmark(id, 0, 0, {
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, id, 0, 0, {
 | 
			
		||||
      end_line = 0,
 | 
			
		||||
      end_col = 6,
 | 
			
		||||
      hl_group = 'String',
 | 
			
		||||
@@ -516,7 +516,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                              |
 | 
			
		||||
    ]]
 | 
			
		||||
 | 
			
		||||
    clear_namespace(id, 0, -1)
 | 
			
		||||
    clear_namespace(0, id, 0, -1)
 | 
			
		||||
    screen:expect {
 | 
			
		||||
      grid = [[
 | 
			
		||||
      fooba^r                                  |
 | 
			
		||||
@@ -525,13 +525,13 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    ]],
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    set_extmark(id, 0, 0, {
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, id, 0, 0, {
 | 
			
		||||
      end_line = 0,
 | 
			
		||||
      end_col = 6,
 | 
			
		||||
      hl_group = 'String',
 | 
			
		||||
      priority = 1,
 | 
			
		||||
    })
 | 
			
		||||
    set_extmark(id, 0, 0, {
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, id, 0, 0, {
 | 
			
		||||
      end_line = 0,
 | 
			
		||||
      end_col = 5,
 | 
			
		||||
      hl_group = 'Statement',
 | 
			
		||||
@@ -548,8 +548,8 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  it('works with multibyte text', function()
 | 
			
		||||
    insert([[
 | 
			
		||||
      Ta båten över sjön!]])
 | 
			
		||||
    add_highlight(-1, 'Identifier', 0, 3, 9)
 | 
			
		||||
    add_highlight(-1, 'String', 0, 16, 21)
 | 
			
		||||
    add_highlight(0, -1, 'Identifier', 0, 3, 9)
 | 
			
		||||
    add_highlight(0, -1, 'String', 0, 16, 21)
 | 
			
		||||
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      Ta {6:båten} över {2:sjön}^!                     |
 | 
			
		||||
@@ -561,7 +561,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  it('works with new syntax groups', function()
 | 
			
		||||
    insert([[
 | 
			
		||||
      fancy code in a new fancy language]])
 | 
			
		||||
    add_highlight(-1, 'FancyLangItem', 0, 0, 5)
 | 
			
		||||
    add_highlight(0, -1, 'FancyLangItem', 0, 0, 5)
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      fancy code in a new fancy languag^e      |
 | 
			
		||||
      {1:~                                       }|*6
 | 
			
		||||
@@ -577,7 +577,6 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  describe('virtual text decorations', function()
 | 
			
		||||
    local set_virtual_text = curbufmeths.set_virtual_text
 | 
			
		||||
    local id1, id2
 | 
			
		||||
    before_each(function()
 | 
			
		||||
      insert([[
 | 
			
		||||
@@ -595,9 +594,9 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                                |
 | 
			
		||||
      ]])
 | 
			
		||||
 | 
			
		||||
      id1 = set_virtual_text(0, 0, { { '=', 'Statement' }, { ' 3', 'Number' } }, {})
 | 
			
		||||
      set_virtual_text(id1, 1, { { 'ERROR:', 'ErrorMsg' }, { ' invalid syntax' } }, {})
 | 
			
		||||
      id2 = set_virtual_text(0, 2, {
 | 
			
		||||
      id1 = set_virtual_text(0, 0, 0, { { '=', 'Statement' }, { ' 3', 'Number' } }, {})
 | 
			
		||||
      set_virtual_text(0, id1, 1, { { 'ERROR:', 'ErrorMsg' }, { ' invalid syntax' } }, {})
 | 
			
		||||
      id2 = set_virtual_text(0, 0, 2, {
 | 
			
		||||
        {
 | 
			
		||||
          'Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.',
 | 
			
		||||
        },
 | 
			
		||||
@@ -616,7 +615,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                                |
 | 
			
		||||
      ]])
 | 
			
		||||
 | 
			
		||||
      clear_namespace(id1, 0, -1)
 | 
			
		||||
      clear_namespace(0, id1, 0, -1)
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        ^1 + 2                                   |
 | 
			
		||||
        3 +                                     |
 | 
			
		||||
@@ -632,6 +631,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
      eq(
 | 
			
		||||
        -1,
 | 
			
		||||
        set_virtual_text(
 | 
			
		||||
          0,
 | 
			
		||||
          -1,
 | 
			
		||||
          1,
 | 
			
		||||
          { { '暗x事zz速野谷質結育副住新覚丸活解終事', 'Comment' } },
 | 
			
		||||
@@ -687,22 +687,22 @@ describe('Buffer highlighting', function()
 | 
			
		||||
      -- this used to leak memory
 | 
			
		||||
      eq(
 | 
			
		||||
        "Invalid 'chunk': expected Array, got String",
 | 
			
		||||
        pcall_err(set_virtual_text, id1, 0, { 'texty' }, {})
 | 
			
		||||
        pcall_err(set_virtual_text, 0, id1, 0, { 'texty' }, {})
 | 
			
		||||
      )
 | 
			
		||||
      eq(
 | 
			
		||||
        "Invalid 'chunk': expected Array, got String",
 | 
			
		||||
        pcall_err(set_virtual_text, id1, 0, { { 'very' }, 'texty' }, {})
 | 
			
		||||
        pcall_err(set_virtual_text, 0, id1, 0, { { 'very' }, 'texty' }, {})
 | 
			
		||||
      )
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('can be retrieved', function()
 | 
			
		||||
      local get_extmarks = curbufmeths.get_extmarks
 | 
			
		||||
      local line_count = curbufmeths.line_count
 | 
			
		||||
      local get_extmarks = meths.nvim_buf_get_extmarks
 | 
			
		||||
      local line_count = meths.nvim_buf_line_count
 | 
			
		||||
 | 
			
		||||
      local s1 = { { 'Köttbullar', 'Comment' }, { 'Kräuterbutter' } }
 | 
			
		||||
      local s2 = { { 'こんにちは', 'Comment' } }
 | 
			
		||||
 | 
			
		||||
      set_virtual_text(id1, 0, s1, {})
 | 
			
		||||
      set_virtual_text(0, id1, 0, s1, {})
 | 
			
		||||
      eq({
 | 
			
		||||
        {
 | 
			
		||||
          1,
 | 
			
		||||
@@ -719,10 +719,10 @@ describe('Buffer highlighting', function()
 | 
			
		||||
            virt_text_hide = false,
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      }, get_extmarks(id1, { 0, 0 }, { 0, -1 }, { details = true }))
 | 
			
		||||
      }, get_extmarks(0, id1, { 0, 0 }, { 0, -1 }, { details = true }))
 | 
			
		||||
 | 
			
		||||
      local lastline = line_count()
 | 
			
		||||
      set_virtual_text(id1, line_count(), s2, {})
 | 
			
		||||
      local lastline = line_count(0)
 | 
			
		||||
      set_virtual_text(0, id1, line_count(0), s2, {})
 | 
			
		||||
      eq({
 | 
			
		||||
        {
 | 
			
		||||
          3,
 | 
			
		||||
@@ -739,9 +739,9 @@ describe('Buffer highlighting', function()
 | 
			
		||||
            virt_text_hide = false,
 | 
			
		||||
          },
 | 
			
		||||
        },
 | 
			
		||||
      }, get_extmarks(id1, { lastline, 0 }, { lastline, -1 }, { details = true }))
 | 
			
		||||
      }, get_extmarks(0, id1, { lastline, 0 }, { lastline, -1 }, { details = true }))
 | 
			
		||||
 | 
			
		||||
      eq({}, get_extmarks(id1, { lastline + 9000, 0 }, { lastline + 9000, -1 }, {}))
 | 
			
		||||
      eq({}, get_extmarks(0, id1, { lastline + 9000, 0 }, { lastline + 9000, -1 }, {}))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('is not highlighted by visual selection', function()
 | 
			
		||||
@@ -814,7 +814,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
                                                |
 | 
			
		||||
      ]])
 | 
			
		||||
 | 
			
		||||
      clear_namespace(-1, 0, -1)
 | 
			
		||||
      clear_namespace(0, -1, 0, -1)
 | 
			
		||||
      screen:expect([[
 | 
			
		||||
        ^1 + 2{1:$}                                  |
 | 
			
		||||
        3 +{1:$}                                    |
 | 
			
		||||
@@ -869,7 +869,7 @@ describe('Buffer highlighting', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('works with color column', function()
 | 
			
		||||
      eq(-1, set_virtual_text(-1, 3, { { '暗x事', 'Comment' } }, {}))
 | 
			
		||||
      eq(-1, set_virtual_text(0, -1, 3, { { '暗x事', 'Comment' } }, {}))
 | 
			
		||||
      screen:expect {
 | 
			
		||||
        grid = [[
 | 
			
		||||
        ^1 + 2 {3:=}{2: 3}                               |
 | 
			
		||||
@@ -898,12 +898,11 @@ describe('Buffer highlighting', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('and virtual text use the same namespace counter', function()
 | 
			
		||||
    local set_virtual_text = curbufmeths.set_virtual_text
 | 
			
		||||
    eq(1, add_highlight(0, 'String', 0, 0, -1))
 | 
			
		||||
    eq(2, set_virtual_text(0, 0, { { '= text', 'Comment' } }, {}))
 | 
			
		||||
    eq(1, add_highlight(0, 0, 'String', 0, 0, -1))
 | 
			
		||||
    eq(2, set_virtual_text(0, 0, 0, { { '= text', 'Comment' } }, {}))
 | 
			
		||||
    eq(3, meths.nvim_create_namespace('my-ns'))
 | 
			
		||||
    eq(4, add_highlight(0, 'String', 0, 0, -1))
 | 
			
		||||
    eq(5, set_virtual_text(0, 0, { { '= text', 'Comment' } }, {}))
 | 
			
		||||
    eq(4, add_highlight(0, 0, 'String', 0, 0, -1))
 | 
			
		||||
    eq(5, set_virtual_text(0, 0, 0, { { '= text', 'Comment' } }, {}))
 | 
			
		||||
    eq(6, meths.nvim_create_namespace('other-ns'))
 | 
			
		||||
  end)
 | 
			
		||||
end)
 | 
			
		||||
 
 | 
			
		||||
@@ -10,7 +10,6 @@ local source = helpers.source
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
local dedent = helpers.dedent
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
 | 
			
		||||
local screen
 | 
			
		||||
 | 
			
		||||
@@ -503,7 +502,7 @@ describe('Command-line coloring', function()
 | 
			
		||||
    ]]))
 | 
			
		||||
    eq(
 | 
			
		||||
      { '', ':', 'E888 detected for  \\ze*', ':', 'E888 detected for  \\zs*' },
 | 
			
		||||
      curbufmeths.get_lines(0, -1, false)
 | 
			
		||||
      meths.nvim_buf_get_lines(0, 0, -1, false)
 | 
			
		||||
    )
 | 
			
		||||
    eq('', funcs.execute('messages'))
 | 
			
		||||
  end)
 | 
			
		||||
@@ -646,7 +645,7 @@ describe('Ex commands coloring', function()
 | 
			
		||||
    ]]))
 | 
			
		||||
    eq(
 | 
			
		||||
      { '', 'E888 detected for  \\ze*', 'E888 detected for  \\zs*' },
 | 
			
		||||
      curbufmeths.get_lines(0, -1, false)
 | 
			
		||||
      meths.nvim_buf_get_lines(0, 0, -1, false)
 | 
			
		||||
    )
 | 
			
		||||
    eq('', funcs.execute('messages'))
 | 
			
		||||
  end)
 | 
			
		||||
@@ -725,10 +724,10 @@ describe('Ex commands coloring', function()
 | 
			
		||||
end)
 | 
			
		||||
describe('Expressions coloring support', function()
 | 
			
		||||
  it('works', function()
 | 
			
		||||
    meths.nvim_command('hi clear NvimNumber')
 | 
			
		||||
    meths.nvim_command('hi clear NvimNestingParenthesis')
 | 
			
		||||
    meths.nvim_command('hi NvimNumber guifg=Blue2')
 | 
			
		||||
    meths.nvim_command('hi NvimNestingParenthesis guifg=Yellow')
 | 
			
		||||
    command('hi clear NvimNumber')
 | 
			
		||||
    command('hi clear NvimNestingParenthesis')
 | 
			
		||||
    command('hi NvimNumber guifg=Blue2')
 | 
			
		||||
    command('hi NvimNestingParenthesis guifg=Yellow')
 | 
			
		||||
    feed(':echo <C-r>=(((1)))')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
                                              |
 | 
			
		||||
@@ -739,8 +738,8 @@ describe('Expressions coloring support', function()
 | 
			
		||||
  it('does not use Nvim_color_expr', function()
 | 
			
		||||
    meths.nvim_set_var('Nvim_color_expr', 42)
 | 
			
		||||
    -- Used to error out due to failing to get callback.
 | 
			
		||||
    meths.nvim_command('hi clear NvimNumber')
 | 
			
		||||
    meths.nvim_command('hi NvimNumber guifg=Blue2')
 | 
			
		||||
    command('hi clear NvimNumber')
 | 
			
		||||
    command('hi NvimNumber guifg=Blue2')
 | 
			
		||||
    feed(':<C-r>=1')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
                                              |
 | 
			
		||||
@@ -749,12 +748,12 @@ describe('Expressions coloring support', function()
 | 
			
		||||
    ]])
 | 
			
		||||
  end)
 | 
			
		||||
  it('works correctly with non-ASCII and control characters', function()
 | 
			
		||||
    meths.nvim_command('hi clear NvimStringBody')
 | 
			
		||||
    meths.nvim_command('hi clear NvimStringQuote')
 | 
			
		||||
    meths.nvim_command('hi clear NvimInvalid')
 | 
			
		||||
    meths.nvim_command('hi NvimStringQuote guifg=Blue3')
 | 
			
		||||
    meths.nvim_command('hi NvimStringBody guifg=Blue4')
 | 
			
		||||
    meths.nvim_command('hi NvimInvalid guifg=Red guibg=Blue')
 | 
			
		||||
    command('hi clear NvimStringBody')
 | 
			
		||||
    command('hi clear NvimStringQuote')
 | 
			
		||||
    command('hi clear NvimInvalid')
 | 
			
		||||
    command('hi NvimStringQuote guifg=Blue3')
 | 
			
		||||
    command('hi NvimStringBody guifg=Blue4')
 | 
			
		||||
    command('hi NvimInvalid guifg=Red guibg=Blue')
 | 
			
		||||
    feed('i<C-r>="«»"«»')
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
                                              |
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ local exec = helpers.exec
 | 
			
		||||
local expect_events = helpers.expect_events
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
@@ -244,7 +243,7 @@ describe('decorations providers', function()
 | 
			
		||||
 | 
			
		||||
    -- spell=false with higher priority does disable spell
 | 
			
		||||
    local ns = meths.nvim_create_namespace "spell"
 | 
			
		||||
    local id = curbufmeths.set_extmark(ns, 0, 0, { priority = 30, end_row = 2, end_col = 23, spell = false })
 | 
			
		||||
    local id = meths.nvim_buf_set_extmark(0, ns, 0, 0, { priority = 30, end_row = 2, end_col = 23, spell = false })
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      I am well written text.                 |
 | 
			
		||||
@@ -267,7 +266,7 @@ describe('decorations providers', function()
 | 
			
		||||
    command('echo ""')
 | 
			
		||||
 | 
			
		||||
    -- spell=false with lower priority doesn't disable spell
 | 
			
		||||
    curbufmeths.set_extmark(ns, 0, 0, { id = id, priority = 10, end_row = 2, end_col = 23, spell = false })
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, ns, 0, 0, { id = id, priority = 10, end_row = 2, end_col = 23, spell = false })
 | 
			
		||||
 | 
			
		||||
    screen:expect{grid=[[
 | 
			
		||||
      I am well written text.                 |
 | 
			
		||||
 
 | 
			
		||||
@@ -12,12 +12,13 @@ local exec = helpers.exec
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local run = helpers.run
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local tbl_contains = vim.tbl_contains
 | 
			
		||||
local curbuf, curwin, curtab = helpers.curbuf, helpers.curwin, helpers.curtab
 | 
			
		||||
local curbuf = helpers.meths.nvim_get_current_buf
 | 
			
		||||
local curwin = helpers.meths.nvim_get_current_win
 | 
			
		||||
local curtab = helpers.meths.nvim_get_current_tabpage
 | 
			
		||||
local NIL = vim.NIL
 | 
			
		||||
 | 
			
		||||
describe('float window', function()
 | 
			
		||||
@@ -6624,7 +6625,7 @@ describe('float window', function()
 | 
			
		||||
        for i = 1,5 do
 | 
			
		||||
          feed(i.."<c-w>w")
 | 
			
		||||
          feed_command("enew")
 | 
			
		||||
          curbufmeths.set_lines(0,-1,true,{tostring(i)})
 | 
			
		||||
          meths.nvim_buf_set_lines(0, 0,-1,true,{tostring(i)})
 | 
			
		||||
        end
 | 
			
		||||
 | 
			
		||||
        if multigrid then
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,6 @@ local clear, feed, insert = helpers.clear, helpers.feed, helpers.insert
 | 
			
		||||
local command, exec = helpers.command, helpers.exec
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local feed_command, eq = helpers.feed_command, helpers.eq
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
@@ -2088,7 +2087,7 @@ describe("'winhighlight' highlight", function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('can override NonText, Conceal and EndOfBuffer', function()
 | 
			
		||||
    curbufmeths.set_lines(0, -1, true, { 'raa\000' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, -1, true, { 'raa\000' })
 | 
			
		||||
    command('call matchaddpos("Conceal", [[1,2]], 0, -1, {"conceal": "#"})')
 | 
			
		||||
    command('set cole=2 cocu=nvic')
 | 
			
		||||
    command('split')
 | 
			
		||||
 
 | 
			
		||||
@@ -14,7 +14,6 @@ local ok = helpers.ok
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local sleep = vim.uv.sleep
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
@@ -1898,20 +1897,20 @@ describe("'inccommand' with 'gdefault'", function()
 | 
			
		||||
    common_setup(nil, 'nosplit', '{')
 | 
			
		||||
    command('set gdefault')
 | 
			
		||||
    feed(':s/{\\n')
 | 
			
		||||
    eq({ mode = 'c', blocking = false }, nvim('get_mode'))
 | 
			
		||||
    eq({ mode = 'c', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
    feed('/A<Enter>')
 | 
			
		||||
    expect('A')
 | 
			
		||||
    eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
    eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('with multiline text and range, does not lock up #7244', function()
 | 
			
		||||
    common_setup(nil, 'nosplit', '{\n\n{')
 | 
			
		||||
    command('set gdefault')
 | 
			
		||||
    feed(':%s/{\\n')
 | 
			
		||||
    eq({ mode = 'c', blocking = false }, nvim('get_mode'))
 | 
			
		||||
    eq({ mode = 'c', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
    feed('/A<Enter>')
 | 
			
		||||
    expect('A\nA')
 | 
			
		||||
    eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
    eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('does not crash on zero-width matches #7485', function()
 | 
			
		||||
@@ -1920,9 +1919,9 @@ describe("'inccommand' with 'gdefault'", function()
 | 
			
		||||
    feed('gg')
 | 
			
		||||
    feed('Vj')
 | 
			
		||||
    feed(':s/\\%V')
 | 
			
		||||
    eq({ mode = 'c', blocking = false }, nvim('get_mode'))
 | 
			
		||||
    eq({ mode = 'c', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
    feed('<Esc>')
 | 
			
		||||
    eq({ mode = 'n', blocking = false }, nvim('get_mode'))
 | 
			
		||||
    eq({ mode = 'n', blocking = false }, meths.nvim_get_mode())
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('removes highlights after abort for a zero-width match', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -1118,9 +1118,9 @@ describe('regressions', function()
 | 
			
		||||
    screen = Screen.new(100, 20)
 | 
			
		||||
    screen:attach()
 | 
			
		||||
    -- line must be greater than MATCH_CHAR_MAX_LEN
 | 
			
		||||
    helpers.curbufmeths.set_lines(0, -1, false, { string.rep('a', 1000) .. 'hello' })
 | 
			
		||||
    helpers.meths.nvim_buf_set_lines(0, 0, -1, false, { string.rep('a', 1000) .. 'hello' })
 | 
			
		||||
    helpers.exec 'vnew'
 | 
			
		||||
    helpers.curbufmeths.set_lines(0, -1, false, { string.rep('a', 1010) .. 'world' })
 | 
			
		||||
    helpers.meths.nvim_buf_set_lines(0, 0, -1, false, { string.rep('a', 1010) .. 'world' })
 | 
			
		||||
    helpers.exec 'windo diffthis'
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -1133,9 +1133,9 @@ describe('regressions', function()
 | 
			
		||||
    for i = 0, 29 do
 | 
			
		||||
      lines[#lines + 1] = tostring(i)
 | 
			
		||||
    end
 | 
			
		||||
    helpers.curbufmeths.set_lines(0, -1, false, lines)
 | 
			
		||||
    helpers.meths.nvim_buf_set_lines(0, 0, -1, false, lines)
 | 
			
		||||
    helpers.exec 'vnew'
 | 
			
		||||
    helpers.curbufmeths.set_lines(0, -1, false, { '00', '29' })
 | 
			
		||||
    helpers.meths.nvim_buf_set_lines(0, 0, -1, false, { '00', '29' })
 | 
			
		||||
    helpers.exec 'windo diffthis'
 | 
			
		||||
    feed('<C-e>')
 | 
			
		||||
    screen:expect {
 | 
			
		||||
 
 | 
			
		||||
@@ -5,7 +5,7 @@ local feed, command, insert = helpers.feed, helpers.command, helpers.insert
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local curwin = helpers.curwin
 | 
			
		||||
local curwin = helpers.meths.nvim_get_current_win
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,6 @@ local exec = helpers.exec
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local is_os = helpers.is_os
 | 
			
		||||
 | 
			
		||||
describe("'spell'", function()
 | 
			
		||||
@@ -262,7 +261,7 @@ describe("'spell'", function()
 | 
			
		||||
    exec('echo ""')
 | 
			
		||||
    local ns = meths.nvim_create_namespace('spell')
 | 
			
		||||
    -- extmark with spell=true enables spell
 | 
			
		||||
    local id = curbufmeths.set_extmark(ns, 1, 4, { end_row = 1, end_col = 10, spell = true })
 | 
			
		||||
    local id = meths.nvim_buf_set_extmark(0, ns, 1, 4, { end_row = 1, end_col = 10, spell = true })
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {3:#include }{4:<stdbool.h>}                                                            |
 | 
			
		||||
      {5:bool} {1:func}({5:void});                                                                |
 | 
			
		||||
@@ -278,9 +277,9 @@ describe("'spell'", function()
 | 
			
		||||
      {0:~                                                                               }|*4
 | 
			
		||||
                                                                                      |
 | 
			
		||||
    ]])
 | 
			
		||||
    curbufmeths.del_extmark(ns, id)
 | 
			
		||||
    meths.nvim_buf_del_extmark(0, ns, id)
 | 
			
		||||
    -- extmark with spell=false disables spell
 | 
			
		||||
    id = curbufmeths.set_extmark(ns, 2, 18, { end_row = 2, end_col = 26, spell = false })
 | 
			
		||||
    id = meths.nvim_buf_set_extmark(0, ns, 2, 18, { end_row = 2, end_col = 26, spell = false })
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {3:#include }{4:<stdbool.h>}                                                            |
 | 
			
		||||
      {5:bool} ^func({5:void});                                                                |
 | 
			
		||||
@@ -297,7 +296,7 @@ describe("'spell'", function()
 | 
			
		||||
      {6:search hit TOP, continuing at BOTTOM}                                            |
 | 
			
		||||
    ]])
 | 
			
		||||
    exec('echo ""')
 | 
			
		||||
    curbufmeths.del_extmark(ns, id)
 | 
			
		||||
    meths.nvim_buf_del_extmark(0, ns, id)
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {3:#include }{4:<stdbool.h>}                                                            |
 | 
			
		||||
      {5:bool} func({5:void});                                                                |
 | 
			
		||||
@@ -369,7 +368,7 @@ describe("'spell'", function()
 | 
			
		||||
      call setline(1, "This is some text without any spell errors.")
 | 
			
		||||
    ]])
 | 
			
		||||
    local ns = meths.nvim_create_namespace('spell')
 | 
			
		||||
    curbufmeths.set_extmark(ns, 0, 0, { hl_group = 'WarningMsg', end_col = 43 })
 | 
			
		||||
    meths.nvim_buf_set_extmark(0, ns, 0, 0, { hl_group = 'WarningMsg', end_col = 43 })
 | 
			
		||||
    screen:expect([[
 | 
			
		||||
      {6:^This is some text without any spell errors.}|
 | 
			
		||||
      {0:~                                          }|
 | 
			
		||||
 
 | 
			
		||||
@@ -2,7 +2,7 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local curwin = helpers.curwin
 | 
			
		||||
local curwin = helpers.meths.nvim_get_current_win
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local exec_lua = helpers.exec_lua
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
 
 | 
			
		||||
@@ -8,7 +8,6 @@ local eq = helpers.eq
 | 
			
		||||
local poke_eventloop = helpers.poke_eventloop
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local curwin = helpers.curwin
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
 | 
			
		||||
describe('winbar', function()
 | 
			
		||||
@@ -52,7 +51,7 @@ describe('winbar', function()
 | 
			
		||||
    ]])
 | 
			
		||||
    -- winbar is excluded from the heights returned by winheight() and getwininfo()
 | 
			
		||||
    eq(11, funcs.winheight(0))
 | 
			
		||||
    local win_info = funcs.getwininfo(curwin().id)[1]
 | 
			
		||||
    local win_info = funcs.getwininfo(meths.nvim_get_current_win().id)[1]
 | 
			
		||||
    eq(11, win_info.height)
 | 
			
		||||
    eq(1, win_info.winbar)
 | 
			
		||||
  end)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,7 +1,7 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
local Screen = require('test.functional.ui.screen')
 | 
			
		||||
local neq, eq, command = helpers.neq, helpers.eq, helpers.command
 | 
			
		||||
local clear, curbufmeths = helpers.clear, helpers.curbufmeths
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
local exc_exec, expect, eval = helpers.exc_exec, helpers.expect, helpers.eval
 | 
			
		||||
local insert, pcall_err = helpers.insert, helpers.pcall_err
 | 
			
		||||
local matches = helpers.matches
 | 
			
		||||
@@ -97,8 +97,8 @@ describe('eval-API', function()
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    -- But others, like nvim_buf_set_lines(), which just changes text, is OK.
 | 
			
		||||
    curbufmeths.set_lines(0, -1, 1, { 'wow!' })
 | 
			
		||||
    eq({ 'wow!' }, curbufmeths.get_lines(0, -1, 1))
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, -1, 1, { 'wow!' })
 | 
			
		||||
    eq({ 'wow!' }, meths.nvim_buf_get_lines(0, 0, -1, 1))
 | 
			
		||||
 | 
			
		||||
    -- Turning the cmdwin buffer into a terminal buffer would be pretty weird.
 | 
			
		||||
    eq(
 | 
			
		||||
@@ -143,11 +143,11 @@ describe('eval-API', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('get_lines and set_lines use NL to represent NUL', function()
 | 
			
		||||
    curbufmeths.set_lines(0, -1, true, { 'aa\0', 'b\0b' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, -1, true, { 'aa\0', 'b\0b' })
 | 
			
		||||
    eq({ 'aa\n', 'b\nb' }, eval('nvim_buf_get_lines(0, 0, -1, 1)'))
 | 
			
		||||
 | 
			
		||||
    command('call nvim_buf_set_lines(0, 1, 2, v:true, ["xx", "\\nyy"])')
 | 
			
		||||
    eq({ 'aa\0', 'xx', '\0yy' }, curbufmeths.get_lines(0, -1, 1))
 | 
			
		||||
    eq({ 'aa\0', 'xx', '\0yy' }, meths.nvim_buf_get_lines(0, 0, -1, 1))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('that are FUNC_ATTR_NOEVAL cannot be called', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -6,10 +6,6 @@ local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local bufmeths = helpers.bufmeths
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local curwinmeths = helpers.curwinmeths
 | 
			
		||||
local curtabmeths = helpers.curtabmeths
 | 
			
		||||
local get_pathsep = helpers.get_pathsep
 | 
			
		||||
local rmdir = helpers.rmdir
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
@@ -196,7 +192,7 @@ describe('getbufline() function', function()
 | 
			
		||||
  end)
 | 
			
		||||
  it('returns empty list when range is invalid', function()
 | 
			
		||||
    eq({}, funcs.getbufline(1, 0))
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'foo', 'bar', 'baz' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'foo', 'bar', 'baz' })
 | 
			
		||||
    eq({}, funcs.getbufline(1, 2, 1))
 | 
			
		||||
    eq({}, funcs.getbufline(1, -10, -20))
 | 
			
		||||
    eq({}, funcs.getbufline(1, -2, -1))
 | 
			
		||||
@@ -205,9 +201,9 @@ describe('getbufline() function', function()
 | 
			
		||||
  it('returns expected lines', function()
 | 
			
		||||
    meths.nvim_set_option_value('hidden', true, {})
 | 
			
		||||
    command('file ' .. fname)
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'foo\0', '\0bar', 'baz' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'foo\0', '\0bar', 'baz' })
 | 
			
		||||
    command('edit ' .. fname2)
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'abc\0', '\0def', 'ghi' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'abc\0', '\0def', 'ghi' })
 | 
			
		||||
    eq({ 'foo\n', '\nbar', 'baz' }, funcs.getbufline(1, 1, 9999))
 | 
			
		||||
    eq({ 'abc\n', '\ndef', 'ghi' }, funcs.getbufline(2, 1, 9999))
 | 
			
		||||
    eq({ 'foo\n', '\nbar', 'baz' }, funcs.getbufline(1, 1, '$'))
 | 
			
		||||
@@ -247,7 +243,7 @@ describe('getbufvar() function', function()
 | 
			
		||||
    -- But with window-local options it probably does not what you expect
 | 
			
		||||
    command('setl number')
 | 
			
		||||
    -- (note that current window’s buffer is 2, but getbufvar() receives 1)
 | 
			
		||||
    eq({ id = 2 }, curwinmeths.get_buf())
 | 
			
		||||
    eq({ id = 2 }, meths.nvim_win_get_buf(0))
 | 
			
		||||
    eq(1, funcs.getbufvar(1, '&number'))
 | 
			
		||||
    eq(1, funcs.getbufvar(1, '&l:number'))
 | 
			
		||||
    -- You can get global value though, if you find this useful.
 | 
			
		||||
@@ -255,9 +251,9 @@ describe('getbufvar() function', function()
 | 
			
		||||
  end)
 | 
			
		||||
  it('returns expected variable value', function()
 | 
			
		||||
    eq(2, funcs.getbufvar(1, 'changedtick'))
 | 
			
		||||
    curbufmeths.set_lines(0, 1, false, { 'abc\0', '\0def', 'ghi' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, 1, false, { 'abc\0', '\0def', 'ghi' })
 | 
			
		||||
    eq(3, funcs.getbufvar(1, 'changedtick'))
 | 
			
		||||
    curbufmeths.set_var('test', true)
 | 
			
		||||
    meths.nvim_buf_set_var(0, 'test', true)
 | 
			
		||||
    eq(true, funcs.getbufvar(1, 'test'))
 | 
			
		||||
    eq({ test = true, changedtick = 3 }, funcs.getbufvar(1, ''))
 | 
			
		||||
    command('new')
 | 
			
		||||
@@ -288,9 +284,9 @@ describe('setbufvar() function', function()
 | 
			
		||||
    eq(false, meths.nvim_get_option_value('number', {}))
 | 
			
		||||
    command('split')
 | 
			
		||||
    command('new')
 | 
			
		||||
    eq(2, bufmeths.get_number(curwinmeths.get_buf()))
 | 
			
		||||
    eq(2, meths.nvim_buf_get_number(meths.nvim_win_get_buf(0)))
 | 
			
		||||
    funcs.setbufvar(1, '&number', true)
 | 
			
		||||
    local windows = curtabmeths.list_wins()
 | 
			
		||||
    local windows = meths.nvim_tabpage_list_wins(0)
 | 
			
		||||
    eq(false, meths.nvim_get_option_value('number', { win = windows[1].id }))
 | 
			
		||||
    eq(true, meths.nvim_get_option_value('number', { win = windows[2].id }))
 | 
			
		||||
    eq(false, meths.nvim_get_option_value('number', { win = windows[3].id }))
 | 
			
		||||
@@ -309,11 +305,11 @@ describe('setbufvar() function', function()
 | 
			
		||||
    local buf1 = meths.nvim_get_current_buf()
 | 
			
		||||
    command('split')
 | 
			
		||||
    command('new')
 | 
			
		||||
    eq(2, curbufmeths.get_number())
 | 
			
		||||
    eq(2, meths.nvim_buf_get_number(0))
 | 
			
		||||
    funcs.setbufvar(1, 'number', true)
 | 
			
		||||
    eq(true, bufmeths.get_var(buf1, 'number'))
 | 
			
		||||
    eq(true, meths.nvim_buf_get_var(buf1, 'number'))
 | 
			
		||||
    eq('Vim(call):E461: Illegal variable name: b:', exc_exec('call setbufvar(1, "", 0)'))
 | 
			
		||||
    eq(true, bufmeths.get_var(buf1, 'number'))
 | 
			
		||||
    eq(true, meths.nvim_buf_get_var(buf1, 'number'))
 | 
			
		||||
    eq(
 | 
			
		||||
      'Vim:E46: Cannot change read-only variable "b:changedtick"',
 | 
			
		||||
      pcall_err(funcs.setbufvar, 1, 'changedtick', true)
 | 
			
		||||
 
 | 
			
		||||
@@ -10,14 +10,13 @@ local command = helpers.command
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
 | 
			
		||||
before_each(clear)
 | 
			
		||||
 | 
			
		||||
local function changedtick()
 | 
			
		||||
  local ct = curbufmeths.get_changedtick()
 | 
			
		||||
  eq(ct, curbufmeths.get_var('changedtick'))
 | 
			
		||||
  eq(ct, curbufmeths.get_var('changedtick'))
 | 
			
		||||
  local ct = meths.nvim_buf_get_changedtick(0)
 | 
			
		||||
  eq(ct, meths.nvim_buf_get_var(0, 'changedtick'))
 | 
			
		||||
  eq(ct, meths.nvim_buf_get_var(0, 'changedtick'))
 | 
			
		||||
  eq(ct, eval('b:changedtick'))
 | 
			
		||||
  eq(ct, eval('b:["changedtick"]'))
 | 
			
		||||
  eq(ct, eval('b:.changedtick'))
 | 
			
		||||
@@ -46,11 +45,11 @@ describe('b:changedtick', function()
 | 
			
		||||
  it('increments at bdel', function()
 | 
			
		||||
    command('new')
 | 
			
		||||
    eq(2, changedtick())
 | 
			
		||||
    local bnr = curbufmeths.get_number()
 | 
			
		||||
    local bnr = meths.nvim_buf_get_number(0)
 | 
			
		||||
    eq(2, bnr)
 | 
			
		||||
    command('bdel')
 | 
			
		||||
    eq(3, funcs.getbufvar(bnr, 'changedtick'))
 | 
			
		||||
    eq(1, curbufmeths.get_number())
 | 
			
		||||
    eq(1, meths.nvim_buf_get_number(0))
 | 
			
		||||
  end)
 | 
			
		||||
  it('fails to be changed by user', function()
 | 
			
		||||
    local ct = changedtick()
 | 
			
		||||
@@ -72,7 +71,7 @@ describe('b:changedtick', function()
 | 
			
		||||
      'Vim(let):E46: Cannot change read-only variable "d.changedtick"',
 | 
			
		||||
      pcall_err(command, 'let d.changedtick = ' .. ctn)
 | 
			
		||||
    )
 | 
			
		||||
    eq('Key is read-only: changedtick', pcall_err(curbufmeths.set_var, 'changedtick', ctn))
 | 
			
		||||
    eq('Key is read-only: changedtick', pcall_err(meths.nvim_buf_set_var, 0, 'changedtick', ctn))
 | 
			
		||||
 | 
			
		||||
    eq(
 | 
			
		||||
      'Vim(unlet):E795: Cannot delete variable b:changedtick',
 | 
			
		||||
@@ -90,7 +89,7 @@ describe('b:changedtick', function()
 | 
			
		||||
      'Vim(unlet):E46: Cannot change read-only variable "d.changedtick"',
 | 
			
		||||
      pcall_err(command, 'unlet d.changedtick')
 | 
			
		||||
    )
 | 
			
		||||
    eq('Key is read-only: changedtick', pcall_err(curbufmeths.del_var, 'changedtick'))
 | 
			
		||||
    eq('Key is read-only: changedtick', pcall_err(meths.nvim_buf_del_var, 0, 'changedtick'))
 | 
			
		||||
    eq(ct, changedtick())
 | 
			
		||||
 | 
			
		||||
    eq(
 | 
			
		||||
 
 | 
			
		||||
@@ -7,7 +7,7 @@ local eq = helpers.eq
 | 
			
		||||
local eval = helpers.eval
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local map = vim.tbl_map
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local parse_context = helpers.parse_context
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
@@ -126,16 +126,16 @@ describe('context functions', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('saves and restores global variables properly', function()
 | 
			
		||||
      nvim('set_var', 'one', 1)
 | 
			
		||||
      nvim('set_var', 'Two', 2)
 | 
			
		||||
      nvim('set_var', 'THREE', 3)
 | 
			
		||||
      meths.nvim_set_var('one', 1)
 | 
			
		||||
      meths.nvim_set_var('Two', 2)
 | 
			
		||||
      meths.nvim_set_var('THREE', 3)
 | 
			
		||||
      eq({ 1, 2, 3 }, eval('[g:one, g:Two, g:THREE]'))
 | 
			
		||||
      call('ctxpush')
 | 
			
		||||
      call('ctxpush', { 'gvars' })
 | 
			
		||||
 | 
			
		||||
      nvim('del_var', 'one')
 | 
			
		||||
      nvim('del_var', 'Two')
 | 
			
		||||
      nvim('del_var', 'THREE')
 | 
			
		||||
      meths.nvim_del_var('one')
 | 
			
		||||
      meths.nvim_del_var('Two')
 | 
			
		||||
      meths.nvim_del_var('THREE')
 | 
			
		||||
      eq('Vim:E121: Undefined variable: g:one', pcall_err(eval, 'g:one'))
 | 
			
		||||
      eq('Vim:E121: Undefined variable: g:Two', pcall_err(eval, 'g:Two'))
 | 
			
		||||
      eq('Vim:E121: Undefined variable: g:THREE', pcall_err(eval, 'g:THREE'))
 | 
			
		||||
@@ -143,9 +143,9 @@ describe('context functions', function()
 | 
			
		||||
      call('ctxpop')
 | 
			
		||||
      eq({ 1, 2, 3 }, eval('[g:one, g:Two, g:THREE]'))
 | 
			
		||||
 | 
			
		||||
      nvim('del_var', 'one')
 | 
			
		||||
      nvim('del_var', 'Two')
 | 
			
		||||
      nvim('del_var', 'THREE')
 | 
			
		||||
      meths.nvim_del_var('one')
 | 
			
		||||
      meths.nvim_del_var('Two')
 | 
			
		||||
      meths.nvim_del_var('THREE')
 | 
			
		||||
      eq('Vim:E121: Undefined variable: g:one', pcall_err(eval, 'g:one'))
 | 
			
		||||
      eq('Vim:E121: Undefined variable: g:Two', pcall_err(eval, 'g:Two'))
 | 
			
		||||
      eq('Vim:E121: Undefined variable: g:THREE', pcall_err(eval, 'g:THREE'))
 | 
			
		||||
@@ -300,9 +300,9 @@ describe('context functions', function()
 | 
			
		||||
      feed('G')
 | 
			
		||||
      feed('gg')
 | 
			
		||||
      command('edit ' .. fname2)
 | 
			
		||||
      nvim('set_var', 'one', 1)
 | 
			
		||||
      nvim('set_var', 'Two', 2)
 | 
			
		||||
      nvim('set_var', 'THREE', 3)
 | 
			
		||||
      meths.nvim_set_var('one', 1)
 | 
			
		||||
      meths.nvim_set_var('Two', 2)
 | 
			
		||||
      meths.nvim_set_var('THREE', 3)
 | 
			
		||||
 | 
			
		||||
      local with_regs = {
 | 
			
		||||
        ['regs'] = {
 | 
			
		||||
@@ -412,14 +412,14 @@ describe('context functions', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('sets context dictionary at index in context stack', function()
 | 
			
		||||
      nvim('set_var', 'one', 1)
 | 
			
		||||
      nvim('set_var', 'Two', 2)
 | 
			
		||||
      nvim('set_var', 'THREE', 3)
 | 
			
		||||
      meths.nvim_set_var('one', 1)
 | 
			
		||||
      meths.nvim_set_var('Two', 2)
 | 
			
		||||
      meths.nvim_set_var('THREE', 3)
 | 
			
		||||
      call('ctxpush')
 | 
			
		||||
      local ctx1 = call('ctxget')
 | 
			
		||||
      nvim('set_var', 'one', 'a')
 | 
			
		||||
      nvim('set_var', 'Two', 'b')
 | 
			
		||||
      nvim('set_var', 'THREE', 'c')
 | 
			
		||||
      meths.nvim_set_var('one', 'a')
 | 
			
		||||
      meths.nvim_set_var('Two', 'b')
 | 
			
		||||
      meths.nvim_set_var('THREE', 'c')
 | 
			
		||||
      call('ctxpush')
 | 
			
		||||
      call('ctxpush')
 | 
			
		||||
      local ctx2 = call('ctxget')
 | 
			
		||||
@@ -431,7 +431,7 @@ describe('context functions', function()
 | 
			
		||||
      eq({ 1, 2, 3 }, eval('[g:one, g:Two, g:THREE]'))
 | 
			
		||||
      call('ctxpop')
 | 
			
		||||
      eq({ 'a', 'b', 'c' }, eval('[g:one, g:Two, g:THREE]'))
 | 
			
		||||
      nvim('set_var', 'one', 1.5)
 | 
			
		||||
      meths.nvim_set_var('one', 1.5)
 | 
			
		||||
      eq({ 1.5, 'b', 'c' }, eval('[g:one, g:Two, g:THREE]'))
 | 
			
		||||
      call('ctxpop')
 | 
			
		||||
      eq({ 'a', 'b', 'c' }, eval('[g:one, g:Two, g:THREE]'))
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ local clear = helpers.clear
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local eq = helpers.eq
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local get_cur_win_var = helpers.curwinmeths.get_var
 | 
			
		||||
local get_win_var = helpers.meths.nvim_win_get_var
 | 
			
		||||
 | 
			
		||||
describe('setqflist()', function()
 | 
			
		||||
  local setqflist = helpers.funcs.setqflist
 | 
			
		||||
@@ -26,15 +26,15 @@ describe('setqflist()', function()
 | 
			
		||||
  it('sets w:quickfix_title', function()
 | 
			
		||||
    setqflist({ '' }, 'r', 'foo')
 | 
			
		||||
    command('copen')
 | 
			
		||||
    eq('foo', get_cur_win_var('quickfix_title'))
 | 
			
		||||
    eq('foo', get_win_var(0, 'quickfix_title'))
 | 
			
		||||
    setqflist({}, 'r', { ['title'] = 'qf_title' })
 | 
			
		||||
    eq('qf_title', get_cur_win_var('quickfix_title'))
 | 
			
		||||
    eq('qf_title', get_win_var(0, 'quickfix_title'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('allows string {what} for backwards compatibility', function()
 | 
			
		||||
    setqflist({}, 'r', '5')
 | 
			
		||||
    command('copen')
 | 
			
		||||
    eq('5', get_cur_win_var('quickfix_title'))
 | 
			
		||||
    eq('5', get_win_var(0, 'quickfix_title'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('requires a dict for {what}', function()
 | 
			
		||||
@@ -67,9 +67,9 @@ describe('setloclist()', function()
 | 
			
		||||
    setloclist(1, {}, 'r', 'foo')
 | 
			
		||||
    setloclist(2, {}, 'r', 'bar')
 | 
			
		||||
    command('lopen')
 | 
			
		||||
    eq('bar', get_cur_win_var('quickfix_title'))
 | 
			
		||||
    eq('bar', get_win_var(0, 'quickfix_title'))
 | 
			
		||||
    command('lclose | wincmd w | lopen')
 | 
			
		||||
    eq('foo', get_cur_win_var('quickfix_title'))
 | 
			
		||||
    eq('foo', get_win_var(0, 'quickfix_title'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it("doesn't crash when when window is closed in the middle #13721", function()
 | 
			
		||||
 
 | 
			
		||||
@@ -9,7 +9,6 @@ local expect = helpers.expect
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local exec_capture = helpers.exec_capture
 | 
			
		||||
@@ -37,16 +36,16 @@ describe('maparg()', function()
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  it('returns a dictionary', function()
 | 
			
		||||
    nvim('command', 'nnoremap foo bar')
 | 
			
		||||
    command('nnoremap foo bar')
 | 
			
		||||
    eq('bar', funcs.maparg('foo'))
 | 
			
		||||
    eq(foo_bar_map_table, funcs.maparg('foo', 'n', false, true))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('returns 1 for silent when <silent> is used', function()
 | 
			
		||||
    nvim('command', 'nnoremap <silent> foo bar')
 | 
			
		||||
    command('nnoremap <silent> foo bar')
 | 
			
		||||
    eq(1, funcs.maparg('foo', 'n', false, true)['silent'])
 | 
			
		||||
 | 
			
		||||
    nvim('command', 'nnoremap baz bat')
 | 
			
		||||
    command('nnoremap baz bat')
 | 
			
		||||
    eq(0, funcs.maparg('baz', 'n', false, true)['silent'])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -59,8 +58,8 @@ describe('maparg()', function()
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('returns the same value for noremap and <script>', function()
 | 
			
		||||
    nvim('command', 'inoremap <script> hello world')
 | 
			
		||||
    nvim('command', 'inoremap this that')
 | 
			
		||||
    command('inoremap <script> hello world')
 | 
			
		||||
    command('inoremap this that')
 | 
			
		||||
    eq(
 | 
			
		||||
      funcs.maparg('hello', 'i', false, true)['noremap'],
 | 
			
		||||
      funcs.maparg('this', 'i', false, true)['noremap']
 | 
			
		||||
@@ -69,14 +68,14 @@ describe('maparg()', function()
 | 
			
		||||
 | 
			
		||||
  it('returns a boolean for buffer', function()
 | 
			
		||||
    -- Open enough windows to know we aren't on buffer number 1
 | 
			
		||||
    nvim('command', 'new')
 | 
			
		||||
    nvim('command', 'new')
 | 
			
		||||
    nvim('command', 'new')
 | 
			
		||||
    nvim('command', 'cnoremap <buffer> this that')
 | 
			
		||||
    command('new')
 | 
			
		||||
    command('new')
 | 
			
		||||
    command('new')
 | 
			
		||||
    command('cnoremap <buffer> this that')
 | 
			
		||||
    eq(1, funcs.maparg('this', 'c', false, true)['buffer'])
 | 
			
		||||
 | 
			
		||||
    -- Global will return 0 always
 | 
			
		||||
    nvim('command', 'nnoremap other another')
 | 
			
		||||
    command('nnoremap other another')
 | 
			
		||||
    eq(0, funcs.maparg('other', 'n', false, true)['buffer'])
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
@@ -89,7 +88,7 @@ describe('maparg()', function()
 | 
			
		||||
      nnoremap fizz :call <SID>maparg_test_function()<CR>
 | 
			
		||||
    ]])
 | 
			
		||||
    eq(1, funcs.maparg('fizz', 'n', false, true)['sid'])
 | 
			
		||||
    eq('testing', nvim('call_function', '<SNR>1_maparg_test_function', {}))
 | 
			
		||||
    eq('testing', meths.nvim_call_function('<SNR>1_maparg_test_function', {}))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('works with <F12> and others', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -3,7 +3,7 @@ local clear = helpers.clear
 | 
			
		||||
local funcs = helpers.funcs
 | 
			
		||||
local eval, eq = helpers.eval, helpers.eq
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local is_os = helpers.is_os
 | 
			
		||||
 | 
			
		||||
@@ -12,7 +12,7 @@ describe('msgpack*() functions', function()
 | 
			
		||||
 | 
			
		||||
  local obj_test = function(msg, obj)
 | 
			
		||||
    it(msg, function()
 | 
			
		||||
      nvim('set_var', 'obj', obj)
 | 
			
		||||
      meths.nvim_set_var('obj', obj)
 | 
			
		||||
      eq(obj, eval('msgpackparse(msgpackdump(g:obj))'))
 | 
			
		||||
      eq(obj, eval('msgpackparse(msgpackdump(g:obj, "B"))'))
 | 
			
		||||
    end)
 | 
			
		||||
 
 | 
			
		||||
@@ -1,6 +1,5 @@
 | 
			
		||||
local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local clear = helpers.clear
 | 
			
		||||
@@ -72,10 +71,10 @@ describe('NULL', function()
 | 
			
		||||
    null_expr_test('is not locked', 'islocked("v:_null_list")', 0, 0)
 | 
			
		||||
    null_test('is accepted by :for', 'for x in L|throw x|endfor', 0)
 | 
			
		||||
    null_expr_test('does not crash append()', 'append(0, L)', 0, 0, function()
 | 
			
		||||
      eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
      eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
    end)
 | 
			
		||||
    null_expr_test('does not crash setline()', 'setline(1, L)', 0, 0, function()
 | 
			
		||||
      eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
      eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
    end)
 | 
			
		||||
    null_expr_test('is identical to itself', 'L is L', 0, 1)
 | 
			
		||||
    null_expr_test('can be sliced', 'L[:]', 0, {})
 | 
			
		||||
@@ -184,7 +183,7 @@ describe('NULL', function()
 | 
			
		||||
      0,
 | 
			
		||||
      '',
 | 
			
		||||
      function()
 | 
			
		||||
        eq({ '' }, curbufmeths.get_lines(0, -1, false))
 | 
			
		||||
        eq({ '' }, meths.nvim_buf_get_lines(0, 0, -1, false))
 | 
			
		||||
      end
 | 
			
		||||
    )
 | 
			
		||||
    null_expr_test('is accepted by setmatches()', 'setmatches(L)', 0, 0)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,14 +4,14 @@ local helpers = require('test.functional.helpers')(after_each)
 | 
			
		||||
 | 
			
		||||
local assert_alive = helpers.assert_alive
 | 
			
		||||
local testprg = helpers.testprg
 | 
			
		||||
local eq, call, clear, eval, feed_command, feed, nvim =
 | 
			
		||||
local eq, call, clear, eval, feed_command, feed, meths =
 | 
			
		||||
  helpers.eq,
 | 
			
		||||
  helpers.call,
 | 
			
		||||
  helpers.clear,
 | 
			
		||||
  helpers.eval,
 | 
			
		||||
  helpers.feed_command,
 | 
			
		||||
  helpers.feed,
 | 
			
		||||
  helpers.nvim
 | 
			
		||||
  helpers.meths
 | 
			
		||||
local command = helpers.command
 | 
			
		||||
local insert = helpers.insert
 | 
			
		||||
local expect = helpers.expect
 | 
			
		||||
@@ -220,8 +220,8 @@ describe('system()', function()
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    it('prints verbose information', function()
 | 
			
		||||
      nvim('set_option_value', 'shell', 'fake_shell', {})
 | 
			
		||||
      nvim('set_option_value', 'shellcmdflag', 'cmdflag', {})
 | 
			
		||||
      meths.nvim_set_option_value('shell', 'fake_shell', {})
 | 
			
		||||
      meths.nvim_set_option_value('shellcmdflag', 'cmdflag', {})
 | 
			
		||||
 | 
			
		||||
      screen:try_resize(72, 14)
 | 
			
		||||
      feed(':4verbose echo system("echo hi")<cr>')
 | 
			
		||||
@@ -346,7 +346,7 @@ describe('system()', function()
 | 
			
		||||
        input[#input + 1] = '01234567890ABCDEFabcdef'
 | 
			
		||||
      end
 | 
			
		||||
      input = table.concat(input, '\n')
 | 
			
		||||
      nvim('set_var', 'input', input)
 | 
			
		||||
      meths.nvim_set_var('input', input)
 | 
			
		||||
      eq(input, eval('system("cat -", g:input)'))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
@@ -480,7 +480,7 @@ describe('systemlist()', function()
 | 
			
		||||
      for _ = 1, 0xffff do
 | 
			
		||||
        input[#input + 1] = '01234567890ABCDEFabcdef'
 | 
			
		||||
      end
 | 
			
		||||
      nvim('set_var', 'input', input)
 | 
			
		||||
      meths.nvim_set_var('input', input)
 | 
			
		||||
      eq(input, eval('systemlist("cat -", g:input)'))
 | 
			
		||||
    end)
 | 
			
		||||
  end)
 | 
			
		||||
 
 | 
			
		||||
@@ -4,7 +4,7 @@ local feed, eq, eval, ok = helpers.feed, helpers.eq, helpers.eval, helpers.ok
 | 
			
		||||
local source, nvim_async, run = helpers.source, helpers.nvim_async, helpers.run
 | 
			
		||||
local clear, command, funcs = helpers.clear, helpers.command, helpers.funcs
 | 
			
		||||
local exc_exec = helpers.exc_exec
 | 
			
		||||
local curbufmeths = helpers.curbufmeths
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local load_adjust = helpers.load_adjust
 | 
			
		||||
local retry = helpers.retry
 | 
			
		||||
 | 
			
		||||
@@ -111,7 +111,7 @@ describe('timers', function()
 | 
			
		||||
      [1] = { bold = true, foreground = Screen.colors.Blue },
 | 
			
		||||
    })
 | 
			
		||||
 | 
			
		||||
    curbufmeths.set_lines(0, -1, true, { 'ITEM 1', 'ITEM 2' })
 | 
			
		||||
    meths.nvim_buf_set_lines(0, 0, -1, true, { 'ITEM 1', 'ITEM 2' })
 | 
			
		||||
    source([[
 | 
			
		||||
      let g:cont = 0
 | 
			
		||||
      func! AddItem(timer)
 | 
			
		||||
 
 | 
			
		||||
@@ -7,14 +7,14 @@ local eq = helpers.eq
 | 
			
		||||
local feed = helpers.feed
 | 
			
		||||
local feed_command = helpers.feed_command
 | 
			
		||||
local next_msg = helpers.next_msg
 | 
			
		||||
local nvim = helpers.nvim
 | 
			
		||||
local meths = helpers.meths
 | 
			
		||||
local source = helpers.source
 | 
			
		||||
local pcall_err = helpers.pcall_err
 | 
			
		||||
 | 
			
		||||
before_each(function()
 | 
			
		||||
  clear()
 | 
			
		||||
  local channel = nvim('get_api_info')[1]
 | 
			
		||||
  nvim('set_var', 'channel', channel)
 | 
			
		||||
  local channel = meths.nvim_get_api_info()[1]
 | 
			
		||||
  meths.nvim_set_var('channel', channel)
 | 
			
		||||
end)
 | 
			
		||||
 | 
			
		||||
describe('wait()', function()
 | 
			
		||||
@@ -61,13 +61,13 @@ describe('wait()', function()
 | 
			
		||||
 | 
			
		||||
    -- XXX: flaky (#11137)
 | 
			
		||||
    helpers.retry(nil, nil, function()
 | 
			
		||||
      nvim('set_var', 'counter', 0)
 | 
			
		||||
      meths.nvim_set_var('counter', 0)
 | 
			
		||||
      eq(-1, call('wait', 20, 'Count() >= 5', 99999))
 | 
			
		||||
    end)
 | 
			
		||||
 | 
			
		||||
    nvim('set_var', 'counter', 0)
 | 
			
		||||
    meths.nvim_set_var('counter', 0)
 | 
			
		||||
    eq(0, call('wait', 10000, 'Count() >= 5', 5))
 | 
			
		||||
    eq(5, nvim('get_var', 'counter'))
 | 
			
		||||
    eq(5, meths.nvim_get_var('counter'))
 | 
			
		||||
  end)
 | 
			
		||||
 | 
			
		||||
  it('validates args', function()
 | 
			
		||||
 
 | 
			
		||||
@@ -2104,7 +2104,7 @@ func Test_trim()
 | 
			
		||||
  call assert_equal(" \tabcd\t     xxxx   tail", trim(" \tabcd\t     xxxx   tail", "abx"))
 | 
			
		||||
  call assert_equal("RESERVE", trim("你RESERVE好", "你好"))
 | 
			
		||||
  call assert_equal("您R E SER V E早", trim("你好您R E SER V E早好你你", "你好"))
 | 
			
		||||
  call assert_equal("你好您R E SER V E早好你你", trim(" \n\r\r   你好您R E SER V E早好你你    \t  \x0B", ))
 | 
			
		||||
  call assert_equal("你好您R E SER V E早好你你", trim(" \n\r\r   你好您R E SER V E早好你你    \t  \x0B"))
 | 
			
		||||
  call assert_equal("您R E SER V E早好你你    \t  \x0B", trim("    你好您R E SER V E早好你你    \t  \x0B", " 你好"))
 | 
			
		||||
  call assert_equal("您R E SER V E早好你你    \t  \x0B", trim("    tteesstttt你好您R E SER V E早好你你    \t  \x0B ttestt", " 你好tes"))
 | 
			
		||||
  call assert_equal("您R E SER V E早好你你    \t  \x0B", trim("    tteesstttt你好您R E SER V E早好你你    \t  \x0B ttestt", "   你你你好好好tttsses"))
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user