changeset 26448:748793fcb4e2 v8.2.3754

patch 8.2.3754: undesired changing of the indent of the first formatted line Commit: https://github.com/vim/vim/commit/ecabb511074b3f56cdd5067553c947a291d04e17 Author: Bram Moolenaar <Bram@vim.org> Date: Mon Dec 6 19:51:01 2021 +0000 patch 8.2.3754: undesired changing of the indent of the first formatted line Problem: Undesired changing of the indent of the first formatted line. Solution: Do not indent the first formatted line.
author Bram Moolenaar <Bram@vim.org>
date Mon, 06 Dec 2021 21:00:05 +0100
parents f04968207797
children f2e54e4adab9
files src/testdir/test_indent.vim src/textformat.c src/version.c
diffstat 3 files changed, 42 insertions(+), 8 deletions(-) [+]
line wrap: on
line diff
--- a/src/testdir/test_indent.vim
+++ b/src/testdir/test_indent.vim
@@ -172,7 +172,8 @@ func Test_indent_func_with_gq()
         \ 'metus lectus ultrices odio, sed elementum mi ante at arcu.', '', '\begin{center}', '',
         \ 'Proin nec risus consequat nunc dapibus consectetur. Mauris lacinia est a augue',
         \ 'tristique accumsan. Morbi pretium, felis molestie eleifend condimentum, arcu',
-        \ 'ipsum congue nisl, quis euismod purus libero in ante. Donec id semper purus.',
+        \ 'ipsum congue nisl, quis euismod purus libero in ante.', '',
+        \ 'Donec id semper purus.',
         \ 'Suspendisse eget aliquam nunc. Maecenas fringilla mauris vitae maximus',
         \ 'condimentum. Cras a quam in mi dictum eleifend at a lorem. Sed convallis',
         \ 'ante a commodo facilisis. Nam suscipit vulputate odio, vel dapibus nisl',
@@ -181,10 +182,10 @@ func Test_indent_func_with_gq()
   1d_
   call cursor(5, 1)
   ka
-  call cursor(15, 1)
+  call cursor(14, 1)
   kb
   norm! 'agqap
-  norm! 'bgqap
+  norm! 'bgqG
   let expected = [ '\documentclass{article}', '', '\begin{document}', '',
         \ 'Lorem ipsum dolor sit amet, consectetur adipiscing',
         \ 'elit. Fusce ut enim non libero efficitur aliquet.',
@@ -201,9 +202,10 @@ func Test_indent_func_with_gq()
         \ '  consectetur. Mauris lacinia est a augue',
         \ '  tristique accumsan. Morbi pretium, felis',
         \ '  molestie eleifend condimentum, arcu ipsum congue',
-        \ '  nisl, quis euismod purus libero in ante. Donec',
-        \ '  id semper purus.  Suspendisse eget aliquam nunc.',
-        \ '  Maecenas fringilla mauris vitae maximus',
+        \ '  nisl, quis euismod purus libero in ante.',
+        \ '',
+        \ '  Donec id semper purus.  Suspendisse eget aliquam',
+        \ '  nunc. Maecenas fringilla mauris vitae maximus',
         \ '  condimentum. Cras a quam in mi dictum eleifend',
         \ '  at a lorem. Sed convallis ante a commodo',
         \ '  facilisis. Nam suscipit vulputate odio, vel',
@@ -217,4 +219,28 @@ func Test_indent_func_with_gq()
   delfunction GetTeXIndent 
 endfu
 
+func Test_formatting_keeps_first_line_indent()
+  let lines =<< trim END
+      foo()
+      {
+          int x;         // manually positioned
+                         // more text that will be formatted
+                         // but not reindented
+  END
+  new
+  call setline(1, lines)
+  setlocal sw=4 cindent tw=45 et
+  normal! 4Ggqj
+  let expected =<< trim END
+      foo()
+      {
+          int x;         // manually positioned
+                         // more text that will be
+                         // formatted but not
+                         // reindented
+  END
+  call assert_equal(expected, getline(1, '$'))
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/textformat.c
+++ b/src/textformat.c
@@ -954,6 +954,7 @@ format_lines(
     int		smd_save;
     long	count;
     int		need_set_indent = TRUE;	// set indent of next paragraph
+    linenr_T	first_line = curwin->w_cursor.lnum;
     int		force_format = FALSE;
     int		old_State = State;
 
@@ -1073,8 +1074,13 @@ format_lines(
 		{
 		    int		indent = 0; // amount of indent needed
 
-		    // replace indent in first line with minimal number of
-		    // tabs and spaces, according to current options
+		    // Replace indent in first line of a paragraph with minimal
+		    // number of tabs and spaces, according to current options.
+		    // For the very first formatted line keep the current
+		    // indent.
+		    if (curwin->w_cursor.lnum == first_line)
+			indent = get_indent();
+		    else
 # ifdef FEAT_LISP
 		    if (curbuf->b_p_lisp)
 			indent = get_lisp_indent();
--- a/src/version.c
+++ b/src/version.c
@@ -754,6 +754,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    3754,
+/**/
     3753,
 /**/
     3752,