summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-06-18 15:33:25 +0200
committerBram Moolenaar <Bram@vim.org>2020-06-18 15:33:25 +0200
commit2f03e5a0a9cfaabb01c57dd3348a05e86c26623c (patch)
treea56206b01f450b99a8cf372693651f47f622c22f
parent3d9207ad2fc98b4f92f77b5a3d52a3a4d25b9561 (diff)
downloadvim-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.vim11
-rw-r--r--src/textobject.c15
-rw-r--r--src/version.c2
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,