mirror of
				https://github.com/neovim/neovim.git
				synced 2025-11-04 01:34:25 +00:00 
			
		
		
		
	When a plugin registers a TermRequest handler there is currently no way for the handler to know where the terminal's cursor position was when the sequence was received. This is often useful information, e.g. for OSC 133 sequences which are used to annotate shell prompts. Modify the event data for the TermRequest autocommand to be a table instead of just a string. The "sequence" field of the table contains the sequence string and the "cursor" field contains the cursor position when the sequence was received. To maintain consistency between TermRequest and TermResponse (and to future proof the latter), TermResponse's event data is also updated to be a table with a "sequence" field. BREAKING CHANGE: event data for TermRequest and TermResponse is now a table
		
			
				
	
	
		
			349 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
			
		
		
	
	
			349 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			Lua
		
	
	
	
	
	
--
 | 
						|
-- Tests for default autocmds, mappings, commands, and menus.
 | 
						|
--
 | 
						|
-- See options/defaults_spec.lua for default options and environment decisions.
 | 
						|
--
 | 
						|
 | 
						|
local t = require('test.testutil')
 | 
						|
local n = require('test.functional.testnvim')()
 | 
						|
local Screen = require('test.functional.ui.screen')
 | 
						|
 | 
						|
describe('default', function()
 | 
						|
  describe('autocommands', function()
 | 
						|
    it('nvim.terminal.TermClose closes terminal with default shell on success', function()
 | 
						|
      n.clear()
 | 
						|
      n.api.nvim_set_option_value('shell', n.testprg('shell-test'), {})
 | 
						|
      n.command('set shellcmdflag=EXIT shellredir= shellpipe= shellquote= shellxquote=')
 | 
						|
 | 
						|
      -- Should not block other events
 | 
						|
      n.command('let g:n=0')
 | 
						|
      n.command('au BufEnter * let g:n = g:n + 1')
 | 
						|
 | 
						|
      n.command('terminal')
 | 
						|
      t.eq(1, n.eval('get(g:, "n", 0)'))
 | 
						|
 | 
						|
      t.retry(nil, 1000, function()
 | 
						|
        t.neq('terminal', n.api.nvim_get_option_value('buftype', { buf = 0 }))
 | 
						|
        t.eq(2, n.eval('get(g:, "n", 0)'))
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
  end)
 | 
						|
 | 
						|
  describe('popupmenu', function()
 | 
						|
    it('can be disabled by user', function()
 | 
						|
      n.clear {
 | 
						|
        args = { '+autocmd! nvim.popupmenu', '+aunmenu PopUp' },
 | 
						|
      }
 | 
						|
      local screen = Screen.new(40, 8)
 | 
						|
      n.insert([[
 | 
						|
        1 line 1
 | 
						|
        2 https://example.com
 | 
						|
        3 line 3
 | 
						|
        4 line 4]])
 | 
						|
 | 
						|
      n.api.nvim_input_mouse('right', 'press', '', 0, 1, 4)
 | 
						|
      screen:expect({
 | 
						|
        grid = [[
 | 
						|
          1 line 1                                |
 | 
						|
          2 ht^tps://example.com                   |
 | 
						|
          3 line 3                                |
 | 
						|
          4 line 4                                |
 | 
						|
          {1:~                                       }|*3
 | 
						|
                                                  |
 | 
						|
        ]],
 | 
						|
      })
 | 
						|
    end)
 | 
						|
 | 
						|
    it('right-click on URL shows "Open in web browser"', function()
 | 
						|
      n.clear()
 | 
						|
      local screen = Screen.new(40, 8)
 | 
						|
      n.insert([[
 | 
						|
        1 line 1
 | 
						|
        2 https://example.com
 | 
						|
        3 line 3
 | 
						|
        4 line 4]])
 | 
						|
 | 
						|
      n.api.nvim_input_mouse('right', 'press', '', 0, 3, 4)
 | 
						|
      screen:expect({
 | 
						|
        grid = [[
 | 
						|
          1 line 1                                |
 | 
						|
          2 https://example.com                   |
 | 
						|
          3 line 3                                |
 | 
						|
          4 li^ne 4                                |
 | 
						|
          {1:~  }{4: Inspect              }{1:               }|
 | 
						|
          {1:~  }{4:                      }{1:               }|
 | 
						|
          {1:~  }{4: Paste                }{1:               }|
 | 
						|
             {4: Select All           }               |
 | 
						|
        ]],
 | 
						|
      })
 | 
						|
 | 
						|
      n.api.nvim_input_mouse('right', 'press', '', 0, 1, 4)
 | 
						|
      screen:expect({
 | 
						|
        grid = [[
 | 
						|
          1 line 1                                |
 | 
						|
          2 ht^tps://example.com                   |
 | 
						|
          3 l{4: Open in web browser  }               |
 | 
						|
          4 l{4: Inspect              }               |
 | 
						|
          {1:~  }{4:                      }{1:               }|
 | 
						|
          {1:~  }{4: Paste                }{1:               }|
 | 
						|
          {1:~  }{4: Select All           }{1:               }|
 | 
						|
             {4:                      }               |
 | 
						|
        ]],
 | 
						|
      })
 | 
						|
    end)
 | 
						|
  end)
 | 
						|
 | 
						|
  describe('key mappings', function()
 | 
						|
    describe('Visual mode search mappings', function()
 | 
						|
      it('handle various chars properly', function()
 | 
						|
        n.clear({ args_rm = { '--cmd' } })
 | 
						|
        local screen = Screen.new(60, 8)
 | 
						|
        screen:set_default_attr_ids({
 | 
						|
          [1] = { foreground = Screen.colors.NvimDarkGray4 },
 | 
						|
          [2] = {
 | 
						|
            foreground = Screen.colors.NvimDarkGray3,
 | 
						|
            background = Screen.colors.NvimLightGray3,
 | 
						|
          },
 | 
						|
          [3] = {
 | 
						|
            foreground = Screen.colors.NvimLightGrey1,
 | 
						|
            background = Screen.colors.NvimDarkYellow,
 | 
						|
          },
 | 
						|
          [4] = {
 | 
						|
            foreground = Screen.colors.NvimDarkGrey1,
 | 
						|
            background = Screen.colors.NvimLightYellow,
 | 
						|
          },
 | 
						|
        })
 | 
						|
        n.api.nvim_buf_set_lines(0, 0, -1, true, {
 | 
						|
          [[testing <CR> /?\!1]],
 | 
						|
          [[testing <CR> /?\!2]],
 | 
						|
          [[testing <CR> /?\!3]],
 | 
						|
          [[testing <CR> /?\!4]],
 | 
						|
        })
 | 
						|
        n.feed('gg0vf!')
 | 
						|
        n.poke_eventloop()
 | 
						|
        n.feed('*')
 | 
						|
        screen:expect([[
 | 
						|
          {3:testing <CR> /?\!}1                                          |
 | 
						|
          {4:^testing <CR> /?\!}2                                          |
 | 
						|
          {3:testing <CR> /?\!}3                                          |
 | 
						|
          {3:testing <CR> /?\!}4                                          |
 | 
						|
          {1:~                                                           }|*2
 | 
						|
          {2:[No Name] [+]                             2,1            All}|
 | 
						|
          /\Vtesting <CR> /?\\!                     [2/4]             |
 | 
						|
        ]])
 | 
						|
        n.feed('n')
 | 
						|
        screen:expect([[
 | 
						|
          {3:testing <CR> /?\!}1                                          |
 | 
						|
          {3:testing <CR> /?\!}2                                          |
 | 
						|
          {4:^testing <CR> /?\!}3                                          |
 | 
						|
          {3:testing <CR> /?\!}4                                          |
 | 
						|
          {1:~                                                           }|*2
 | 
						|
          {2:[No Name] [+]                             3,1            All}|
 | 
						|
          /\Vtesting <CR> /?\\!                     [3/4]             |
 | 
						|
        ]])
 | 
						|
        n.feed('G0vf!')
 | 
						|
        n.poke_eventloop()
 | 
						|
        n.feed('#')
 | 
						|
        screen:expect([[
 | 
						|
          {3:testing <CR> /?\!}1                                          |
 | 
						|
          {3:testing <CR> /?\!}2                                          |
 | 
						|
          {4:^testing <CR> /?\!}3                                          |
 | 
						|
          {3:testing <CR> /?\!}4                                          |
 | 
						|
          {1:~                                                           }|*2
 | 
						|
          {2:[No Name] [+]                             3,1            All}|
 | 
						|
          ?\Vtesting <CR> /?\\!                     [3/4]             |
 | 
						|
        ]])
 | 
						|
        n.feed('n')
 | 
						|
        screen:expect([[
 | 
						|
          {3:testing <CR> /?\!}1                                          |
 | 
						|
          {4:^testing <CR> /?\!}2                                          |
 | 
						|
          {3:testing <CR> /?\!}3                                          |
 | 
						|
          {3:testing <CR> /?\!}4                                          |
 | 
						|
          {1:~                                                           }|*2
 | 
						|
          {2:[No Name] [+]                             2,1            All}|
 | 
						|
          ?\Vtesting <CR> /?\\!                     [2/4]             |
 | 
						|
        ]])
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
 | 
						|
    describe('unimpaired-style mappings', function()
 | 
						|
      it('show the command output when successful', function()
 | 
						|
        n.clear({ args_rm = { '--cmd' } })
 | 
						|
        local screen = Screen.new(40, 8)
 | 
						|
        n.fn.setqflist({
 | 
						|
          { filename = 'file1', text = 'item1' },
 | 
						|
          { filename = 'file2', text = 'item2' },
 | 
						|
        })
 | 
						|
 | 
						|
        n.feed(']q')
 | 
						|
 | 
						|
        screen:set_default_attr_ids({
 | 
						|
          [1] = { foreground = Screen.colors.NvimDarkGrey4 },
 | 
						|
          [2] = {
 | 
						|
            background = Screen.colors.NvimLightGray3,
 | 
						|
            foreground = Screen.colors.NvimDarkGrey3,
 | 
						|
          },
 | 
						|
        })
 | 
						|
        screen:expect({
 | 
						|
          grid = [[
 | 
						|
            ^                                        |
 | 
						|
            {1:~                                       }|*5
 | 
						|
            {2:file2                 0,0-1          All}|
 | 
						|
            (2 of 2): item2                         |
 | 
						|
          ]],
 | 
						|
        })
 | 
						|
      end)
 | 
						|
 | 
						|
      it('do not show a full stack trace when unsuccessful #30625', function()
 | 
						|
        n.clear({ args_rm = { '--cmd' } })
 | 
						|
        local screen = Screen.new(40, 8)
 | 
						|
        screen:set_default_attr_ids({
 | 
						|
          [1] = { foreground = Screen.colors.NvimDarkGray4 },
 | 
						|
          [2] = {
 | 
						|
            background = Screen.colors.NvimLightGrey3,
 | 
						|
            foreground = Screen.colors.NvimDarkGray3,
 | 
						|
          },
 | 
						|
          [3] = { foreground = Screen.colors.NvimLightRed },
 | 
						|
          [4] = { foreground = Screen.colors.NvimLightCyan },
 | 
						|
        })
 | 
						|
 | 
						|
        n.feed('[a')
 | 
						|
        screen:expect({
 | 
						|
          grid = [[
 | 
						|
                                                    |
 | 
						|
            {1:~                                       }|*4
 | 
						|
            {2:                                        }|
 | 
						|
            {3:E163: There is only one file to edit}    |
 | 
						|
            {4:Press ENTER or type command to continue}^ |
 | 
						|
          ]],
 | 
						|
        })
 | 
						|
 | 
						|
        n.feed('[q')
 | 
						|
        screen:expect({
 | 
						|
          grid = [[
 | 
						|
            ^                                        |
 | 
						|
            {1:~                                       }|*5
 | 
						|
            {2:[No Name]             0,0-1          All}|
 | 
						|
            {3:E42: No Errors}                          |
 | 
						|
          ]],
 | 
						|
        })
 | 
						|
 | 
						|
        n.feed('[l')
 | 
						|
        screen:expect({
 | 
						|
          grid = [[
 | 
						|
            ^                                        |
 | 
						|
            {1:~                                       }|*5
 | 
						|
            {2:[No Name]             0,0-1          All}|
 | 
						|
            {3:E776: No location list}                  |
 | 
						|
          ]],
 | 
						|
        })
 | 
						|
 | 
						|
        n.feed('[t')
 | 
						|
        screen:expect({
 | 
						|
          grid = [[
 | 
						|
            ^                                        |
 | 
						|
            {1:~                                       }|*5
 | 
						|
            {2:[No Name]             0,0-1          All}|
 | 
						|
            {3:E73: Tag stack empty}                    |
 | 
						|
          ]],
 | 
						|
        })
 | 
						|
      end)
 | 
						|
 | 
						|
      describe('[<Space>', function()
 | 
						|
        it('adds an empty line above the current line', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed('[<Space>')
 | 
						|
          n.expect([[
 | 
						|
 | 
						|
          first line]])
 | 
						|
        end)
 | 
						|
 | 
						|
        it('works with a count', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed('5[<Space>')
 | 
						|
          n.expect([[
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
          first line]])
 | 
						|
        end)
 | 
						|
 | 
						|
        it('supports dot repetition', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed('[<Space>')
 | 
						|
          n.feed('.')
 | 
						|
          n.expect([[
 | 
						|
 | 
						|
 | 
						|
          first line]])
 | 
						|
        end)
 | 
						|
 | 
						|
        it('supports dot repetition and a count', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed('[<Space>')
 | 
						|
          n.feed('3.')
 | 
						|
          n.expect([[
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
          first line]])
 | 
						|
        end)
 | 
						|
      end)
 | 
						|
 | 
						|
      describe(']<Space>', function()
 | 
						|
        it('adds an empty line below the current line', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed(']<Space>')
 | 
						|
          n.expect([[
 | 
						|
          first line
 | 
						|
          ]])
 | 
						|
        end)
 | 
						|
 | 
						|
        it('works with a count', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed('5]<Space>')
 | 
						|
          n.expect([[
 | 
						|
          first line
 | 
						|
 | 
						|
 | 
						|
 | 
						|
 | 
						|
          ]])
 | 
						|
        end)
 | 
						|
 | 
						|
        it('supports dot repetition', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed(']<Space>')
 | 
						|
          n.feed('.')
 | 
						|
          n.expect([[
 | 
						|
          first line
 | 
						|
 | 
						|
          ]])
 | 
						|
        end)
 | 
						|
 | 
						|
        it('supports dot repetition and a count', function()
 | 
						|
          n.clear({ args_rm = { '--cmd' } })
 | 
						|
          n.insert([[first line]])
 | 
						|
          n.feed(']<Space>')
 | 
						|
          n.feed('2.')
 | 
						|
          n.expect([[
 | 
						|
          first line
 | 
						|
 | 
						|
 | 
						|
          ]])
 | 
						|
        end)
 | 
						|
      end)
 | 
						|
    end)
 | 
						|
  end)
 | 
						|
end)
 |