summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2019-01-11 22:15:05 +0100
committerBram Moolenaar <Bram@vim.org>2019-01-11 22:15:05 +0100
commitc3c3158756ae074052b0db2a3e3a7ba192df5330 (patch)
tree79e1b820b5e86fce5f98573097e4457ec06f5881
parent44a7db4ffdd11dafd345fd1c2c7b2509d01e3895 (diff)
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.txt11
-rw-r--r--src/edit.c15
-rw-r--r--src/option.h3
-rw-r--r--src/testdir/test_textformat.vim26
-rw-r--r--src/version.c2
5 files changed, 55 insertions, 2 deletions
diff --git a/runtime/doc/change.txt b/runtime/doc/change.txt
index ff0c44a662..bef7500647 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 33e0e6708b..9099c0c707 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 cb25938e73..50fe380ed2 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 0f8e09532b..13fb50b985 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 c0a2bb4b0f..8ef666056c 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,