Skip to content

Commit

Permalink
patch 8.2.4951: smart indenting done when not enabled
Browse files Browse the repository at this point in the history
Problem:    Smart indenting done when not enabled.
Solution:   Check option values before setting can_si. (closes #10420)
  • Loading branch information
brammool committed May 14, 2022
1 parent 4b93674 commit de5cf28
Show file tree
Hide file tree
Showing 7 changed files with 40 additions and 16 deletions.
9 changes: 1 addition & 8 deletions src/change.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/edit.c
Original file line number Diff line number Diff line change
Expand Up @@ -1295,7 +1295,7 @@ edit(
#endif
compl_busy = FALSE;
#ifdef FEAT_SMARTINDENT
can_si = TRUE; // allow smartindenting
can_si = may_do_si(); // allow smartindenting
#endif
break;

Expand Down
18 changes: 17 additions & 1 deletion src/indent.c
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down Expand Up @@ -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();
Expand Down
7 changes: 1 addition & 6 deletions src/ops.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
}

Expand Down
1 change: 1 addition & 0 deletions src/proto/indent.pro
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand Down
17 changes: 17 additions & 0 deletions src/testdir/test_smartindent.vim
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 2 additions & 0 deletions src/version.c
Original file line number Diff line number Diff line change
Expand Up @@ -746,6 +746,8 @@ static char *(features[]) =

static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4951,
/**/
4950,
/**/
Expand Down

0 comments on commit de5cf28

Please sign in to comment.