changeset 28856:948877671c54 v8.2.4951

patch 8.2.4951: smart indenting done when not enabled Commit: https://github.com/vim/vim/commit/de5cf287812510d2c8ffe66b99cf33c4e1a6e6f1 Author: Bram Moolenaar <Bram@vim.org> Date: Sat May 14 11:52:23 2022 +0100 patch 8.2.4951: smart indenting done when not enabled Problem: Smart indenting done when not enabled. Solution: Check option values before setting can_si. (closes https://github.com/vim/vim/issues/10420)
author Bram Moolenaar <Bram@vim.org>
date Sat, 14 May 2022 13:00:05 +0200
parents 39fddf7b52c1
children b1324e0d998a
files src/change.c src/edit.c src/indent.c src/ops.c src/proto/indent.pro src/testdir/test_smartindent.vim src/version.c
diffstat 7 files changed, 40 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/src/change.c
+++ b/src/change.c
@@ -1392,14 +1392,7 @@ open_line(
     int		do_cindent;
 #endif
 #ifdef FEAT_SMARTINDENT
-    int		do_si = (!p_paste && curbuf->b_p_si
-# ifdef FEAT_CINDENT
-					&& !curbuf->b_p_cin
-# endif
-# ifdef FEAT_EVAL
-					&& *curbuf->b_p_inde == NUL
-# endif
-			);
+    int		do_si = may_do_si();
     int		no_si = FALSE;		// reset did_si afterwards
     int		first_char = NUL;	// init for GCC
 #endif
--- a/src/edit.c
+++ b/src/edit.c
@@ -1295,7 +1295,7 @@ docomplete:
 #endif
 	    compl_busy = FALSE;
 #ifdef FEAT_SMARTINDENT
-	    can_si = TRUE; // allow smartindenting
+	    can_si = may_do_si(); // allow smartindenting
 #endif
 	    break;
 
--- a/src/indent.c
+++ b/src/indent.c
@@ -1169,6 +1169,22 @@ preprocs_left(void)
 
 #ifdef FEAT_SMARTINDENT
 /*
+ * Return TRUE if the conditions are OK for smart indenting.
+ */
+    int
+may_do_si()
+{
+    return curbuf->b_p_si
+# ifdef FEAT_CINDENT
+	&& !curbuf->b_p_cin
+# endif
+# ifdef FEAT_EVAL
+	&& *curbuf->b_p_inde == NUL
+# endif
+	&& !p_paste;
+}
+
+/*
  * Try to do some very smart auto-indenting.
  * Used when inserting a "normal" character.
  */
@@ -1235,7 +1251,7 @@ ins_try_si(int c)
     }
 
     // set indent of '#' always to 0
-    if (curwin->w_cursor.col > 0 && can_si && c == '#')
+    if (curwin->w_cursor.col > 0 && can_si && c == '#' && inindent(0))
     {
 	// remember current indent for next line
 	old_indent = get_indent();
--- a/src/ops.c
+++ b/src/ops.c
@@ -1718,12 +1718,7 @@ op_change(oparg_T *oap)
     {
 	l = 0;
 #ifdef FEAT_SMARTINDENT
-	if (!p_paste && curbuf->b_p_si
-# ifdef FEAT_CINDENT
-		&& !curbuf->b_p_cin
-# endif
-		)
-	    can_si = TRUE;	// It's like opening a new line, do si
+	can_si = may_do_si();	// Like opening a new line, do smart indent
 #endif
     }
 
--- a/src/proto/indent.pro
+++ b/src/proto/indent.pro
@@ -23,6 +23,7 @@ int get_breakindent_win(win_T *wp, char_
 int inindent(int extra);
 void op_reindent(oparg_T *oap, int (*how)(void));
 int preprocs_left(void);
+int may_do_si(void);
 void ins_try_si(int c);
 void change_indent(int type, int amount, int round, int replaced, int call_changed_bytes);
 int copy_indent(int size, char_u *src);
--- a/src/testdir/test_smartindent.vim
+++ b/src/testdir/test_smartindent.vim
@@ -134,4 +134,21 @@ func Test_si_with_paste()
   bw!
 endfunc
 
+func Test_si_after_completion()
+  new
+  setlocal ai smartindent indentexpr=
+  call setline(1, 'foo foot')
+  call feedkeys("o  f\<C-X>\<C-N>#", 'tx')
+  call assert_equal('  foo#', getline(2))
+  bwipe!
+endfunc
+
+func Test_no_si_after_completion()
+  new
+  call setline(1, 'foo foot')
+  call feedkeys("o  f\<C-X>\<C-N>#", 'tx')
+  call assert_equal('  foo#', getline(2))
+  bwipe!
+endfunc
+
 " vim: shiftwidth=2 sts=2 expandtab
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@ static char *(features[]) =
 static int included_patches[] =
 {   /* Add new patch number below this line */
 /**/
+    4951,
+/**/
     4950,
 /**/
     4949,