diff options
author | Bram Moolenaar <Bram@vim.org> | 2019-01-11 22:15:05 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2019-01-11 22:15:05 +0100 |
commit | c3c3158756ae074052b0db2a3e3a7ba192df5330 (patch) | |
tree | 79e1b820b5e86fce5f98573097e4457ec06f5881 | |
parent | 44a7db4ffdd11dafd345fd1c2c7b2509d01e3895 (diff) | |
download | vim-git-c3c3158756ae074052b0db2a3e3a7ba192df5330.tar.gz |
patch 8.1.0728: cannot avoid breaking after a single space.v8.1.0728
Problem: Cannot avoid breaking after a single space.
Solution: Add the 'p' flag to 'formatoptions'. (Tom Ryder)
-rw-r--r-- | runtime/doc/change.txt | 11 | ||||
-rw-r--r-- | src/edit.c | 15 | ||||
-rw-r--r-- | src/option.h | 3 | ||||
-rw-r--r-- | src/testdir/test_textformat.vim | 26 | ||||
-rw-r--r-- | src/version.c | 2 |
5 files changed, 55 insertions, 2 deletions
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt index ff0c44a66..bef750064 100644 --- a/runtime/doc/change.txt +++ b/runtime/doc/change.txt @@ -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: diff --git a/src/edit.c b/src/edit.c index 33e0e6708..9099c0c70 100644 --- a/src/edit.c +++ b/src/edit.c @@ -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) diff --git a/src/option.h b/src/option.h index cb25938e7..50fe380ed 100644 --- a/src/option.h +++ b/src/option.h @@ -101,10 +101,11 @@ #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 */ diff --git a/src/testdir/test_textformat.vim b/src/testdir/test_textformat.vim index 0f8e09532..13fb50b98 100644 --- a/src/testdir/test_textformat.vim +++ b/src/testdir/test_textformat.vim @@ -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 diff --git a/src/version.c b/src/version.c index c0a2bb4b0..8ef666056 100644 --- a/src/version.c +++ b/src/version.c @@ -796,6 +796,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 728, +/**/ 727, /**/ 726, |