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 #10420)
diff --git a/src/change.c b/src/change.c
index 8ba0a54..b7618c5 100644
--- a/src/change.c
+++ b/src/change.c
@@ -1392,14 +1392,7 @@
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
diff --git a/src/edit.c b/src/edit.c
index 3da3db6..5b06131 100644
--- a/src/edit.c
+++ b/src/edit.c
@@ -1295,7 +1295,7 @@
#endif
compl_busy = FALSE;
#ifdef FEAT_SMARTINDENT
- can_si = TRUE; // allow smartindenting
+ can_si = may_do_si(); // allow smartindenting
#endif
break;
diff --git a/src/indent.c b/src/indent.c
index 06d98f9..dfc481a 100644
--- a/src/indent.c
+++ b/src/indent.c
@@ -1169,6 +1169,22 @@
#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 @@
}
// 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();
diff --git a/src/ops.c b/src/ops.c
index 4adeb09..b11cbf5 100644
--- a/src/ops.c
+++ b/src/ops.c
@@ -1718,12 +1718,7 @@
{
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
}
diff --git a/src/proto/indent.pro b/src/proto/indent.pro
index a42f20f..2702f40 100644
--- a/src/proto/indent.pro
+++ b/src/proto/indent.pro
@@ -23,6 +23,7 @@
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);
diff --git a/src/testdir/test_smartindent.vim b/src/testdir/test_smartindent.vim
index 7b58af2..edfec9a 100644
--- a/src/testdir/test_smartindent.vim
+++ b/src/testdir/test_smartindent.vim
@@ -134,4 +134,21 @@
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
diff --git a/src/version.c b/src/version.c
index 8d3f2e7..c9ec301 100644
--- a/src/version.c
+++ b/src/version.c
@@ -747,6 +747,8 @@
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 4951,
+/**/
4950,
/**/
4949,