view src/testdir/test_modeless.vim @ 34686:83875247fbc0 v9.1.0224

patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text Commit: https://github.com/vim/vim/commit/515f734e687f28f7199b2a8042197624d9f3ec15 Author: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Date: Thu Mar 28 12:01:14 2024 +0100 patch 9.1.0224: cursor may move too many lines over "right" & "below" virt text Problem: If a line has "right" & "below" virtual text properties, where the "below" property may be stored first due to lack of ordering between them, then the line height is calculated to be 1 more and causes the cursor to far over the line. Solution: Remove some unnecessary setting of a `next_right_goes_below = TRUE` flag for "below" and "above" text properties. (Dylan Thacker-Smith) I modified a regression test I recently added to cover this case, leveraging the fact that "after", "right" & "below" text properties are being stored in the reverse of the order they are added in. The previous version of this regression test was crafted to workaround this issue so it can be addressed by this separate patch. closes: #14317 Signed-off-by: Dylan Thacker-Smith <dylan.ah.smith@gmail.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Thu, 28 Mar 2024 12:15:03 +0100
parents ee50174810ac
children
line wrap: on
line source

" Test for modeless selection

" This only works for Unix in a terminal
source check.vim
CheckNotGui
CheckUnix

source shared.vim
source mouse.vim

" Test for modeless characterwise selection (single click)
func Test_modeless_characterwise_selection()
  CheckFeature clipboard_working
  let save_mouse = &mouse
  let save_term = &term
  let save_ttymouse = &ttymouse
  call test_override('no_query_mouse', 1)
  set mouse=a term=xterm mousetime=200
  call WaitForResponses()

  new
  call setline(1, ['one two three', 'foo bar baz'])
  redraw!

  " Wait a bit for any terminal responses to get processed.
  sleep 50m

  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    let msg = 'ttymouse=' .. ttymouse_val
    exe 'set ttymouse=' .. ttymouse_val

    " select multiple characters within a line
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 6)
    let keys ..= MouseLeftDragCode(1, 10)
    let keys ..= MouseLeftReleaseCode(1, 10)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("wo th", @*, msg)

    " select multiple characters including the end of line
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 11)
    let keys ..= MouseLeftDragCode(1, 16)
    let keys ..= MouseLeftReleaseCode(1, 16)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("ree\n", @*, msg)

    " extend a selection using right mouse click
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    set mousemodel=extend
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 2)
    let keys ..= MouseLeftDragCode(1, 5)
    let keys ..= MouseLeftReleaseCode(1, 5)
    let keys ..= MouseRightClickCode(1, 10)
    let keys ..= MouseRightReleaseCode(1, 10)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("ne two th", @*, msg)
    set mousemodel&

    " extend a selection backwards using right mouse click
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    set mousemodel=extend
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 7)
    let keys ..= MouseLeftDragCode(1, 11)
    let keys ..= MouseLeftReleaseCode(1, 11)
    let keys ..= MouseRightClickCode(1, 3)
    let keys ..= MouseRightReleaseCode(1, 3)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("e two thr", @*, msg)
    set mousemodel&

    " select multiple characters within a line backwards
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 9)
    let keys ..= MouseLeftDragCode(1, 3)
    let keys ..= MouseLeftReleaseCode(1, 3)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("e two t", @*, msg)

    " select multiple characters across lines with (end row > start row) and
    " (end column < start column)
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 9)
    let keys ..= MouseLeftDragCode(2, 3)
    let keys ..= MouseLeftReleaseCode(2, 3)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("three\nfoo", @*, msg)

    " select multiple characters across lines with (end row > start row) and
    " (end column > start column)
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 4)
    let keys ..= MouseLeftDragCode(2, 8)
    let keys ..= MouseLeftReleaseCode(2, 8)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal(" two three\nfoo bar ", @*, msg)

    " select multiple characters across lines with (end row < start row) and
    " (end column < start column)
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 7)
    let keys ..= MouseLeftDragCode(1, 5)
    let keys ..= MouseLeftReleaseCode(1, 5)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("two three\nfoo bar", @*, msg)

    " select multiple characters across lines with (end row < start row) and
    " (end column > start column)
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 11)
    let keys ..= MouseLeftDragCode(1, 13)
    let keys ..= MouseLeftReleaseCode(1, 13)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("e\nfoo bar baz", @*, msg)

    " select multiple characters across lines with (end row < start row) and
    " the end column is greater than the line length
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 7)
    let keys ..= MouseLeftDragCode(1, 16)
    let keys ..= MouseLeftReleaseCode(1, 16)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("\nfoo bar", @*, msg)

    " select multiple characters across lines with start/end row and start/end
    " column outside the lines in the buffer
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(4, 3)
    let keys ..= MouseLeftDragCode(3, 2)
    let keys ..= MouseLeftReleaseCode(3, 2)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("\n~  ", @*, msg)

    " change selection using right mouse click within the selected text
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    set mousemodel=extend
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 5)
    let keys ..= MouseLeftDragCode(1, 13)
    let keys ..= MouseLeftReleaseCode(1, 13)
    let keys ..= MouseRightClickCode(1, 7)
    let keys ..= MouseRightReleaseCode(1, 7)
    let keys ..= MouseRightClickCode(1, 11)
    let keys ..= MouseRightReleaseCode(1, 11)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("o thr", @*, msg)
    set mousemodel&

    " select text multiple times at different places
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 3)
    let keys ..= MouseLeftDragCode(1, 5)
    let keys ..= MouseLeftReleaseCode(1, 5)
    let keys ..= MouseLeftClickCode(2, 7)
    let keys ..= MouseLeftDragCode(2, 9)
    let keys ..= MouseLeftReleaseCode(2, 9)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("r b", @*, msg)

    " Test for 'clipboard' set to 'autoselectml' to automatically copy the
    " modeless selection to the clipboard
    set clipboard=autoselectml
    let @* = 'clean'
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 5)
    let keys ..= MouseLeftDragCode(2, 7)
    let keys ..= MouseLeftReleaseCode(2, 7)
    let keys ..= "\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("bar", @*)
    set clipboard&

    " quadruple click should start characterwise selectmode
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 10)
    let keys ..= MouseLeftReleaseCode(1, 10)
    let keys ..= MouseLeftClickCode(1, 10)
    let keys ..= MouseLeftReleaseCode(1, 10)
    let keys ..= MouseLeftClickCode(1, 10)
    let keys ..= MouseLeftReleaseCode(1, 10)
    let keys ..= MouseLeftClickCode(1, 10)
    let keys ..= MouseLeftDragCode(1, 11)
    let keys ..= MouseLeftReleaseCode(1, 11)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("hree", @*, msg)
  endfor

  let &mouse = save_mouse
  let &term = save_term
  let &ttymouse = save_ttymouse
  set mousetime&
  call test_override('no_query_mouse', 0)
  close!
