Mercurial > vim
changeset 35472:ae41b02a7ebd v9.1.0504
patch 9.1.0504: inner-tag textobject confused about ">" in attributes
Commit: https://github.com/vim/vim/commit/ca7f93e6f351b310c17cfc8f88acf21c839d6116
Author: Christian Brabandt <cb@256bit.org>
Date: Wed Jun 19 20:26:51 2024 +0200
patch 9.1.0504: inner-tag textobject confused about ">" in attributes
Problem: inner-tag textobject confused about ">" in attributes
Solution: Skip over quoted '>' when determining the start position
fixes: #15043
closes: #15049
Signed-off-by: Christian Brabandt <cb@256bit.org>
author | Christian Brabandt <cb@256bit.org> |
---|---|
date | Wed, 19 Jun 2024 20:30:10 +0200 |
parents | 4e0900497399 |
children | ac282e1d5a47 |
files | src/testdir/test_textobjects.vim src/textobject.c src/version.c |
diffstat | 3 files changed, 23 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/testdir/test_textobjects.vim +++ b/src/testdir/test_textobjects.vim @@ -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
--- a/src/textobject.c +++ b/src/textobject.c @@ -1426,15 +1426,22 @@ again: 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