diff options
-rw-r--r-- | src/nvim/change.c | 3 | ||||
-rw-r--r-- | src/nvim/edit.c | 10 | ||||
-rw-r--r-- | src/nvim/indent.c | 5 | ||||
-rw-r--r-- | src/nvim/ops.c | 5 | ||||
-rw-r--r-- | src/nvim/testdir/test_smartindent.vim | 22 |
5 files changed, 33 insertions, 12 deletions
diff --git a/src/nvim/change.c b/src/nvim/change.c index b15e90e0bc..091e9b2830 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -963,8 +963,7 @@ int open_line(int dir, int flags, int second_line_indent, bool *did_do_comment) char_u *p; char_u saved_char = NUL; // init for GCC pos_T *pos; - bool do_si = (!p_paste && curbuf->b_p_si && !curbuf->b_p_cin - && *curbuf->b_p_inde == NUL); + bool do_si = may_do_si(); bool do_cindent; bool no_si = false; // reset did_si afterwards int first_char = NUL; // init for GCC diff --git a/src/nvim/edit.c b/src/nvim/edit.c index c2e61271c7..215024f63a 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -1396,7 +1396,7 @@ static void insert_do_complete(InsertState *s) compl_cont_status = 0; } compl_busy = false; - can_si = true; // allow smartindenting + can_si = may_do_si(); // allow smartindenting } static void insert_do_cindent(InsertState *s) @@ -9344,10 +9344,8 @@ static void ins_try_si(int c) /* * do some very smart indenting when entering '{' or '}' */ - if (((did_si || can_si_back) && c == '{') || (can_si && c == '}')) { - /* - * for '}' set indent equal to indent of line containing matching '{' - */ + if (((did_si || can_si_back) && c == '{') || (can_si && c == '}' && inindent(0))) { + // for '}' set indent equal to indent of line containing matching '{' if (c == '}' && (pos = findmatch(NULL, '{')) != NULL) { old_pos = curwin->w_cursor; /* @@ -9403,7 +9401,7 @@ static void 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(); (void)set_indent(0, SIN_CHANGED); diff --git a/src/nvim/indent.c b/src/nvim/indent.c index 1c4486b67d..faf6f2dc8f 100644 --- a/src/nvim/indent.c +++ b/src/nvim/indent.c @@ -522,6 +522,11 @@ int inindent(int extra) } } +/// @return true if the conditions are OK for smart indenting. +bool may_do_si(void) +{ + return curbuf->b_p_si && !curbuf->b_p_cin && *curbuf->b_p_inde == NUL && !p_paste; +} // Get indent level from 'indentexpr'. int get_expr_indent(void) diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 7b3895333b..1342b10bf8 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -2507,10 +2507,7 @@ int op_change(oparg_T *oap) l = oap->start.col; if (oap->motion_type == kMTLineWise) { l = 0; - if (!p_paste && curbuf->b_p_si - && !curbuf->b_p_cin) { - 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 } // First delete the text in the region. In an empty buffer only need to diff --git a/src/nvim/testdir/test_smartindent.vim b/src/nvim/testdir/test_smartindent.vim index dc0f99e93f..f3650a9ac4 100644 --- a/src/nvim/testdir/test_smartindent.vim +++ b/src/nvim/testdir/test_smartindent.vim @@ -61,4 +61,26 @@ func Test_smartindent_braces() close! 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)) + + call setline(2, '') + call feedkeys("1Go 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 |