diff options
author | zeertzjq <zeertzjq@outlook.com> | 2024-06-20 09:57:00 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-20 09:57:00 +0800 |
commit | 3317aa2f3756d21905b501a01d4f2b3203f60943 (patch) | |
tree | 3767b44db9a92be522d6df8cf13cb55a2c26eb80 | |
parent | 38a1d41ac08d1fe5688cdcac1e1e181f0cd82a5f (diff) | |
download | rneovim-3317aa2f3756d21905b501a01d4f2b3203f60943.tar.gz rneovim-3317aa2f3756d21905b501a01d4f2b3203f60943.tar.bz2 rneovim-3317aa2f3756d21905b501a01d4f2b3203f60943.zip |
vim-patch:9.1.0504: inner-tag textobject confused about ">" in attributes (#29420)
Problem: inner-tag textobject confused about ">" in attributes
Solution: Skip over quoted '>' when determining the start position
fixes: vim/vim#15043
closes: vim/vim#15049
https://github.com/vim/vim/commit/ca7f93e6f351b310c17cfc8f88acf21c839d6116
Co-authored-by: Christian Brabandt <cb@256bit.org>
-rw-r--r-- | src/nvim/textobject.c | 9 | ||||
-rw-r--r-- | test/old/testdir/test_textobjects.vim | 12 |
2 files changed, 19 insertions, 2 deletions
diff --git a/src/nvim/textobject.c b/src/nvim/textobject.c index 3c81a840ea..ffc5bc2cb2 100644 --- a/src/nvim/textobject.c +++ b/src/nvim/textobject.c @@ -1193,13 +1193,18 @@ again: pos_T end_pos = curwin->w_cursor; if (!do_include) { - // Exclude the start tag. + // Exclude the start tag, + // but skip over '>' if it appears in quotes + bool in_quotes = false; curwin->w_cursor = start_pos; while (inc_cursor() >= 0) { - if (*get_cursor_pos_ptr() == '>') { + p = get_cursor_pos_ptr(); + 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; diff --git a/test/old/testdir/test_textobjects.vim b/test/old/testdir/test_textobjects.vim index a7840860c9..0f41f0a241 100644 --- a/test/old/testdir/test_textobjects.vim +++ b/test/old/testdir/test_textobjects.vim @@ -203,6 +203,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 |