0
0
mirror of https://github.com/vim/vim.git synced 2025-09-25 03:54:15 -04:00

patch 9.1.0007: can select empty inner text blocks

Problem:  can select empty inner text blocks
          (laurentalacoque)
Solution: make selecting empty inner text blocks an error

textobjects: Make selecting inner empty blocks an error

fixes: #13514
closes: #13523

Signed-off-by: Christian Brabandt <cb@256bit.org>
This commit is contained in:
Christian Brabandt
2024-01-04 21:43:36 +01:00
parent 184f71cc68
commit ad4d7f446d
4 changed files with 127 additions and 8 deletions

View File

@@ -600,7 +600,8 @@ i] *v_i]* *v_i[* *i]* *i[*
i[ "inner [] block", select [count] '[' ']' blocks. This
goes backwards to the [count] unclosed '[', and finds
the matching ']'. The enclosed text is selected,
excluding the '[' and ']'. The |cpo-M| option flag
excluding the '[' and ']'. It's an error to select an
empty inner block like "[]". The |cpo-M| option flag
is used to handle escaped brackets.
When used in Visual mode it is made characterwise.
@@ -618,7 +619,8 @@ i( *vib* *v_ib* *v_i(* *ib*
ib "inner block", select [count] blocks, from "[count] [("
to the matching ')', excluding the '(' and ')' (see
|[(|). If the cursor is not inside a () block, then
find the next "(". The |cpo-M| option flag
find the next "(". It's an error to select an empty
inner block like "()". The |cpo-M| option flag
is used to handle escaped parenthesis.
When used in Visual mode it is made characterwise.
@@ -632,8 +634,9 @@ a< "a <> block", select [count] <> blocks, from the
i> *v_i>* *v_i<* *i>* *i<*
i< "inner <> block", select [count] <> blocks, from
the [count]'th unmatched '<' backwards to the matching
'>', excluding the '<' and '>'. The |cpo-M| option flag
is used to handle escaped '<' and '>'.
'>', excluding the '<' and '>'. It's an error to
select an empty inner block like "<>". The |cpo-M|
option flag is used to handle escaped '<' and '>'.
When used in Visual mode it is made characterwise.
*v_at* *at*
@@ -663,7 +666,8 @@ i} *v_i}* *i}* *i{*
i{ *v_iB* *v_i{* *iB*
iB "inner Block", select [count] Blocks, from "[count] [{"
to the matching '}', excluding the '{' and '}' (see
|[{|). The |cpo-M| option flag is used to handle
|[{|). It's an error to select an empty inner block
like "{}". The |cpo-M| option flag is used to handle
escaped braces.
When used in Visual mode it is made characterwise.

View File

@@ -400,7 +400,7 @@ func Test_paragraph()
call assert_beeps("normal Vipip")
exe "normal \<C-C>"
close!
bw!
endfunc
" Tests for text object aw
@@ -606,7 +606,7 @@ func Test_textobj_quote()
normal $hhyi"
call assert_equal('bar', @")
close!
bw!
endfunc
" Test for i(, i<, etc. when cursor is in front of a block
@@ -638,7 +638,115 @@ func Test_textobj_find_paren_forward()
normal 0di)
call assert_equal('foo ()', getline(1))
close!
bw!
endfunc
func Test_inner_block_empty_paren()
new
call setline(1, ["(text)()", "", "(text)(", ")", "", "()()"])
" Example 1
call cursor(1, 1)
let @" = ''
call assert_beeps(':call feedkeys("0f(viby","xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('(', @")
" Example 2
call cursor(3, 1)
let @" = ''
call assert_beeps('call feedkeys("0f(viby", "xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('(', @")
" Example 3
call cursor(6, 1)
let @" = ''
call assert_beeps('call feedkeys("0f(viby", "xt")')
call assert_equal(3, getpos('.')[2])
call assert_equal('(', @")
bwipe!
endfunc
func Test_inner_block_empty_bracket()
new
call setline(1, ["[text][]", "", "[text][", "]", "", "[][]"])
" Example 1
call cursor(1, 1)
let @" = ''
call assert_beeps(':call feedkeys("0f[viby","xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('[', @")
" Example 2
call cursor(3, 1)
let @" = ''
call assert_beeps('call feedkeys("0f[viby", "xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('[', @")
" Example 3
call cursor(6, 1)
let @" = ''
call assert_beeps('call feedkeys("0f[viby", "xt")')
call assert_equal(3, getpos('.')[2])
call assert_equal('[', @")
bwipe!
endfunc
func Test_inner_block_empty_brace()
new
call setline(1, ["{text}{}", "", "{text}{", "}", "", "{}{}"])
" Example 1
call cursor(1, 1)
let @" = ''
call assert_beeps(':call feedkeys("0f{viby","xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('{', @")
" Example 2
call cursor(3, 1)
let @" = ''
call assert_beeps('call feedkeys("0f{viby", "xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('{', @")
" Example 3
call cursor(6, 1)
let @" = ''
call assert_beeps('call feedkeys("0f{viby", "xt")')
call assert_equal(3, getpos('.')[2])
call assert_equal('{', @")
bwipe!
endfunc
func Test_inner_block_empty_lessthan()
new
call setline(1, ["<text><>", "", "<text><", ">", "", "<><>"])
" Example 1
call cursor(1, 1)
let @" = ''
call assert_beeps(':call feedkeys("0f<viby","xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('<', @")
" Example 2
call cursor(3, 1)
let @" = ''
call assert_beeps('call feedkeys("0f<viby", "xt")')
call assert_equal(7, getpos('.')[2])
call assert_equal('<', @")
" Example 3
call cursor(6, 1)
let @" = ''
call assert_beeps('call feedkeys("0f<viby", "xt")')
call assert_equal(3, getpos('.')[2])
call assert_equal('<', @")
bwipe!
endfunc
" vim: shiftwidth=2 sts=2 expandtab

View File

@@ -1131,6 +1131,11 @@ current_block(
break;
}
if (EQUAL_POS(start_pos, *end_pos))
// empty block like this: ()
// there is no inner block to select, abort
return FAIL;
/*
* In Visual mode, when the resulting area is not bigger than what we
* started with, extend it to the next block, and then exclude again.

View File

@@ -704,6 +704,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
7,
/**/
6,
/**/