]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.4951: smart indenting done when not enabled v8.2.4951
authorBram Moolenaar <Bram@vim.org>
Sat, 14 May 2022 10:52:23 +0000 (11:52 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 14 May 2022 10:52:23 +0000 (11:52 +0100)
Problem:    Smart indenting done when not enabled.
Solution:   Check option values before setting can_si. (closes #10420)

src/change.c
src/edit.c
src/indent.c
src/ops.c
src/proto/indent.pro
src/testdir/test_smartindent.vim
src/version.c

index 8ba0a54f4ad215195980ee0b1e4248ad37e9edf5..b7618c5ba8fe2c71c7c4dbd0c1f551e672c21439 100644 (file)
@@ -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
index 3da3db67b7c573e3a4cecdc716263124b59e332f..5b06131f960355ee70f2331c3784b9d1c04e2729 100644 (file)
@@ -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;
 
index 06d98f92ecbe1b21891fd8f263b23d0dcc919d7b..dfc481a7851c5175de65b9a22ed7d56240582ca6 100644 (file)
@@ -1168,6 +1168,22 @@ preprocs_left(void)
 #endif
 
 #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();
index 4adeb09453bdb53c7f4519d164b553c6890a6e66..b11cbf5416f3dedf5c2e3bca2e0c6d027d3b1aa7 100644 (file)
--- 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
     }
 
index a42f20f0d6a583b495a951a1d50ee3912919b1cc..2702f40ab7ab03373c47ec4fe9e51e3d708fd79e 100644 (file)
@@ -23,6 +23,7 @@ int get_breakindent_win(win_T *wp, char_u *line);
 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);
index 7b58af2491acd544047989ac1a99d2a84ea19975..edfec9a809a10a569599cc0b851c0b8d72b6b514 100644 (file)
@@ -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
index 8d3f2e76f15d6fb2dd2fa60203d40ed477ab40a0..c9ec30111b58cdcdc638ccfbe08e32ab7fd73ada 100644 (file)
@@ -746,6 +746,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    4951,
 /**/
     4950,
 /**/