From 6f23291b8d3e9880536f968621cc52d180f09ddc Mon Sep 17 00:00:00 2001 From: VVKot Date: Sun, 31 Jan 2021 17:53:52 +0000 Subject: vim-patch:8.1.0154: crash with "set smarttab shiftwidth=0 softtabstop=-1" Problem: Crash with "set smarttab shiftwidth=0 softtabstop=-1". Solution: Fall back to using 'tabstop'. (closes vim/vim#3155) https://github.com/vim/vim/commit/c9fe5ab3b093803b6e8d03358ba16aca6b6f0db1 --- src/nvim/edit.c | 6 ++++-- src/nvim/testdir/test_tab.vim | 11 ++++++++++- 2 files changed, 14 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nvim/edit.c b/src/nvim/edit.c index 31bb00a746..90b5cfd8aa 100644 --- a/src/nvim/edit.c +++ b/src/nvim/edit.c @@ -8189,6 +8189,7 @@ static bool ins_bs(int c, int mode, int *inserted_space_p) && (*(get_cursor_pos_ptr() - 1) == TAB || (*(get_cursor_pos_ptr() - 1) == ' ' && (!*inserted_space_p || arrow_used)))))) { + int ts; colnr_T vcol; colnr_T want_vcol; colnr_T start_vcol; @@ -8203,7 +8204,8 @@ static bool ins_bs(int c, int mode, int *inserted_space_p) getvcol(curwin, &curwin->w_cursor, NULL, NULL, &want_vcol); inc_cursor(); if (p_sta && in_indent) { - want_vcol = (want_vcol / curbuf->b_p_sw) * curbuf->b_p_sw; + ts = (int)get_sw_value(curbuf); + want_vcol = (want_vcol / ts) * ts; } else { want_vcol = tabstop_start(want_vcol, get_sts_value(), @@ -8700,7 +8702,7 @@ static bool ins_tab(void) AppendToRedobuff("\t"); if (p_sta && ind) { // insert tab in indent, use 'shiftwidth' - temp = (int)curbuf->b_p_sw; + temp = (int)get_sw_value(curbuf); temp -= get_nolist_virtcol() % temp; } else if (tabstop_count(curbuf->b_p_vsts_array) > 0 || curbuf->b_p_sts != 0) { diff --git a/src/nvim/testdir/test_tab.vim b/src/nvim/testdir/test_tab.vim index 3be30245b9..b8e8dfe062 100644 --- a/src/nvim/testdir/test_tab.vim +++ b/src/nvim/testdir/test_tab.vim @@ -76,6 +76,15 @@ func Test_softtabstop() exe "normal A\x\" call assert_equal("x x", getline(1)) - set sts=0 sw=0 backspace& + call setline(1, 'x') + set sts=-1 sw=0 smarttab + exe "normal I\\" + call assert_equal("\tx", getline(1)) + + call setline(1, 'x') + exe "normal I\\\" + call assert_equal("x", getline(1)) + + set sts=0 sw=0 backspace& nosmarttab bwipe! endfunc -- cgit