mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	Steps to reproduce:
1. setting `vim.highlight.on_yank`
   ```
   vim.api.nvim_create_autocmd({ "TextYankPost" }, {
     pattern = { "*" },
     callback = function()
       vim.highlight.on_yank({ timeout = 200 })
     end,
   })
   ```
2. repeat typing `yeye` ...
3. causes the following error.
   ```
   Error executing vim.schedule lua callback: vim/_editor.lua:0: handle 0x01e96970 is already closing
   stack traceback:
           [C]: in function 'close'
           vim/_editor.lua: in function ''
           vim/_editor.lua: in function <vim/_editor.lua:0>
   ```
📝 Test result before fix:
    [----------] Global test environment setup.
    [----------] Running tests from test/functional/lua/highlight_spec.lua
    [ RUN      ] vim.highlight.on_yank does not show errors even if buffer is wiped before timeout: 15.07 ms OK
    [ RUN      ] vim.highlight.on_yank does not show errors even if executed between timeout and clearing highlight: 15.07 ms ERR
    test/helpers.lua:73: Expected objects to be the same.
    Passed in:
    (string) 'Error executing vim.schedule lua callback: vim/_editor.lua:0: handle 0x02025260 is already closing
    stack traceback:
            [C]: in function 'close'
            vim/_editor.lua: in function ''
            vim/_editor.lua: in function <vim/_editor.lua:0>'
    Expected:
    (string) ''
		
	
		
			
				
	
	
		
			35 lines
		
	
	
		
			1021 B
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			1021 B
		
	
	
	
		
			Lua
		
	
	
	
	
	
local helpers = require('test.functional.helpers')(after_each)
 | 
						|
local exec_lua = helpers.exec_lua
 | 
						|
local eq = helpers.eq
 | 
						|
local eval = helpers.eval
 | 
						|
local command = helpers.command
 | 
						|
local clear = helpers.clear
 | 
						|
 | 
						|
describe('vim.highlight.on_yank', function()
 | 
						|
  before_each(function()
 | 
						|
    clear()
 | 
						|
  end)
 | 
						|
 | 
						|
  it('does not show errors even if buffer is wiped before timeout', function()
 | 
						|
    command('new')
 | 
						|
    exec_lua([[
 | 
						|
      vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y", regtype = "v"}})
 | 
						|
      vim.cmd('bwipeout!')
 | 
						|
    ]])
 | 
						|
    helpers.sleep(10)
 | 
						|
    helpers.feed('<cr>') -- avoid hang if error message exists
 | 
						|
    eq('', eval('v:errmsg'))
 | 
						|
  end)
 | 
						|
 | 
						|
  it('does not close timer twice', function()
 | 
						|
    exec_lua([[
 | 
						|
      vim.highlight.on_yank({timeout = 10, on_macro = true, event = {operator = "y"}})
 | 
						|
      vim.loop.sleep(10)
 | 
						|
      vim.schedule(function()
 | 
						|
        vim.highlight.on_yank({timeout = 0, on_macro = true, event = {operator = "y"}})
 | 
						|
      end)
 | 
						|
    ]])
 | 
						|
    eq('', eval('v:errmsg'))
 | 
						|
  end)
 | 
						|
end)
 |