# HG changeset patch # User Bram Moolenaar # Date 1652526005 -7200 # Node ID 948877671c54af51f49850aab93879e7cc8a3dea # Parent 39fddf7b52c11d84ab91625253290c33bce283d6 patch 8.2.4951: smart indenting done when not enabled Commit: https://github.com/vim/vim/commit/de5cf287812510d2c8ffe66b99cf33c4e1a6e6f1 Author: Bram Moolenaar 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) diff --git a/src/change.c b/src/change.c --- 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 diff --git a/src/edit.c b/src/edit.c --- 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; diff --git a/src/indent.c b/src/indent.c --- 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(); diff --git a/src/ops.c b/src/ops.c --- 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 } diff --git a/src/proto/indent.pro b/src/proto/indent.pro --- 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); diff --git a/src/testdir/test_smartindent.vim b/src/testdir/test_smartindent.vim --- 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\\#", '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\\#", '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 --- 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,