diff options
author | Bram Moolenaar <Bram@vim.org> | 2020-06-18 15:33:25 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2020-06-18 15:33:25 +0200 |
commit | 2f03e5a0a9cfaabb01c57dd3348a05e86c26623c (patch) | |
tree | a56206b01f450b99a8cf372693651f47f622c22f | |
parent | 3d9207ad2fc98b4f92f77b5a3d52a3a4d25b9561 (diff) | |
download | vim-git-8.2.0999.tar.gz |
patch 8.2.0999: moving to next sentence gets stuck on quotev8.2.0999
Problem: Moving to next sentence gets stuck on quote.
Solution: When moving to the next sentence doesn't result in moving, advance
a character and try again. (closes #6291)
-rw-r--r-- | src/testdir/test_textobjects.vim | 11 | ||||
-rw-r--r-- | src/textobject.c | 15 | ||||
-rw-r--r-- | src/version.c | 2 |
3 files changed, 28 insertions, 0 deletions
diff --git a/src/testdir/test_textobjects.vim b/src/testdir/test_textobjects.vim index eed84e385..6eb6fbbf3 100644 --- a/src/testdir/test_textobjects.vim +++ b/src/testdir/test_textobjects.vim @@ -311,6 +311,17 @@ func Test_sentence_with_cursor_on_delimiter() normal! 17|yas call assert_equal("A '([sentence.])' ", @") + " don't get stuck on a quote at the start of a sentence + %delete _ + call setline(1, ['A sentence.', '"A sentence"?', 'A sentence!']) + normal gg)) + call assert_equal(3, getcurpos()[1]) + + %delete _ + call setline(1, ['A sentence.', "'A sentence'?", 'A sentence!']) + normal gg)) + call assert_equal(3, getcurpos()[1]) + %delete _ endfunc diff --git a/src/textobject.c b/src/textobject.c index e876d528d..23bdc9666 100644 --- a/src/textobject.c +++ b/src/textobject.c @@ -26,6 +26,7 @@ static int skip_chars(int, int); findsent(int dir, long count) { pos_T pos, tpos; + pos_T prev_pos; int c; int (*func)(pos_T *); int startlnum; @@ -41,6 +42,8 @@ findsent(int dir, long count) while (count--) { + prev_pos = pos; + /* * if on an empty line, skip up to a non-empty line */ @@ -133,6 +136,18 @@ found: while (!noskip && ((c = gchar_pos(&pos)) == ' ' || c == '\t')) if (incl(&pos) == -1) break; + + if (EQUAL_POS(prev_pos, pos)) + { + // didn't actually move, advance one character and try again + if ((*func)(&pos) == -1) + { + if (count) + return FAIL; + break; + } + ++count; + } } setpcmark(); diff --git a/src/version.c b/src/version.c index 6ea3ce043..f1cc22f5e 100644 --- a/src/version.c +++ b/src/version.c @@ -755,6 +755,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 999, +/**/ 998, /**/ 997, |