]> granicus.if.org Git - vim/commitdiff
patch 8.1.0728: cannot avoid breaking after a single space. v8.1.0728
authorBram Moolenaar <Bram@vim.org>
Fri, 11 Jan 2019 21:15:05 +0000 (22:15 +0100)
committerBram Moolenaar <Bram@vim.org>
Fri, 11 Jan 2019 21:15:05 +0000 (22:15 +0100)
Problem:    Cannot avoid breaking after a single space.
Solution:   Add the 'p' flag to 'formatoptions'. (Tom Ryder)

runtime/doc/change.txt
src/edit.c
src/option.h
src/testdir/test_textformat.vim
src/version.c

index ff0c44a662a8b20051f0df8e8aa27646c76f9656..bef75006479f91eedb6f2e34c5c9da90ca267270 100644 (file)
@@ -1720,6 +1720,17 @@ j        Where it makes sense, remove a comment leader when joining lines.  For
                         // in the list ~
        Becomes:
                int i;   // the index in the list ~
+p      Don't break lines at single spaces that follow periods.  This is
+       intended to complement 'joinspaces' and |cpo-J|, for prose with
+       sentences separated by two spaces.  For example, with 'textwidth' set
+       to 28: >
+               Surely you're joking, Mr. Feynman!
+<      Becomes: >
+               Surely you're joking,
+               Mr. Feynman!
+<      Instead of: >
+               Surely you're joking, Mr.
+               Feynman!
 
 
 With 't' and 'c' you can specify when Vim performs auto-wrapping:
index 33e0e6708bed766f561d5e18350bdb27748c4f28..9099c0c7079db8b1da0df56e1ed805aaa723b70a 100644 (file)
@@ -6498,6 +6498,7 @@ internal_format(
        char_u  *saved_text = NULL;
        colnr_T col;
        colnr_T end_col;
+       int     wcc;                    // counter for whitespace chars
 
        virtcol = get_nolist_virtcol()
                + char2cells(c != NUL ? c : gchar_cursor());
@@ -6559,14 +6560,26 @@ internal_format(
                /* remember position of blank just before text */
                end_col = curwin->w_cursor.col;
 
-               /* find start of sequence of blanks */
+               // find start of sequence of blanks
+               wcc = 0;
                while (curwin->w_cursor.col > 0 && WHITECHAR(cc))
                {
                    dec_cursor();
                    cc = gchar_cursor();
+
+                   // Increment count of how many whitespace chars in this
+                   // group; we only need to know if it's more than one.
+                   if (wcc < 2)
+                       wcc++;
                }
                if (curwin->w_cursor.col == 0 && WHITECHAR(cc))
                    break;              /* only spaces in front of text */
+
+               // Don't break after a period when 'formatoptions' has 'p' and
+               // there are less than two spaces.
+               if (has_format_option(FO_PERIOD_ABBR) && cc == '.' && wcc < 2)
+                   continue;
+
 #ifdef FEAT_COMMENTS
                /* Don't break until after the comment leader */
                if (curwin->w_cursor.col < leader_len)
index cb25938e7395745bff414b2ee1303b181af2d7ba..50fe380ed25a570d6d3328df09038c1d5ae2cd6d 100644 (file)
 #define FO_WHITE_PAR   'w'     /* trailing white space continues paragr. */
 #define FO_AUTO                'a'     /* automatic formatting */
 #define FO_REMOVE_COMS 'j'     /* remove comment leaders when joining lines */
+#define FO_PERIOD_ABBR 'p'     /* don't break a single space after a period */
 
 #define DFLT_FO_VI     "vt"
 #define DFLT_FO_VIM    "tcq"
-#define FO_ALL         "tcroq2vlb1mMBn,awj   /* for do_set() */
+#define FO_ALL         "tcroq2vlb1mMBn,awjp"   /* for do_set() */
 
 /* characters for the p_cpo option: */
 #define CPO_ALTREAD    'a'     /* ":read" sets alternate file name */
index 0f8e09532b26bfe4897f675e49c19f7e8871d95d..13fb50b9854ad38ece827482fb9fef16d9bf20ad 100644 (file)
@@ -163,6 +163,32 @@ func Test_text_format()
              \ '# 1 xxxxx',
              \ '#   foobar'], getline(1, 2))
 
+  " Test the 'p' flag for 'formatoptions'
+  " First test without the flag: that it will break "Mr. Feynman" at the space
+  normal ggdG
+  setl tw=28 fo=tcq
+  call setline('.', 'Surely you''re joking, Mr. Feynman!')
+  normal gqq
+  call assert_equal([
+              \ 'Surely you''re joking, Mr.',
+              \ 'Feynman!'], getline(1, 2))
+  " Now test with the flag: that it will push the name with the title onto the
+  " next line
+  normal ggdG
+  setl fo+=p
+  call setline('.', 'Surely you''re joking, Mr. Feynman!')
+  normal gqq
+  call assert_equal([
+              \ 'Surely you''re joking,',
+              \ 'Mr. Feynman!'], getline(1, 2))
+  " Ensure that it will still break if two spaces are entered
+  normal ggdG
+  call setline('.', 'Surely you''re joking, Mr.  Feynman!')
+  normal gqq
+  call assert_equal([
+              \ 'Surely you''re joking, Mr.',
+              \ 'Feynman!'], getline(1, 2))
+
   setl ai& tw& fo& si& comments&
   enew!
 endfunc
index c0a2bb4b0fe16a0be802c2f63c4f614c7ef3fb63..8ef666056c74c8015e6b977f46c4537fcd08eb1f 100644 (file)
@@ -795,6 +795,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    728,
 /**/
     727,
 /**/