]> granicus.if.org Git - vim/commitdiff
patch 8.1.0083: "is" and "as" have trouble with quoted punctuation v8.1.0083
authorBram Moolenaar <Bram@vim.org>
Tue, 19 Jun 2018 16:27:41 +0000 (18:27 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 19 Jun 2018 16:27:41 +0000 (18:27 +0200)
Problem:    "is" and "as" have trouble with quoted punctuation.
Solution:   Check for punctuation before a quote. (Jason Franklin)

src/search.c
src/testdir/test_textobjects.vim
src/version.c

index 57434ec0b71723353199a9a90f1c82762e3a06ef..66ae6471854d495d8bede24216285dd05708f58a 100644 (file)
@@ -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)
@@ -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 */
index 17602fbe26ac215dbd6d89d657881ec4d329a1db..f02619fc09ded28c80434295b4c8f1743a2d07e9 100644 (file)
@@ -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
index 1cdc8d4eeeffa53023b07193b9fc695503670e33..20cd3803cd78e4d80ef56b282c8b930fe08a89e7 100644 (file)
@@ -761,6 +761,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    83,
 /**/
     82,
 /**/