Skip to content

Commit

Permalink
Problem: inner-tag textobject confused about > in attribute
Browse files Browse the repository at this point in the history
Problem:  inner-tag textobject confused about > in attribute
Solution: Skip over quoted '>' when determining the start position

closes: vim#15043

Signed-off-by: Christian Brabandt <cb@256bit.org>
  • Loading branch information
chrisbra committed Jun 19, 2024
1 parent fbc37f1 commit 76e3301
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 2 deletions.
12 changes: 12 additions & 0 deletions src/testdir/test_textobjects.vim
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,18 @@ func Test_string_html_objects()
normal! 2k0vaty
call assert_equal("<div><div\nattr=\"attr\"\n></div></div>", @", e)

" tag, that includes a > in some attribute
let t = "<div attr=\"attr >> foo >> bar \">Hello</div>"
$put =t
normal! fHyit
call assert_equal("Hello", @", e)

" tag, that includes a > in some attribute
let t = "<div attr='attr >> foo >> bar '>Hello 123</div>"
$put =t
normal! fHyit
call assert_equal("Hello 123", @", e)

set quoteescape&

" this was going beyond the end of the line
Expand Down
11 changes: 9 additions & 2 deletions src/textobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -1426,15 +1426,22 @@ current_tagblock(

if (!do_include)
{
// Exclude the start tag.
// Exclude the start tag,
// but skip over '>' if it appears in quotes
int in_quotes = FALSE;
curwin->w_cursor = start_pos;
while (inc_cursor() >= 0)
if (*ml_get_cursor() == '>')
{
p = ml_get_cursor();
if (*p == '>' && !in_quotes)
{
inc_cursor();
start_pos = curwin->w_cursor;
break;
}
else if (*p == '"' || *p == '\'')
in_quotes = !in_quotes;
}
curwin->w_cursor = end_pos;

// If we are in Visual mode and now have the same text as before set
Expand Down

0 comments on commit 76e3301

Please sign in to comment.