view src/testdir/test_backspace_opt.vim @ 35308:22c03485f222 v9.1.0456

patch 9.1.0456: Left shift is incorrect with vartabstop and shiftwidth=0 Commit: https://github.com/vim/vim/commit/88d4f255b7b7a19bb4f6489e0ad0956e47d51fed Author: Gary Johnson <garyjohn@spocom.com> Date: Sat Jun 1 20:51:33 2024 +0200 patch 9.1.0456: Left shift is incorrect with vartabstop and shiftwidth=0 Problem: Left shift is incorrect with vartabstop and shiftwidth=0 Solution: make tabstop_at() function aware of shift direction (Gary Johnson) The problem was that with 'vartabstop' set and 'shiftwidth' equal 0, left shifts using << were shifting the line to the wrong column. The tabstop to the right of the first character in the line was being used as the shift amount instead of the tabstop to the left of that first character. The reason was that the tabstop_at() function always returned the value of the tabstop to the right of the given column and was not accounting for the direction of the shift. The solution was to make tabstop_at() aware of the direction of the shift and to choose the tabtop accordingly. A test was added to check this behavior and make sure it doesn't regress. While at it, also fix a few indentation/alignment issues. fixes: #14864 closes: #14887 Signed-off-by: Gary Johnson <garyjohn@spocom.com> Signed-off-by: Christian Brabandt <cb@256bit.org>
author Christian Brabandt <cb@256bit.org>
date Sat, 01 Jun 2024 21:00:03 +0200
parents e7ab58f57ea3
children
line wrap: on
line source

" Tests for 'backspace' settings

func Test_backspace_option()
  set backspace=
  call assert_equal('', &backspace)
  set backspace=indent
  call assert_equal('indent', &backspace)
  set backspace=eol
  call assert_equal('eol', &backspace)
  set backspace=start
  call assert_equal('start', &backspace)
  set backspace=nostop
  call assert_equal('nostop', &backspace)
  " Add the value
  set backspace=
  set backspace=indent
  call assert_equal('indent', &backspace)
  set backspace+=eol
  call assert_equal('indent,eol', &backspace)
  set backspace+=start
  call assert_equal('indent,eol,start', &backspace)
  set backspace+=nostop
  call assert_equal('indent,eol,start,nostop', &backspace)
  " Delete the value
  set backspace-=nostop
  call assert_equal('indent,eol,start', &backspace)
  set backspace-=indent
  call assert_equal('eol,start', &backspace)
  set backspace-=start
  call assert_equal('eol', &backspace)
  set backspace-=eol
  call assert_equal('', &backspace)
  " Check the error
  call assert_fails('set backspace=ABC', 'E474:')
  call assert_fails('set backspace+=def', 'E474:')
  " NOTE: Vim doesn't check following error...
  "call assert_fails('set backspace-=ghi', 'E474:')

  " Check backwards compatibility with version 5.4 and earlier
  set backspace=0
  call assert_equal('0', &backspace)
  set backspace=1
  call assert_equal('1', &backspace)
  set backspace=2
  call assert_equal('2', &backspace)
  set backspace=3
  call assert_equal('3', &backspace)
  call assert_fails('set backspace=4', 'E474:')
  call assert_fails('set backspace=10', 'E474:')

  " Cleared when 'compatible' is set
  set compatible
  call assert_equal('', &backspace)
  set nocompatible viminfo+=nviminfo
endfunc

" Test with backspace set to the non-compatible setting
func Test_backspace_ctrl_u()
  new
  call append(0,  [
        \ "1 this shouldn't be deleted",
        \ "2 this shouldn't be deleted",
        \ "3 this shouldn't be deleted",
        \ "4 this should be deleted",
        \ "5 this shouldn't be deleted",
        \ "6 this shouldn't be deleted",
        \ "7 this shouldn't be deleted",
        \ "8 this shouldn't be deleted (not touched yet)"])
  call cursor(2, 1)

  set compatible
  set backspace=2

  exe "normal Avim1\<C-U>\<Esc>\<CR>"
  exe "normal Avim2\<C-G>u\<C-U>\<Esc>\<CR>"

  set cpo-=<
  inoremap <c-u> <left><c-u>
  exe "normal Avim3\<*C-U>\<Esc>\<CR>"
  iunmap <c-u>
  exe "normal Avim4\<C-U>\<C-U>\<Esc>\<CR>"

  " Test with backspace set to the compatible setting
  set backspace= visualbell
  exe "normal A vim5\<Esc>A\<C-U>\<C-U>\<Esc>\<CR>"
  exe "normal A vim6\<Esc>Azwei\<C-G>u\<C-U>\<Esc>\<CR>"

  inoremap <c-u> <left><c-u>
  exe "normal A vim7\<*C-U>\<*C-U>\<Esc>\<CR>"

  call assert_equal([
        \ "1 this shouldn't be deleted",
        \ "2 this shouldn't be deleted",
        \ "3 this shouldn't be deleted",
        \ "4 this should be deleted3",
        \ "",
        \ "6 this shouldn't be deleted vim5",
        \ "7 this shouldn't be deleted vim6",
        \ "8 this shouldn't be deleted (not touched yet) vim7",
        \ ""], getline(1, '$'))

  " Reset values
  set compatible&vim
  set visualbell&vim
  set backspace&vim

  " Test new nostop option
  %d_
  let expected = "foo bar foobar"
  call setline(1, expected)
  call cursor(1, 8)
  exe ":norm! ianotherone\<c-u>"
  call assert_equal(expected, getline(1))
  call cursor(1, 8)
  exe ":norm! ianothertwo\<c-w>"
  call assert_equal(expected, getline(1))

  let content = getline(1)
  for value in ['indent,nostop', 'eol,nostop', 'indent,eol,nostop', 'indent,eol,start,nostop']
    exe ":set bs=".. value
    %d _
    call setline(1, content)
    let expected = " foobar"
    call cursor(1, 8)
    exe ":norm! ianotherone\<c-u>"
    call assert_equal(expected, getline(1), 'CTRL-U backspace value: '.. &bs)
    let expected = "foo  foobar"
    call setline(1, content)
    call cursor(1, 8)
    exe ":norm! ianothertwo\<c-w>"
    call assert_equal(expected, getline(1), 'CTRL-W backspace value: '.. &bs)
  endfor

  " Reset options
  set compatible&vim
  set visualbell&vim
  set backspace&vim
  close!
endfunc

" Test for setting 'backspace' to a number value (for backward compatibility)
func Test_backspace_number_value()
  new

  set backspace=0
  call setline(1, ['one two', 'three four'])
  call cursor(2, 1)
  exe "normal! A\<C-W>\<C-U>"
  call assert_equal('three four', getline(2))

  set backspace=1
  exe "normal! A\<CR>five\<C-W>\<C-U>\<C-W>\<C-U>"
  call assert_equal(['one two', 'three four'], getline(1, '$'))

  set backspace=2
  call cursor(2, 7)
  exe "normal! ihalf\<C-U>"
  call assert_equal('three four', getline(2))

  set backspace=3
  call cursor(2, 7)
  exe "normal! ihalf\<C-U>"
  call assert_equal('four', getline(2))

  bw!
  set backspace&
endfunc

" vim: shiftwidth=2 sts=2 expandtab