neovim

Neovim text editor
git clone https://git.dasho.dev/neovim.git
Log | Files | Refs | README

test_selectmode.vim (10133B)


      1 " Test for Select-mode
      2 
      3 source check.vim
      4 " CheckNotGui
      5 " CheckUnix
      6 
      7 source shared.vim
      8 source mouse.vim
      9 
     10 " Test for select mode
     11 func Test_selectmode_basic()
     12  new
     13  call setline(1, range(1,100))
     14  50
     15  norm! gHy
     16  call assert_equal('y51', getline('.'))
     17  call setline(1, range(1,100))
     18  50
     19  exe ":norm! V9jo\<c-g>y"
     20  call assert_equal('y60', getline('.'))
     21  call setline(1, range(1,100))
     22  50
     23  " call feedkeys(":set im\n\<c-o>gHc\<c-o>:set noim\n", 'tx')
     24  call feedkeys("i\<c-o>gHc\<esc>", 'tx')
     25  call assert_equal('c51', getline('.'))
     26  " clean up
     27  bw!
     28 endfunc
     29 
     30 " Test for starting selectmode
     31 func Test_selectmode_start()
     32  new
     33  set selectmode=key keymodel=startsel
     34  call setline(1, ['abc', 'def', 'ghi'])
     35  call cursor(1, 4)
     36  call feedkeys("A\<s-home>start\<esc>", 'txin')
     37  call assert_equal(['startdef', 'ghi'], getline(1, '$'))
     38  " start select mode again with gv
     39  set selectmode=cmd
     40  call feedkeys('gvabc', 'xt')
     41  call assert_equal('abctdef', getline(1))
     42  " arrow keys without shift should not start selection
     43  call feedkeys("A\<Home>\<Right>\<Left>ro", 'xt')
     44  call assert_equal('roabctdef', getline(1))
     45  set selectmode= keymodel=
     46  bw!
     47 endfunc
     48 
     49 " Test for characterwise select mode
     50 func Test_characterwise_select_mode()
     51  new
     52 
     53  " Select mode maps
     54  snoremap <lt>End> <End>
     55  snoremap <lt>Down> <Down>
     56  snoremap <lt>Del> <Del>
     57 
     58  " characterwise select mode: delete middle line
     59  call deletebufline('', 1, '$')
     60  call append('$', ['a', 'b', 'c'])
     61  exe "normal Gkkgh\<End>\<Del>"
     62  call assert_equal(['', 'b', 'c'], getline(1, '$'))
     63 
     64  " characterwise select mode: delete middle two lines
     65  call deletebufline('', 1, '$')
     66  call append('$', ['a', 'b', 'c'])
     67  exe "normal Gkkgh\<Down>\<End>\<Del>"
     68  call assert_equal(['', 'c'], getline(1, '$'))
     69 
     70  " characterwise select mode: delete last line
     71  call deletebufline('', 1, '$')
     72  call append('$', ['a', 'b', 'c'])
     73  exe "normal Ggh\<End>\<Del>"
     74  call assert_equal(['', 'a', 'b', ''], getline(1, '$'))
     75 
     76  " characterwise select mode: delete last two lines
     77  call deletebufline('', 1, '$')
     78  call append('$', ['a', 'b', 'c'])
     79  exe "normal Gkgh\<Down>\<End>\<Del>"
     80  call assert_equal(['', 'a', ''], getline(1, '$'))
     81 
     82  " CTRL-H in select mode behaves like 'x'
     83  call setline(1, 'abcdef')
     84  exe "normal! gggh\<Right>\<Right>\<Right>\<C-H>"
     85  call assert_equal('ef', getline(1))
     86 
     87  " CTRL-O in select mode switches to visual mode for one command
     88  call setline(1, 'abcdef')
     89  exe "normal! gggh\<C-O>3lm"
     90  call assert_equal('mef', getline(1))
     91 
     92  sunmap <lt>End>
     93  sunmap <lt>Down>
     94  sunmap <lt>Del>
     95  bwipe!
     96 endfunc
     97 
     98 " Test for linewise select mode
     99 func Test_linewise_select_mode()
    100  new
    101 
    102  " linewise select mode: delete middle line
    103  call append('$', ['a', 'b', 'c'])
    104  exe "normal GkkgH\<Del>"
    105  call assert_equal(['', 'b', 'c'], getline(1, '$'))
    106 
    107  " linewise select mode: delete middle two lines
    108  call deletebufline('', 1, '$')
    109  call append('$', ['a', 'b', 'c'])
    110  exe "normal GkkgH\<Down>\<Del>"
    111  call assert_equal(['', 'c'], getline(1, '$'))
    112 
    113  " linewise select mode: delete last line
    114  call deletebufline('', 1, '$')
    115  call append('$', ['a', 'b', 'c'])
    116  exe "normal GgH\<Del>"
    117  call assert_equal(['', 'a', 'b'], getline(1, '$'))
    118 
    119  " linewise select mode: delete last two lines
    120  call deletebufline('', 1, '$')
    121  call append('$', ['a', 'b', 'c'])
    122  exe "normal GkgH\<Down>\<Del>"
    123  call assert_equal(['', 'a'], getline(1, '$'))
    124 
    125  bwipe!
    126 endfunc
    127 
    128 " Test for blockwise select mode (g CTRL-H)
    129 func Test_blockwise_select_mode()
    130  new
    131  call setline(1, ['foo', 'bar'])
    132  call feedkeys("g\<BS>\<Right>\<Down>mm", 'xt')
    133  call assert_equal(['mmo', 'mmr'], getline(1, '$'))
    134  close!
    135 endfunc
    136 
    137 " Test for using visual mode maps in select mode
    138 func Test_select_mode_map()
    139  new
    140  vmap <buffer> <F2> 3l
    141  call setline(1, 'Test line')
    142  call feedkeys("gh\<F2>map", 'xt')
    143  call assert_equal('map line', getline(1))
    144 
    145  vmap <buffer> <F2> ygV
    146  call feedkeys("0gh\<Right>\<Right>\<F2>cwabc", 'xt')
    147  call assert_equal('abc line', getline(1))
    148 
    149  vmap <buffer> <F2> :<C-U>let v=100<CR>
    150  call feedkeys("gggh\<Right>\<Right>\<F2>foo", 'xt')
    151  call assert_equal('foo line', getline(1))
    152 
    153  " reselect the select mode using gv from a visual mode map
    154  vmap <buffer> <F2> gv
    155  set selectmode=cmd
    156  call feedkeys("0gh\<F2>map", 'xt')
    157  call assert_equal('map line', getline(1))
    158  set selectmode&
    159 
    160  close!
    161 endfunc
    162 
    163 " Test double/triple/quadruple click to start 'select' mode
    164 func Test_term_mouse_multiple_clicks_to_select_mode()
    165  let save_mouse = &mouse
    166  let save_term = &term
    167  " let save_ttymouse = &ttymouse
    168  " call test_override('no_query_mouse', 1)
    169 
    170  " 'mousetime' must be sufficiently large, or else the test is flaky when
    171  " using a ssh connection with X forwarding; i.e. ssh -X.
    172  " set mouse=a term=xterm mousetime=1000
    173  set mouse=a mousetime=1000
    174  set selectmode=mouse
    175  new
    176 
    177  for ttymouse_val in g:Ttymouse_values + g:Ttymouse_dec
    178    let msg = 'ttymouse=' .. ttymouse_val
    179    " exe 'set ttymouse=' .. ttymouse_val
    180 
    181    " Single-click and drag should 'select' the characters
    182    call setline(1, ['foo [foo bar] foo', 'foo'])
    183    call MouseLeftClick(1, 3)
    184    call assert_equal(0, getcharmod(), msg)
    185    call MouseLeftDrag(1, 13)
    186    call MouseLeftRelease(1, 13)
    187    norm! o
    188    call assert_equal(['foo foo', 'foo'], getline(1, '$'), msg)
    189 
    190    " Double-click on word should visually 'select' the word.
    191    call setline(1, ['foo [foo bar] foo', 'foo'])
    192    call MouseLeftClick(1, 2)
    193    call assert_equal(0, getcharmod(), msg)
    194    call MouseLeftRelease(1, 2)
    195    call MouseLeftClick(1, 2)
    196    call assert_equal(32, getcharmod(), msg) " double-click
    197    call MouseLeftRelease(1, 2)
    198    call assert_equal('s', mode(), msg)
    199    norm! bar
    200    call assert_equal(['bar [foo bar] foo', 'foo'], getline(1, '$'), msg)
    201 
    202    " Double-click on opening square bracket should visually
    203    " 'select' the whole [foo bar].
    204    call setline(1, ['foo [foo bar] foo', 'foo'])
    205    call MouseLeftClick(1, 5)
    206    call assert_equal(0, getcharmod(), msg)
    207    call MouseLeftRelease(1, 5)
    208    call MouseLeftClick(1, 5)
    209    call assert_equal(32, getcharmod(), msg) " double-click
    210    call MouseLeftRelease(1, 5)
    211    call assert_equal('s', mode(), msg)
    212    norm! bar
    213    call assert_equal(['foo bar foo', 'foo'], getline(1, '$'), msg)
    214 
    215    " To guarantee that the next click is not counted as a triple click
    216    call MouseRightClick(1, 1)
    217    call MouseRightRelease(1, 1)
    218 
    219    " Triple-click should visually 'select' the whole line.
    220    call setline(1, ['foo [foo bar] foo', 'foo'])
    221    call MouseLeftClick(1, 3)
    222    call assert_equal(0, getcharmod(), msg)
    223    call MouseLeftRelease(1, 3)
    224    call MouseLeftClick(1, 3)
    225    call assert_equal(32, getcharmod(), msg) " double-click
    226    call MouseLeftRelease(1, 3)
    227    call MouseLeftClick(1, 3)
    228    call assert_equal(64, getcharmod(), msg) " triple-click
    229    call MouseLeftRelease(1, 3)
    230    call assert_equal('S', mode(), msg)
    231    norm! baz
    232    call assert_equal(['bazfoo'], getline(1, '$'), msg)
    233 
    234    " Quadruple-click should start visual block 'select'.
    235    call setline(1, ['aaaaaa', 'bbbbbb'])
    236    call MouseLeftClick(1, 2)
    237    call assert_equal(0, getcharmod(), msg)
    238    call MouseLeftRelease(1, 2)
    239    call MouseLeftClick(1, 2)
    240    call assert_equal(32, getcharmod(), msg) " double-click
    241    call MouseLeftRelease(1, 2)
    242    call MouseLeftClick(1, 2)
    243    call assert_equal(64, getcharmod(), msg) " triple-click
    244    call MouseLeftRelease(1, 2)
    245    call MouseLeftClick(1, 2)
    246    call assert_equal(96, getcharmod(), msg) " quadruple-click
    247    call MouseLeftDrag(2, 4)
    248    call MouseLeftRelease(2, 4)
    249    call assert_equal("\<c-s>", mode(), msg)
    250    norm! x
    251    call assert_equal(['axaa', 'bxbb'], getline(1, '$'), msg)
    252  endfor
    253 
    254  let &mouse = save_mouse
    255  " let &term = save_term
    256  " let &ttymouse = save_ttymouse
    257  set mousetime&
    258  set selectmode&
    259  " call test_override('no_query_mouse', 0)
    260  bwipe!
    261 endfunc
    262 
    263 " Test for selecting a register with CTRL-R
    264 func Test_selectmode_register()
    265  new
    266 
    267  " Default behavior: use unnamed register
    268  call setline(1, 'foo')
    269  call setreg('"', 'bar')
    270  call setreg('a', 'baz')
    271  exe ":norm! v\<c-g>a"
    272  call assert_equal(getline('.'), 'aoo')
    273  call assert_equal('f', getreg('"'))
    274  call assert_equal('baz', getreg('a'))
    275 
    276  " Use the black hole register
    277  call setline(1, 'foo')
    278  call setreg('"', 'bar')
    279  call setreg('a', 'baz')
    280  exe ":norm! v\<c-g>\<c-r>_a"
    281  call assert_equal(getline('.'), 'aoo')
    282  call assert_equal('bar', getreg('"'))
    283  call assert_equal('baz', getreg('a'))
    284 
    285  " Invalid register: use unnamed register
    286  call setline(1, 'foo')
    287  call setreg('"', 'bar')
    288  call setreg('a', 'baz')
    289  exe ":norm! v\<c-g>\<c-r>?a"
    290  call assert_equal(getline('.'), 'aoo')
    291  call assert_equal('f', getreg('"'))
    292  call assert_equal('baz', getreg('a'))
    293 
    294  " Use unnamed register
    295  call setline(1, 'foo')
    296  call setreg('"', 'bar')
    297  call setreg('a', 'baz')
    298  exe ":norm! v\<c-g>\<c-r>\"a"
    299  call assert_equal(getline('.'), 'aoo')
    300  call assert_equal('f', getreg('"'))
    301  call assert_equal('baz', getreg('a'))
    302 
    303  " use specicifed register, unnamed register is also written
    304  call setline(1, 'foo')
    305  call setreg('"', 'bar')
    306  call setreg('a', 'baz')
    307  exe ":norm! v\<c-g>\<c-r>aa"
    308  call assert_equal(getline('.'), 'aoo')
    309  call assert_equal('f', getreg('"'))
    310  call assert_equal('f', getreg('a'))
    311 
    312  bw!
    313 endfunc
    314 
    315 func Test_ins_ctrl_o_in_insert_mode_resets_selectmode()
    316  new
    317  " ctrl-o in insert mode resets restart_VIsual_select
    318  call setline(1, 'abcdef')
    319  call cursor(1, 1)
    320  exe "norm! \<c-v>\<c-g>\<c-o>c\<c-o>\<c-v>\<right>\<right>IABC"
    321  call assert_equal('ABCbcdef', getline(1))
    322 
    323  bwipe!
    324 endfunc
    325 
    326 " Test that an :lmap mapping for a printable keypad key is applied when typing
    327 " it in Select mode.
    328 func Test_selectmode_keypad_lmap()
    329  new
    330  lnoremap <buffer> <kPoint> ???
    331  lnoremap <buffer> <kEnter> !!!
    332  setlocal iminsert=1
    333  call setline(1, 'abcdef')
    334  call feedkeys("gH\<kPoint>\<Esc>", 'tx')
    335  call assert_equal(['???'], getline(1, '$'))
    336  call feedkeys("gH\<kEnter>\<Esc>", 'tx')
    337  call assert_equal(['!!!'], getline(1, '$'))
    338 
    339  bwipe!
    340 endfunc
    341 
    342 " vim: shiftwidth=2 sts=2 expandtab