endfunc

" Test for modeless word selection (double click)
func Test_modeless_word_selection()
  CheckFeature clipboard_working
  let save_mouse = &mouse
  let save_term = &term
  let save_ttymouse = &ttymouse
  call test_override('no_query_mouse', 1)
  set mouse=a term=xterm mousetime=200
  call WaitForResponses()

  new
  call setline(1, ['one two three', 'foo bar baz'])
  redraw!

  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    let msg = 'ttymouse=' .. ttymouse_val
    exe 'set ttymouse=' .. ttymouse_val

    " select multiple words within a line
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 6)
    let keys ..= MouseLeftReleaseCode(1, 6)
    let keys ..= MouseLeftClickCode(1, 6)
    let keys ..= MouseLeftDragCode(1, 10)
    let keys ..= MouseLeftReleaseCode(1, 10)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("two three", @*, msg)

    " select a single word
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 6)
    let keys ..= MouseLeftReleaseCode(2, 6)
    let keys ..= MouseLeftClickCode(2, 6)
    let keys ..= MouseLeftReleaseCode(2, 6)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("bar", @*, msg)

    " select multiple words backwards within a line
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 11)
    let keys ..= MouseLeftReleaseCode(2, 11)
    let keys ..= MouseLeftClickCode(2, 11)
    let keys ..= MouseLeftDragCode(2, 7)
    let keys ..= MouseLeftReleaseCode(2, 7)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("bar baz", @*, msg)

    " select multiple words backwards across lines
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 7)
    let keys ..= MouseLeftReleaseCode(2, 7)
    let keys ..= MouseLeftClickCode(2, 7)
    let keys ..= MouseLeftDragCode(1, 6)
    let keys ..= MouseLeftReleaseCode(1, 6)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("two three\nfoo bar", @*, msg)
  endfor

  let &mouse = save_mouse
  let &term = save_term
  let &ttymouse = save_ttymouse
  set mousetime&
  call test_override('no_query_mouse', 0)
  close!
endfunc

" Test for modeless line selection (triple click)
func Test_modeless_line_selection()
  CheckFeature clipboard_working
  let save_mouse = &mouse
  let save_term = &term
  let save_ttymouse = &ttymouse
  call test_override('no_query_mouse', 1)
  set mouse=a term=xterm mousetime=200
  call WaitForResponses()

  new
  call setline(1, ['one two three', 'foo bar baz'])
  redraw!

  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    let msg = 'ttymouse=' .. ttymouse_val
    exe 'set ttymouse=' .. ttymouse_val

    " select single line
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 6)
    let keys ..= MouseLeftReleaseCode(2, 6)
    let keys ..= MouseLeftClickCode(2, 6)
    let keys ..= MouseLeftReleaseCode(2, 6)
    let keys ..= MouseLeftClickCode(2, 6)
    let keys ..= MouseLeftReleaseCode(2, 6)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("foo bar baz\n", @*, msg)

    " select multiple lines
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(1, 6)
    let keys ..= MouseLeftReleaseCode(1, 6)
    let keys ..= MouseLeftClickCode(1, 6)
    let keys ..= MouseLeftReleaseCode(1, 6)
    let keys ..= MouseLeftClickCode(1, 6)
    let keys ..= MouseLeftDragCode(2, 12)
    let keys ..= MouseLeftReleaseCode(2, 12)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("one two three\nfoo bar baz\n", @*, msg)

    " select multiple lines backwards
    let @* = 'clean'
    call MouseRightClick(1, 1)
    call MouseRightRelease(1, 1)
    let keys = ":"
    let keys ..= MouseLeftClickCode(2, 10)
    let keys ..= MouseLeftReleaseCode(2, 10)
    let keys ..= MouseLeftClickCode(2, 10)
    let keys ..= MouseLeftReleaseCode(2, 10)
    let keys ..= MouseLeftClickCode(2, 10)
    let keys ..= MouseLeftDragCode(1, 3)
    let keys ..= MouseLeftReleaseCode(1, 3)
    let keys ..= "\<C-Y>\<CR>"
    call feedkeys(keys, "x")
    call assert_equal("one two three\nfoo bar baz\n", @*, msg)
  endfor

  let &mouse = save_mouse
  let &term = save_term
  let &ttymouse = save_ttymouse
  set mousetime&
  call test_override('no_query_mouse', 0)
  close!
endfunc

" vim: shiftwidth=2 sts=2 expandtab