Mercurial > vim
changeset 28856:948877671c54 v8.2.4951
patch 8.2.4951: smart indenting done when not enabled
Commit: https://github.com/vim/vim/commit/de5cf287812510d2c8ffe66b99cf33c4e1a6e6f1
Author: Bram Moolenaar <Bram@vim.org>
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)
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sat, 14 May 2022 13:00:05 +0200 |
parents | 39fddf7b52c1 |
children | b1324e0d998a |
files | src/change.c src/edit.c src/indent.c src/ops.c src/proto/indent.pro src/testdir/test_smartindent.vim src/version.c |
diffstat | 7 files changed, 40 insertions(+), 16 deletions(-) [+] |
line wrap: on
line diff
--- 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
--- 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;
--- 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();
--- 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 }
--- 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);
--- 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\<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