]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.2.0124: auto-format may swallow white space v9.2.0124
authorDaniel Müller <deso@posteo.net>
Sun, 8 Mar 2026 20:24:10 +0000 (20:24 +0000)
committerChristian Brabandt <cb@256bit.org>
Sun, 8 Mar 2026 20:24:10 +0000 (20:24 +0000)
Problem:  With auto paragraph formatting enabled, when a user makes an
          attempt to add a new word before the end of a line and with
          the following space bringing the line width over 'textwidth',
          the space ends up just getting swallowed by the editor.
Solution: Detect such a constellation and do not auto-format in that
          case (Daniel Müller).

closes: #19593

Signed-off-by: Daniel Müller <deso@posteo.net>
Signed-off-by: Christian Brabandt <cb@256bit.org>
src/testdir/test_textformat.vim
src/textformat.c
src/version.c

index f4dedfacb1414ebe4226dd3db7e5fe3a3fef9a2d..91fe943c1744b627ae751958079210ee0df207ee 100644 (file)
@@ -1155,6 +1155,32 @@ func Test_fo_a_w()
   %bw!
 endfunc
 
+" Test that auto-format ('a' flag) preserves spaces typed in the middle of a line
+func Test_fo_a_midline_space()
+  new
+  let lines = [
+    \ 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa it but',
+    \ 'Lorem Ipsum is simply dummy text of the printing and typesetting dasddd',
+    \ 'industry.',
+    \ ]
+  call setline(1, lines)
+  set fo=ta tw=70
+
+  " Prevent INPUT_BUFLEN batching so auto_format runs between keystrokes
+  autocmd InsertCharPre * " nothing
+
+  " Position at 't' of 'it' (col 68) and type space then Z
+  call cursor(1, 68)
+  call feedkeys("a Z\<Esc>", 'xt')
+
+  " The space between 'it' and 'Z' must be preserved
+  call assert_match('it Z', getline(1))
+
+  autocmd! InsertCharPre
+  set fo& tw&
+  bw!
+endfunc
+
 " Test for formatting lines using gq in visual mode
 func Test_visual_gq_format()
   new
index 8f4f2dd08af45f0c7e84ac87a3c57f16c2767311..024c80b683d3d363575ee4bdb5e7c527b089d2cc 100644 (file)
@@ -703,6 +703,24 @@ auto_format(
        curwin->w_cursor = pos;
     }
 
+    // Also skip formatting when the user just typed whitespace in the
+    // middle of the line.  Reformatting would join all paragraph lines and
+    // re-wrap, consuming the space at the line break point via
+    // OPENLINE_DELSPACES.  By deferring, the next non-whitespace character
+    // will be inserted adjacent to the space, keeping it protected from
+    // being consumed at a line break.  auto_format() will then reformat
+    // properly on the next keystroke.
+    if (*old != NUL && !trailblank && !wasatend && pos.col > 0
+           && (State & MODE_INSERT))
+    {
+       char_u *line = ml_get_curline();
+       if (WHITECHAR(line[pos.col - 1]))
+       {
+           curwin->w_cursor = pos;
+           return;
+       }
+    }
+
     // With the 'c' flag in 'formatoptions' and 't' missing: only format
     // comments.
     if (has_format_option(FO_WRAP_COMS) && !has_format_option(FO_WRAP)
index 446c47fe08c0db6def4549cec3df18da3cc1364d..5b78d544e495798bb17f5c0fa2dff5583f97748e 100644 (file)
@@ -734,6 +734,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    124,
 /**/
     123,
 /**/