0
0
mirror of https://github.com/vim/vim.git synced 2025-09-27 04:14:06 -04:00

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)
This commit is contained in:
Bram Moolenaar
2022-05-14 11:52:23 +01:00
parent 4b93674159
commit de5cf28781
7 changed files with 40 additions and 16 deletions

View 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

View 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;

View 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();

View File

@@ -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
}

View 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);

View 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

View File

@@ -746,6 +746,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
4951,
/**/
4950,
/**/