Skip to content

Commit

Permalink
patch 8.1.0083: "is" and "as" have trouble with quoted punctuation
Browse files Browse the repository at this point in the history
Problem:    "is" and "as" have trouble with quoted punctuation.
Solution:   Check for punctuation before a quote. (Jason Franklin)
  • Loading branch information
brammool committed Jun 19, 2018
1 parent 1d4754f commit 8516071
Show file tree
Hide file tree
Showing 3 changed files with 97 additions and 20 deletions.
40 changes: 20 additions & 20 deletions src/search.c
Original file line number Diff line number Diff line change
Expand Up @@ -2707,10 +2707,11 @@ showmatch(
}

/*
* findsent(dir, count) - Find the start of the next sentence in direction
* "dir" Sentences are supposed to end in ".", "!" or "?" followed by white
* space or a line break. Also stop at an empty line.
* Return OK if the next sentence was found.
* Find the start of the next sentence, searching in the direction specified
* by the "dir" argument. The cursor is positioned on the start of the next
* sentence when found. If the next sentence is found, return OK. Return FAIL
* otherwise. See ":h sentence" for the precise definition of a "sentence"
* text object.
*/
int
findsent(int dir, long count)
Expand Down Expand Up @@ -2758,26 +2759,25 @@ findsent(int dir, long count)
else if (dir == BACKWARD)
decl(&pos);

/* go back to the previous non-blank char */
// go back to the previous non-white non-punctuation character
found_dot = FALSE;
while ((c = gchar_pos(&pos)) == ' ' || c == '\t' ||
(dir == BACKWARD && vim_strchr((char_u *)".!?)]\"'", c) != NULL))
while (c = gchar_pos(&pos), VIM_ISWHITE(c)
|| vim_strchr((char_u *)".!?)]\"'", c) != NULL)
{
if (vim_strchr((char_u *)".!?", c) != NULL)
{
/* Only skip over a '.', '!' and '?' once. */
if (found_dot)
break;
tpos = pos;
if (decl(&tpos) == -1 || (LINEEMPTY(tpos.lnum) && dir == FORWARD))
break;

if (found_dot)
break;
if (vim_strchr((char_u *) ".!?", c) != NULL)
found_dot = TRUE;
}
if (decl(&pos) == -1)

if (vim_strchr((char_u *) ")]\"'", c) != NULL
&& vim_strchr((char_u *) ".!?)]\"'", gchar_pos(&tpos)) == NULL)
break;
/* when going forward: Stop in front of empty line */
if (LINEEMPTY(pos.lnum) && dir == FORWARD)
{
incl(&pos);
goto found;
}

decl(&pos);
}

/* remember the line where the search started */
Expand Down
75 changes: 75 additions & 0 deletions src/testdir/test_textobjects.vim
Original file line number Diff line number Diff line change
Expand Up @@ -165,3 +165,78 @@ x
norm it
q!
endfunc

func Test_sentence()
enew!
call setline(1, 'A sentence. A sentence? A sentence!')

normal yis
call assert_equal('A sentence.', @")
normal yas
call assert_equal('A sentence. ', @")

normal )

normal yis
call assert_equal('A sentence?', @")
normal yas
call assert_equal('A sentence? ', @")

normal )

normal yis
call assert_equal('A sentence!', @")
normal yas
call assert_equal(' A sentence!', @")

normal 0
normal 2yis
call assert_equal('A sentence. ', @")
normal 3yis
call assert_equal('A sentence. A sentence?', @")
normal 2yas
call assert_equal('A sentence. A sentence? ', @")

%delete _
endfunc

func Test_sentence_with_quotes()
enew!
call setline(1, 'A "sentence." A sentence.')

normal yis
call assert_equal('A "sentence."', @")
normal yas
call assert_equal('A "sentence." ', @")

normal )

normal yis
call assert_equal('A sentence.', @")
normal yas
call assert_equal(' A sentence.', @")

%delete _
endfunc

func! Test_sentence_with_cursor_on_delimiter()
enew!
call setline(1, "A '([sentence.])' A sentence.")

normal! 15|yis
call assert_equal("A '([sentence.])'", @")
normal! 15|yas
call assert_equal("A '([sentence.])' ", @")

normal! 16|yis
call assert_equal("A '([sentence.])'", @")
normal! 16|yas
call assert_equal("A '([sentence.])' ", @")

normal! 17|yis
call assert_equal("A '([sentence.])'", @")
normal! 17|yas
call assert_equal("A '([sentence.])' ", @")

%delete _
endfunc
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -761,6 +761,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
83,
/**/
82,
/**/
Expand Down

0 comments on commit 8516071

Please sign in to comment.