123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562 |
- local t = require('test.testutil')
- local n = require('test.functional.testnvim')()
- local tt = require('test.functional.testterm')
- local clear, eq, eval = n.clear, t.eq, n.eval
- local feed, api, command = n.feed, n.api, n.command
- local feed_data = tt.feed_data
- local is_os = t.is_os
- local skip = t.skip
- describe(':terminal mouse', function()
- local screen
- before_each(function()
- clear()
- api.nvim_set_option_value('statusline', '==========', {})
- screen = tt.setup_screen()
- command('highlight StatusLine NONE')
- command('highlight StatusLineNC NONE')
- command('highlight StatusLineTerm NONE')
- command('highlight StatusLineTermNC NONE')
- command('highlight VertSplit NONE')
- local lines = {}
- for i = 1, 30 do
- table.insert(lines, 'line' .. tostring(i))
- end
- table.insert(lines, '')
- feed_data(lines)
- screen:expect([[
- line26 |
- line27 |
- line28 |
- line29 |
- line30 |
- {1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
- describe('when the terminal has focus', function()
- it('will exit focus on mouse-scroll', function()
- eq('t', eval('mode(1)'))
- feed('<ScrollWheelUp><0,0>')
- eq('nt', eval('mode(1)'))
- end)
- it('will exit focus and trigger Normal mode mapping on mouse click', function()
- feed([[<C-\><C-N>qri]])
- command('let g:got_leftmouse = 0')
- command('nnoremap <LeftMouse> <Cmd>let g:got_leftmouse = 1<CR>')
- eq('t', eval('mode(1)'))
- eq(0, eval('g:got_leftmouse'))
- feed('<LeftMouse>')
- eq('nt', eval('mode(1)'))
- eq(1, eval('g:got_leftmouse'))
- feed('q')
- eq('i<LeftMouse>', eval('keytrans(@r)'))
- end)
- it('will exit focus and trigger Normal mode mapping on mouse click with modifier', function()
- feed([[<C-\><C-N>qri]])
- command('let g:got_ctrl_leftmouse = 0')
- command('nnoremap <C-LeftMouse> <Cmd>let g:got_ctrl_leftmouse = 1<CR>')
- eq('t', eval('mode(1)'))
- eq(0, eval('g:got_ctrl_leftmouse'))
- feed('<C-LeftMouse>')
- eq('nt', eval('mode(1)'))
- eq(1, eval('g:got_ctrl_leftmouse'))
- feed('q')
- eq('i<C-LeftMouse>', eval('keytrans(@r)'))
- end)
- it('will exit focus on <C-\\> + mouse-scroll', function()
- eq('t', eval('mode(1)'))
- feed('<C-\\>')
- feed('<ScrollWheelUp><0,0>')
- eq('nt', eval('mode(1)'))
- end)
- it('will not exit focus on left-release', function()
- eq('t', eval('mode(1)'))
- feed('<LeftRelease><0,0>')
- eq('t', eval('mode(1)'))
- command('setlocal number')
- eq('t', eval('mode(1)'))
- feed('<LeftRelease><0,0>')
- eq('t', eval('mode(1)'))
- end)
- it('will not exit focus on mouse movement', function()
- eq('t', eval('mode(1)'))
- feed('<MouseMove><0,0>')
- eq('t', eval('mode(1)'))
- command('setlocal number')
- eq('t', eval('mode(1)'))
- feed('<MouseMove><0,0>')
- eq('t', eval('mode(1)'))
- end)
- describe('with mouse events enabled by the program', function()
- before_each(function()
- tt.enable_mouse()
- tt.feed_data('mouse enabled\n')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- {1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('will forward mouse press, drag and release to the program', function()
- skip(is_os('win'))
- feed('<LeftMouse><1,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- "#{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftDrag><2,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- @##{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftDrag><3,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- @$#{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftRelease><3,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- #$#{1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('will forward mouse scroll to the program', function()
- skip(is_os('win'))
- feed('<ScrollWheelUp><0,0>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- `!!{1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('dragging and scrolling do not interfere with each other', function()
- skip(is_os('win'))
- feed('<LeftMouse><1,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- "#{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<ScrollWheelUp><1,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- `"#{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftDrag><2,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- @##{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<ScrollWheelUp><2,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- `##{1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftRelease><2,2>')
- screen:expect([[
- line27 |
- line28 |
- line29 |
- line30 |
- mouse enabled |
- ###{1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('will forward mouse clicks to the program with the correct even if set nu', function()
- skip(is_os('win'))
- command('set number')
- -- When the display area such as a number is clicked, it returns to the
- -- normal mode.
- feed('<LeftMouse><3,0>')
- eq('nt', eval('mode(1)'))
- screen:expect([[
- {7: 11 }^line28 |
- {7: 12 }line29 |
- {7: 13 }line30 |
- {7: 14 }mouse enabled |
- {7: 15 }rows: 6, cols: 46 |
- {7: 16 }{2: } |
- |
- ]])
- -- If click on the coordinate (0,1) of the region of the terminal
- -- (i.e. the coordinate (4,1) of vim), 'CSI !"' is sent to the terminal.
- feed('i<LeftMouse><4,1>')
- screen:expect([[
- {7: 11 }line28 |
- {7: 12 }line29 |
- {7: 13 }line30 |
- {7: 14 }mouse enabled |
- {7: 15 }rows: 6, cols: 46 |
- {7: 16 } !"{1: } |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('will lose focus if statusline is clicked', function()
- command('set laststatus=2')
- screen:expect([[
- line29 |
- line30 |
- mouse enabled |
- rows: 5, cols: 50 |
- {1: } |
- ========== |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftMouse><0,5>')
- screen:expect([[
- line29 |
- line30 |
- mouse enabled |
- rows: 5, cols: 50 |
- {2:^ } |
- ========== |
- |
- ]])
- feed('<LeftDrag><0,4>')
- screen:expect([[
- mouse enabled |
- rows: 5, cols: 50 |
- rows: 4, cols: 50 |
- {2:^ } |
- ========== |
- |*2
- ]])
- end)
- it('will lose focus if right separator is clicked', function()
- command('rightbelow vnew | wincmd p | startinsert')
- screen:expect([[
- line29 │ |
- line30 │{4:~ }|
- mouse enabled │{4:~ }|
- rows: 5, cols: 24 │{4:~ }|
- {1: } │{4:~ }|
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftMouse><24,0>')
- screen:expect([[
- line29 │ |
- line30 │{4:~ }|
- mouse enabled │{4:~ }|
- rows: 5, cols: 24 │{4:~ }|
- {2:^ } │{4:~ }|
- ========== ========== |
- |
- ]])
- feed('<LeftDrag><23,0>')
- screen:expect([[
- line30 │ |
- mouse enabled │{4:~ }|
- rows: 5, cols: 24 │{4:~ }|
- rows: 5, cols: 23 │{4:~ }|
- {2:^ } │{4:~ }|
- ========== ========== |
- |
- ]])
- end)
- it('will lose focus if winbar/tabline is clicked', function()
- command('setlocal winbar=WINBAR')
- screen:expect([[
- {3:WINBAR }|
- line29 |
- line30 |
- mouse enabled |
- rows: 5, cols: 50 |
- {1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftMouse><0,0>')
- screen:expect([[
- {3:WINBAR }|
- line29 |
- line30 |
- mouse enabled |
- rows: 5, cols: 50 |
- {2:^ } |
- |
- ]])
- command('set showtabline=2 tabline=TABLINE | startinsert')
- screen:expect([[
- {1:TABLINE }|
- {3:WINBAR }|
- mouse enabled |
- rows: 5, cols: 50 |
- rows: 4, cols: 50 |
- {1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftMouse><0,0>')
- screen:expect([[
- {1:TABLINE }|
- {3:WINBAR }|
- mouse enabled |
- rows: 5, cols: 50 |
- rows: 4, cols: 50 |
- {2:^ } |
- |
- ]])
- command('setlocal winbar= | startinsert')
- screen:expect([[
- {1:TABLINE }|
- mouse enabled |
- rows: 5, cols: 50 |
- rows: 4, cols: 50 |
- rows: 5, cols: 50 |
- {1: } |
- {3:-- TERMINAL --} |
- ]])
- feed('<LeftMouse><0,0>')
- screen:expect([[
- {1:TABLINE }|
- mouse enabled |
- rows: 5, cols: 50 |
- rows: 4, cols: 50 |
- rows: 5, cols: 50 |
- {2:^ } |
- |
- ]])
- end)
- end)
- describe('with a split window and other buffer', function()
- before_each(function()
- feed('<c-\\><c-n>:vsp<cr>')
- screen:expect([[
- line28 │line28 |
- line29 │line29 |
- line30 │line30 |
- rows: 5, cols: 25 │rows: 5, cols: 25 |
- {2:^ } │{2: } |
- ========== ========== |
- :vsp |
- ]])
- feed(':enew | set number<cr>')
- screen:expect([[
- {7: 1 }^ │line29 |
- {4:~ }│line30 |
- {4:~ }│rows: 5, cols: 25 |
- {4:~ }│rows: 5, cols: 24 |
- {4:~ }│{2: } |
- ========== ========== |
- :enew | set number |
- ]])
- feed('30iline\n<esc>')
- screen:expect([[
- {7: 27 }line │line29 |
- {7: 28 }line │line30 |
- {7: 29 }line │rows: 5, cols: 25 |
- {7: 30 }line │rows: 5, cols: 24 |
- {7: 31 }^ │{2: } |
- ========== ========== |
- |
- ]])
- feed('<c-w>li')
- screen:expect([[
- {7: 27 }line │line29 |
- {7: 28 }line │line30 |
- {7: 29 }line │rows: 5, cols: 25 |
- {7: 30 }line │rows: 5, cols: 24 |
- {7: 31 } │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- -- enabling mouse won't affect interaction with other windows
- tt.enable_mouse()
- tt.feed_data('mouse enabled\n')
- screen:expect([[
- {7: 27 }line │line30 |
- {7: 28 }line │rows: 5, cols: 25 |
- {7: 29 }line │rows: 5, cols: 24 |
- {7: 30 }line │mouse enabled |
- {7: 31 } │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- end)
- it("scrolling another window keeps focus and respects 'mousescroll'", function()
- feed('<ScrollWheelUp><4,0><ScrollWheelUp><4,0>')
- screen:expect([[
- {7: 21 }line │line30 |
- {7: 22 }line │rows: 5, cols: 25 |
- {7: 23 }line │rows: 5, cols: 24 |
- {7: 24 }line │mouse enabled |
- {7: 25 }line │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- feed('<S-ScrollWheelDown><4,0>')
- screen:expect([[
- {7: 26 }line │line30 |
- {7: 27 }line │rows: 5, cols: 25 |
- {7: 28 }line │rows: 5, cols: 24 |
- {7: 29 }line │mouse enabled |
- {7: 30 }line │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- command('set mousescroll=ver:10')
- feed('<ScrollWheelUp><0,0>')
- screen:expect([[
- {7: 16 }line │line30 |
- {7: 17 }line │rows: 5, cols: 25 |
- {7: 18 }line │rows: 5, cols: 24 |
- {7: 19 }line │mouse enabled |
- {7: 20 }line │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- command('set mousescroll=ver:0')
- feed('<ScrollWheelUp><0,0>')
- screen:expect_unchanged()
- feed([[<C-\><C-N><C-W>w]])
- command('setlocal nowrap')
- feed('0<C-V>gg3ly$4p<C-W>wi')
- screen:expect([[
- {7: 1 }linelinelinelineline │line30 |
- {7: 2 }linelinelinelineline │rows: 5, cols: 25 |
- {7: 3 }linelinelinelineline │rows: 5, cols: 24 |
- {7: 4 }linelinelinelineline │mouse enabled |
- {7: 5 }linelinelinelineline │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- feed('<ScrollWheelRight><4,0>')
- screen:expect([[
- {7: 1 }nelinelineline │line30 |
- {7: 2 }nelinelineline │rows: 5, cols: 25 |
- {7: 3 }nelinelineline │rows: 5, cols: 24 |
- {7: 4 }nelinelineline │mouse enabled |
- {7: 5 }nelinelineline │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- command('set mousescroll=hor:4')
- feed('<ScrollWheelLeft><4,0>')
- screen:expect([[
- {7: 1 }nelinelinelineline │line30 |
- {7: 2 }nelinelinelineline │rows: 5, cols: 25 |
- {7: 3 }nelinelinelineline │rows: 5, cols: 24 |
- {7: 4 }nelinelinelineline │mouse enabled |
- {7: 5 }nelinelinelineline │{1: } |
- ========== ========== |
- {3:-- TERMINAL --} |
- ]])
- end)
- it('will lose focus if another window is clicked', function()
- feed('<LeftMouse><5,1>')
- screen:expect([[
- {7: 27 }line │line30 |
- {7: 28 }l^ine │rows: 5, cols: 25 |
- {7: 29 }line │rows: 5, cols: 24 |
- {7: 30 }line │mouse enabled |
- {7: 31 } │{2: } |
- ========== ========== |
- |
- ]])
- end)
- it('handles terminal size when switching buffers', function()
- api.nvim_set_option_value('hidden', true, {})
- feed('<c-\\><c-n><c-w><c-w>')
- screen:expect([[
- {7: 27 }line │line30 |
- {7: 28 }line │rows: 5, cols: 25 |
- {7: 29 }line │rows: 5, cols: 24 |
- {7: 30 }line │mouse enabled |
- {7: 31 }^ │{2: } |
- ========== ========== |
- |
- ]])
- feed(':bn<cr>')
- screen:expect([[
- rows: 5, cols: 25 │rows: 5, cols: 25 |
- rows: 5, cols: 24 │rows: 5, cols: 24 |
- mouse enabled │mouse enabled |
- rows: 5, cols: 25 │rows: 5, cols: 25 |
- {2:^ } │{2: } |
- ========== ========== |
- :bn |
- ]])
- feed(':bn<cr>')
- screen:expect([[
- {7: 27 }line │rows: 5, cols: 24 |
- {7: 28 }line │mouse enabled |
- {7: 29 }line │rows: 5, cols: 25 |
- {7: 30 }line │rows: 5, cols: 24 |
- {7: 31 }^ │{2: } |
- ========== ========== |
- :bn |
- ]])
- end)
- end)
- end)
- end)
|